PostgreSQL 上的 RAG
该项目创建了一个基于网络的聊天应用程序,后端 API 可以使用 OpenAI 聊天模型来回答 PostgreSQL 数据库表中项目的问题。前端使用 React 和 FluentUI 构建,后端使用 Python 和 FastAPI 编写。
该项目设计用于使用 Azure Developer CLI 部署到 Azure,将应用程序托管在 Azure 容器应用程序上,将数据库托管在 Azure PostgreSQL Flexible Server 上,并将模型托管在 Azure OpenAI 上。
功能
该项目提供以下功能:
- 针对 PostgreSQL 数据库表的混合搜索,使用 pgvector 扩展 进行向量搜索,并结合 全文搜索,使用 RRF (Reciprocal Rank Fusion) 结合结果。
- OpenAI 功能调用,可选择将用户查询转换为查询过滤条件,例如将“价格低于 $30 的攀岩装备?”转换为“WHERE price < 30”。
- 使用 OpenAI 嵌入 API 将用户查询转换为向量。
入门
您有几个选择来开始使用此模板。 最快的方法是使用 GitHub Codespaces,因为它会为您设置所有工具,但是您也可以在本地设置它。
GitHub Codespaces
您可以使用 GitHub Codespaces 虚拟运行此模板。该按钮将在您的浏览器中打开一个基于 Web 的 VS Code 实例:
-
打开模板(这可能需要几分钟):
-
打开终端窗口
-
继续进行部署步骤
VS Code Dev Containers
另一个相关选项是 VS Code Dev Containers,它将使用 Dev Containers 扩展在您的本地 VS Code 中打开项目:
-
启动 Docker Desktop(如果尚未安装,请安装)
-
打开项目:
-
在打开的 VS Code 窗口中,一旦出现项目文件(这可能需要几分钟),打开终端窗口。
-
继续进行部署步骤
本地环境
-
确保安装了以下工具:
-
下载项目代码:
azd init -t rag-postgres-openai-python
-
打开项目文件夹
-
安装所需的 Python 包和后端应用程序:
pip install -r requirements-dev.txt pip install -e src/backend
-
继续进行部署步骤
部署
一旦您在 Codespaces、 Dev Containers 或 本地 打开了项目,您可以将其部署到 Azure。
-
登录您的 Azure 账户:
azd auth login
如果该命令有任何问题,您还可以尝试
azd auth login --use-device-code
。 -
创建一个新的 azd 环境:
azd env new
这将在您的项目中创建一个
.azure/
文件夹来存储此部署的配置。如果需要,您可以有多个 azd 环境。 -
(可选)如果您想要自定义部署以使用现有的 Azure 资源,您可以现在设置这些值。
-
配置资源并部署代码:
azd up
您将被要求选择两个位置,首先是大部分资源(容器应用程序、PostgreSQL)的区域,然后是专门用于 Azure OpenAI 模型的区域。该项目使用 gpt-3.5-turbo(版本 0125)和 text-embedding-ada-002 模型,这些模型可能不是在所有 Azure 区域都可用。检查最新的区域可用性并选择相应的区域。
本地开发
设置环境文件
由于本地应用程序使用 OpenAI 模型,您应该首先部署它以获得最佳体验。
-
将
.env.sample
副本重命名为.env
文件。 -
要使用 Azure OpenAI,将
OPENAI_CHAT_HOST
和OPENAI_EMBED_HOST
设置为 "azure"。然后根据部署的值填写AZURE_OPENAI_ENDPOINT
和AZURE_OPENAI_CHAT_DEPLOYMENT
的值。您可以使用以下命令显示这些值:azd env get-values
-
要使用 OpenAI.com OpenAI,将
OPENAI_CHAT_HOST
和OPENAI_EMBED_HOST
设置为 "openai"。然后填写OPENAICOM_KEY
的值。 -
要使用 Ollama,将
OPENAI_CHAT_HOST
设置为 "ollama"。然后根据您的本地设置和模型更新OLLAMA_ENDPOINT
和OLLAMA_CHAT_MODEL
的值。请注意,大多数 Ollama 模型与“高级流程”不兼容,因为需要函数调用支持,因此您需要在 UI 的 开发者设置 中禁用该功能。此外,数据库行是使用默认的 OpenAI 嵌入模型嵌入的,因此您无法使用 Ollama 嵌入模型搜索它们。您可以选择将OPENAI_EMBED_HOST
设置为 "azure" 或 "openai",或在 开发者设置 中关闭向量搜索。
运行前端和后端
-
运行这些命令将网络应用程序安装为本地包(名为
fastapi_app
),设置本地数据库,并用测试数据填充:python3 -m pip install -e src/backend python ./src/backend/fastapi_app/setup_postgres_database.py python ./src/backend/fastapi_app/setup_postgres_seeddata.py
-
构建前端:
cd src/frontend npm install npm run build cd ../../
在运行后端之前必须先构建静态资产,因为后端从
src/static
目录提供静态文件。 -
运行 FastAPI 后端(具有热重载功能)。这应该从项目的根目录运行:
python3 -m uvicorn fastapi_app:create_app --factory --reload
或者您可以在 VS Code 的运行与调试菜单中运行“后端”。
-
运行前端(具有热重载功能):
cd src/frontend npm run dev
或者您可以在 VS Code 的运行与调试菜单中运行“前端”或“前端与后端”。
-
在浏览器中打开
http://localhost:5173/
,您将看到前端。
成本
定价可能因地区和使用情况而异。无法估算准确的成本。 您可以尝试使用 Azure 定价计算器 来为以下资源估算成本:
- Azure 容器应用程序:按需付费层。成本基于使用的 vCPU 和内存。定价
- Azure OpenAI:标准层,GPT 和 Ada 模型。每 1K 令牌使用定价,至少每个问题使用 1K 令牌。定价
- Azure PostgreSQL Flexible Server:可突发层,1 个 CPU 核心,32GB 存储。按小时计费。定价
- Azure Monitor:按需付费层。成本基于摄取的数据。定价
安全指南
此模板使用 托管标识 来对使用的 Azure 服务(Azure OpenAI、Azure PostgreSQL Flexible Server)进行身份验证。
此外,我们添加了一个 GitHub Action,它会扫描基础设施即代码文件并生成包含任何检测到问题的报告。为了确保您自己的存储库中继续保持最佳实践,我们建议任何基于我们的模板创建解决方案的人确保启用 GitHub 密钥扫描 设置。
指南
更多文档可在 docs/
文件夹中找到:
如有任何问题或问题,请在问题跟踪器中发布。