该示例演示了一些使用检索增强生成模式在您自己的数据上创建类似于Chatgpt的体验的方法。它使用Azure OpenAI服务访问ChatGPT模型(GPT-35-Turbo),以及Azure AI搜索数据索引和检索。
存储库包含示例数据,因此可以尝试尽头。在此示例应用程序中,我们使用了一个名为Contoso Real Estate的虚构公司,并且经验使客户可以向有关其产品使用的支持问题提出支持。示例数据包括一组描述其服务条款,隐私政策和支持指南的文档。
该应用程序由多个组件制成,包括:
观看该应用程序的视频概述
重要:为了部署和运行此样本,您需要:
Microsoft.Authorization/roleAssignments/write
Permissions,例如基于角色的访问控制管理员,用户访问管理员或所有者。如果您没有订阅级别的权限,则必须使用RBAC授予您现有资源组并部署到该现有组的RBAC。Microsoft.Resources/deployments/write
权限。 定价可能会有所不同。确切的成本无法估计。您可以尝试以下资源的Azure定价计算器。
azd down --purge
。
有多种方法可以成功设置此项目。
最简单的入门方法是使用github代码空间,可为您设置所有工具。在下面阅读更多。另外,您可以设置本地环境,以限制下面的说明。
您可以通过使用github codespese实际上运行此存储库,该码将在浏览器中打开基于Web的VS代码:
代码空间的类似选项是VS代码远程容器,它将使用DEV容器扩展名中的本地VS代码实例打开该项目:
pwsh.exe
。如果失败,您可能需要升级PowerShell。然后获取项目代码:
azd auth login
azd init -t azure-search-openai-javascript
执行以下命令,如果您没有任何先前存在的Azure服务,并且希望从新的部署开始。
azd up
这将提供Azure资源,并将此示例部署到这些资源,包括根据./data
文件夹中的文件构建搜索索引。eastus2
。您可以使用azd env set AZURE_OPENAI_RESOURCE_GROUP_LOCATION {location}
其他位置。目前,仅接受一个简短的位置列表。该位置列表基于OpenAI模型可用性表,随着可用性的变化,可能会过时。eastus2
。您可以使用azd env set AZURE_WEBAPP_LOCATION {location}
设置其他位置。目前,仅接受一个简短的位置列表。请注意,静态Web应用程序是一项全局服务,您选择的位置只会影响该示例中未使用的托管功能应用程序。看起来如下:
注意:完全部署应用程序可能需要15分钟以上。
如果您已经拥有现有的Azure资源,则可以通过设置azd
环境值重复使用这些资源。
azd env set AZURE_RESOURCE_GROUP {Name of existing resource group}
azd env set AZURE_LOCATION {Location of existing resource group}
azd env set AZURE_OPENAI_SERVICE {Name of existing OpenAI service}
azd env set AZURE_OPENAI_RESOURCE_GROUP {Name of existing resource group that OpenAI service is provisioned to}
azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {Name of existing ChatGPT deployment}
。仅当您的chatgpt部署不是默认的“聊天”时才需要。azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {Name of existing GPT embedding deployment}
。仅当您的嵌入部署不是默认的“嵌入”时才需要。 azd env set AZURE_SEARCH_SERVICE {Name of existing Azure AI Search service}
azd env set AZURE_SEARCH_SERVICE_RESOURCE_GROUP {Name of existing resource group with ACS service}
azd up
步骤选择的位置不同,则运行azd env set AZURE_SEARCH_SERVICE_LOCATION {Location of existing service}
azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU}
。自由层无法正常工作,因为它不支持托管身份。 (请参阅其他可能的值) 您也可以使用现有的存储帐户。有关环境变量的列表,请参见./infra/main.parameters.json
将其传递到azd env set
以配置这些现有资源。
现在,您可以按照从头开始部署的步骤来运行azd up
。这既可以提供资源并部署代码。
如果您仅更改了app
文件夹中的后端/前端代码,则无需重新提供Azure资源。您可以运行:
azd deploy
如果您更改了基础架构文件( infra
文件夹或azure.yaml
),则需要重新提供Azure资源。您可以通过运行来做到这一点:
azd up
为了让其他人访问完全部署和现有的环境,您或他们可以遵循以下步骤:
azd init -t azure-search-openai-javascript
或克隆此存储库。azd env refresh -e {environment name}
他们将需要AZD环境名称,订阅ID和位置来运行此命令。您可以在.azure/{env name}/.env
文件中找到这些值。这将填充其AZD环境的.env
文件,并在本地运行该应用所需的所有设置。AZURE_PRINCIPAL_ID
设置为.env
文件或活动壳中的Azure ID,将其通过az ad signed-in-user show
可以获得。./scripts/roles.ps1
或./scripts/roles.sh
将所有必要的角色分配给用户。如果他们没有必要的权限来在订阅中创建角色,那么您可能需要为他们运行此脚本。脚本运行后,他们应该能够在本地运行该应用程序。 清理此示例创建的所有资源:
azd down --purge
y
y
资源组和所有资源将被删除。
默认情况下,部署的Azure Web应用程序将不具有身份验证或访问限制,这意味着任何具有可路由网络访问Web应用程序的人都可以与您的索引数据聊天。您可以通过遵循添加应用程序身份验证教程并根据已部署的Web应用程序进行设置,需要对Azure Entra ID进行身份验证。
然后,要限制对特定用户或组集的访问,您可以通过更改“所需的分配?”来遵循从限制Azure Entra应用程序到一组用户的步骤。在企业应用程序下的选项,然后分配用户/组访问。未授予明确访问的用户将接收错误消息-AADSTS50105:您的管理员已将应用程序<app_name>配置为阻止用户,除非用户被专门授予(“分配”)访问该应用程序。-
我们建议部署其他安全机制。适用时,请考虑设置VNET或设置代理策略。
默认情况下,部署的搜索API将仅允许与部署的Web应用程序Origin相同的请求。要启用CORS的CORS,以托管不同来源的前端,请运行:
azd env set ALLOWED_ORIGIN https://<your-domain.com>
azd up
成功运行azd up
命令后,您只能在本地运行。
azd auth login
azd env get-values > .env
以获取应用程序的环境变量az login
npm start
或运行“ VS代码任务:启动应用程序”以本地启动项目。 进入Web应用程序:
搜索API服务实现了AI聊天应用程序的HTTP协议。它可以与实现相同协议的任何服务进行交换,例如此存储库中的Python后端客户端,而不是此存储库中介绍的Node.js实现。
为此,请执行以下步骤:
azd env get-values | grep WEBAPP_URI
获取URL。http://localhost:5173
。https://<your_codespace_base_url>-5173.app.github.dev
。azd env set ALLOWED_ORIGIN <your_frontend_url>
。azd env get-values | grep BACKEND_URI
。azd env set BACKEND_URI <your_backend_url>
。如果要使用已部署的Web应用程序,请运行azd up
到Redeploy。
如果要在计算机上或代码空间上使用本地Web应用程序,请运行:
# Export the environment variable.
# The syntax may be different depending on your shell or if you're using Windows.
export BACKEND_URI= < your_backend_url >
# Start the app
npm start --workspace=webapp
该示例由两个应用程序组成:后端服务和API,部署到Azure容器应用程序以及部署到Azure static Web应用程序的前端应用程序。默认情况下,部署的Azure容器应用程序将不具有身份验证或访问限制,这意味着任何具有可路由网络访问该容器应用程序的人都可以与您的索引数据聊天。您可以通过遵循添加容器应用程序身份验证教程并根据已部署的Azure容器应用程序进行设置,需要对Azure Entra ID进行身份验证。
为了限制对特定用户或组集的访问,您可以通过更改“所需的分配?”来遵循从限制Azure Entra应用程序到一组用户的步骤。在企业应用程序下的选项,然后分配用户/组访问。未授予明确访问的用户将接收错误消息-AADSTS50105:您的管理员已将应用程序<app_name>配置为阻止用户,除非用户被专门授予(“分配”)访问该应用程序。-
该样本旨在成为您自己的生产应用程序的起点,但是在部署到生产之前,您应该对安全性和性能进行详尽的审查。以下是要考虑的事情:
infra/main.bicep
中的chatGptDeploymentCapacity
和embeddingDeploymentCapacity
参数来增加容量。您还可以在Azure Openai Studio中查看“配额”选项卡,以了解您的容量。Standard_LRS
sku。为了提高您的弹性,我们建议将Standard_ZRS
用于生产部署,您可以在infra/main.bicep
中使用的storage
模块下使用sku
属性指定。Standard
SKU,该选项为您提供1000个免费查询。假设您的应用程序将遇到1000多个问题,则应将semanticSearch
更改为“标准”,或者完全禁用请求选项中的语义搜索。如果您看到有关超出搜索服务能力的错误,则可能会发现通过更改infra/core/search/search-services.bicep
或手动从Azure Portal中缩放的replicaCount
来增加复制品的数量。由于令牌限制,分块使我们能够限制发送给OpenAI的信息量。通过分解内容,它使我们可以轻松找到可以注入OpenAi的潜在文本块。分块的方法我们使用了一个文本的滑动窗口,以至于结束一个块的句子将开始下一个。这使我们可以减少失去文本上下文的机会。
要上传更多文档,请将它们放入数据/文件夹中,然后运行./scripts/index-data.sh
或./scripts/index-data.ps1
。
此用例的另一个流行存储库在这里:https://github.com/microsoft/sample-app-aoai-chatgpt/
该存储库的设计旨在使用Azure Openai Studio和Azure Portal进行设置,供客户使用。它还包括为想要从头开始部署它的人们的azd
支持。
主要区别:
功能比较:
特征 | Azure-Search-Openai-JavaScript | 样品应用程序 - AOAI-CHATGPT |
---|---|---|
抹布方法 | 多种方法 | 仅通过聊天completion api data_sources |
向量支持 | ✅是的 | ✅是的 |
数据摄入 | ✅是(MD) | ✅是的(PDF,TXT,MD,HTML) |
持续的聊天历史 | 否(仅浏览器选项卡) | ✅是的,在cosmosdb中 |
技术比较:
技术 | Azure-Search-Openai-JavaScript | 样品应用程序 - AOAI-CHATGPT |
---|---|---|
前端 | 反应/点亮 | 反应 |
后端 | node.js(fastify) | python(烧瓶) |
向量DB | Azure AI搜索 | Azure AI搜索 |
部署 | Azure开发人员CLI(AZD) | Azure Portal,AZ,AZD |
运行以下命令:
azd env set AZURE_OPENAI_CHATGPT_MODEL gpt-4
您可能还需要根据允许您的帐户的tpm数量调整infra/main.bicep
文件中的容量。
聊天选项卡使用聊天读取retrieve-read.ts中编程的方法。 “询问”选项卡使用在ask-retrieve-then-read.ts中编程的方法。 [使用代理](https://github.com/azure-samples/azure-search-openai-javascript/blob/main/packages/search/src/src/src/src/src/src/appleach-read-read-retriev-redriev--read.ts-)也有另一种可用的方法。
azd up
命令来自Azure开发人员CLI,并照顾既要配置Azure资源,又要将代码部署到所选的Azure主机。
azd up
命令使用azure.yaml
文件与infra/
文件夹中的基础架构.bicep
文件相结合。该项目的azure.yaml
文件为预包装步骤和后期步骤声明了几个“钩子”。 up
命令首先运行prepackage
挂钩,该挂钩安装节点依赖关系并构建基于react.js的JavaScript文件。然后,它将所有代码(前端和后端服务)都包装到邮政编码中,以稍后将其部署。
接下来,它根据main.bicep
和main.parameters.json
提供资源。那时,由于OpenAI资源位置没有默认值,因此它要求您从可用区域的简短列表中选择一个位置。然后,它将向Azure发送请求,以提供所有必需的资源。有了所有的准备,它将运行postprovision
挂钩来处理本地数据并将其添加到Azure AI搜索索引中。
最后,它查看azure.yaml
确定Azure主机(在这种情况下,在容器应用程序和静态Web应用程序)中,并将ZIP上传到Azure App Service。 azd up
命令现已完成,但是该应用程序在初始部署后可能需要几分钟才能工作。
相关命令是azd provision
规定(如果更改了Infra文件),而azd deploy
仅用于部署更新的应用程序代码。
这是最常见的故障情况和解决方案:
订阅( AZURE_SUBSCRIPTION_ID
)无法访问Azure OpenAI服务。请确保AZURE_SUBSCRIPTION_ID
匹配OpenAI访问请求过程中指定的ID。
您正在尝试在未启用Azure OpenAI的区域中创建资源(例如East US 2而不是East US),或者未启用您尝试使用的模型。请参阅模型可用性的矩阵。
您超出了每个区域的配额,通常是每个区域的资源数量。请参阅有关配额和限制的本文。
您将获得“不允许使用相同的资源名称”冲突。这可能是因为您多次运行样本并删除了您每次创建的资源,但却忘记了清除它们。除非您从软删除中清除,否则Azure可以将资源保存48小时。请参阅有关清除资源的文章。
在运行azd up
并访问该网站后,您会在浏览器中看到一个“ 404”。等待10分钟,然后重试,因为它可能仍在开始。然后尝试运行azd deploy
并再次等待。如果您仍然在已部署的应用程序中遇到错误,请咨询这些提示,以调试应用程序服务应用程序部署,并在错误日志无法帮助您解决问题的情况下提交问题。
您会遇到错误401 Principal does not have access to API/Operation
。这可能是因为您的环境变量包括AZURE_TENANT_ID
, AZURE_CLIENT_ID
和AZURE_CLIENT_SECRET
。您应该授予相关服务本金的权限,或者从环境中删除这些变量,以确保正常访问。有关更多详细信息,请参阅Azure Identity SDK。
注意:此演示中使用的文档包含使用语言模型(Azure OpenAI服务)生成的信息。这些文档中包含的信息仅用于演示目的,并不反映微软的观点或信念。微软对本文档中所包含的信息的完整性,准确性,可靠性,适用性或可用性不做任何形式或暗示的保证。保留给微软的所有权利。