page_type: 示例 languages:
- azdeveloper
- csharp
- html
- bicep products:
- ai-services
- azure-blob-storage
- azure-container-apps
- azure-cognitive-search
- azure-openai
- aspnet-core
- blazor
- defender-for-cloud
- azure-monitor
- dotnet-maui urlFragment: azure-search-openai-demo-csharp name: ChatGPT + 企业数据 (csharp) description: 一个 csharp 示例应用程序,使用 OpenAI 和 AI 搜索与您的数据进行对话。
目录
使用 Azure OpenAI 和认知搜索 (.NET) 的 ChatGPT + 企业数据
此示例演示了几种使用检索增强生成模式在您的数据上创建 ChatGPT 类体验的方法。它使用 Azure OpenAI 服务来访问 ChatGPT 模型 (gpt-35-turbo
),并使用 Azure AI 搜索进行数据索引和检索。
这个仓库包含示例数据,因此可以端到端地试用。在此示例应用程序中,我们使用了一家名为 Contoso Electronics 的虚构公司,该体验允许其员工询问关于福利、内部政策以及职位描述和角色的问题。
有关如何构建此应用程序的更多详细信息,请查看:
我们想听取您的意见!您是否对构建或正在构建智能应用程序感兴趣?花几分钟完成这项调查。
功能
- 语音聊天、聊天和问答接口
- 探索各种选项,以帮助用户通过引用、跟踪源内容等评估响应的可信度
- 显示数据准备、提示构建和模型(ChatGPT)与检索器(认知搜索)之间交互的编排的可能方法
- 直接在 UX 中设置,以调整行为和试验选项
应用架构
- 用户界面 - 应用程序的聊天界面是一个 Blazor WebAssembly 应用程序。该界面接受用户查询,向应用程序后端路由请求,并显示生成的响应。
- 后端 - 应用程序后端是一个 ASP.NET Core Minimal API。后端托管 Blazor 静态 web 应用程序并协调不同服务之间的交互。该应用程序中使用的服务包括:
- Azure AI 搜索 - 从存储在 Azure 存储帐户中的数据中索引文档。这使得文档可以使用 矢量搜索 功能进行搜索。
- Azure OpenAI 服务 - 提供大型语言模型以生成响应。 Semantic Kernel 与 Azure OpenAI 服务一起使用,以协调更复杂的 AI 工作流。
入门
账户要求
为了部署和运行此示例,您需要
- Azure 账户 - 如果您是 Azure 新用户,可以获得一个 免费 Azure 账户,以获取一些免费的 Azure 额度以便开始使用。
- Azure 订阅,已启用 Azure OpenAI 服务访问 - 您可以申请访问。您还可以访问认知搜索文档,获取一些免费的 Azure 额度以便开始使用。
- Azure 账户权限 - 您的 Azure 账户必须具有
Microsoft.Authorization/roleAssignments/write
权限,例如 用户访问管理员 或 所有者。
[!WARNING]
默认情况下,此示例将创建一个 Azure 容器应用程序和 Azure AI 搜索资源,这些资源每月都会产生费用,以及一个按文档页面收费的表单识别资源。如果您想避免这些费用,可以通过更改 infra 文件夹下的参数文件,将它们切换为每个的免费版本(尽管有一些限制;例如,每个订阅最多可以有一个免费认知搜索资源,免费表单识别资源仅分析每个文档的前 2 页)。
成本估算
价格因区域和使用情况而异,因此无法预测您的使用的确切成本。但是,您可以尝试以下资源的 Azure 定价计算器:
项目设置
您有几种设置此项目的选项。最简单的开始方法是 GitHub Codespaces,因为它会为您设置所有工具,但如果需要,您也可以本地设置 本地环境。
GitHub Codespaces
您可以使用 GitHub Codespaces 虚拟运行此仓库,这将在您的浏览器中打开基于网络的 VS Code:
VS Code 远程容器
另一个相关选项是 VS Code 远程容器,它将使用 Dev Containers 扩展在您的本地 VS Code 中打开项目:
本地环境
安装以下前提条件:
-
Powershell 7+ (pwsh) - 仅适用于 Windows 用户。
重要
确保您可以从 PowerShell 命令运行pwsh.exe
。如果失败,您可能需要升级 PowerShell。 -
重要
在运行任何azd
预配 / 部署命令之前,确保 Docker 正在运行。
然后,运行以下命令以在本地环境中获取项目:
- 运行
azd auth login
- 克隆存储库或运行
azd init -t azure-search-openai-demo-csharp
- 运行
azd env new azure-search-openai-demo-csharp
部署
从头开始部署
重要
在运行任何azd
预配 / 部署命令之前,确保 Docker 正在运行。
如果您没有任何预先存在的 Azure 服务并希望从头开始进行部署,请执行以下命令。
-
运行
azd up
- 这将预配 Azure 资源并将此示例部署到这些资源,包括基于./data
文件夹中的文件构建搜索索引。-
对于目标位置,目前支持此示例中使用的模型的地区为 East US 2、East US 或 South Central US。有关最新的地区和模型列表,请查看 此处
-
如果您有多个 Azure 订阅的访问权限,系统会提示您选择要使用的订阅。如果您只有一个订阅的访问权限,它将自动选择。
注意
本应用程序使用gpt-35-turbo
模型。在选择部署到的区域时,请确保它们在该区域内可用(即 EastUS)。有关更多信息,请参见 Azure OpenAI 服务文档。 -
-
应用程序成功部署后,您将在控制台中看到一个 URL。点击该 URL 以在浏览器中与应用程序进行交互。
它看起来像这样:
[!注意]
应用程序完全部署可能需要几分钟。
使用现有资源
如果您在 Azure 中有现有资源想要使用,您可以通过设置以下 azd
环境变量来配置 azd
以使用这些资源:
- 运行
azd env set AZURE_OPENAI_SERVICE {现有 OpenAI 服务的名称}
- 运行
azd env set AZURE_OPENAI_RESOURCE_GROUP {OpenAI 服务预配的现有资源组的名称}
- 运行
azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {现有 ChatGPT 部署的名称}
。仅当您的 ChatGPT 部署不是默认的“chat”时才需要。 - 运行
azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {现有嵌入模型部署的名称}
。仅当您的嵌入模型部署不是默认的embedding
时才需要。 - 运行
azd up
[!注意]
您还可以使用现有的搜索和存储账号。请参见./infra/main.parameters.json
以获取传递给azd env set
以配置这些现有资源的环境变量列表。
部署或重新部署存储库的本地克隆
[!重要]
在运行任何azd
预配 / 部署命令之前,确保 Docker 正在运行。
- 运行
azd up
使用 App Spaces 部署您的存储库
[!注意]
确保您的存储库中有 AZD 支持的 bicep 文件并添加一个初始的 GitHub Actions 工作流程文件,该文件可以手动触发(用于初始部署)或在代码更改时自动触发(自动重新部署最新更改) 要使您的存储库兼容 App Spaces,您需要对主 bicep 文件和主参数文件进行更改,以允许 AZD 部署到具有适当标签的现有资源组。
- 添加 AZURE_RESOURCE_GROUP 到主要参数文件,以从 GitHub Actions 工作流程文件中由 App Spaces 设置的环境变量中读取值。
"resourceGroupName": { "value": "${AZURE_RESOURCE_GROUP}" }
- 添加 AZURE_TAGS 到主要参数文件,以从 GitHub Actions 工作流程文件中由 App Spaces 设置的环境变量中读取值。
"tags": { "value": "${AZURE_TAGS}" }
- 在您的主要 bicep 文件中添加对资源组和标签的支持,以读取由 App Spaces 设置的值。
param resourceGroupName string = '' param tags string = ''
- 将由 Azd 设置的默认标签与由 App Spaces 设置的标签组合。在您的主要 bicep 文件中替换 tags initialization 如下 -
var baseTags = { 'azd-env-name': environmentName } var updatedTags = union(empty(tags) ? {} : base64ToJson(tags), baseTags) 确保在为您的 bicep 文件中创建的资源组分配“tags”时使用“updatedTags”,并更新其他资源以使用“baseTags”而不是“tags”。例如 - ```json resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}' location: location tags: updatedTags }
本地运行
[!重要]
在运行任何azd
预配 / 部署命令之前,确保 Docker 正在运行。
-
运行
azd auth login
-
应用程序部署后,设置环境变量
AZURE_KEY_VAULT_ENDPOINT
。您可以在 .azure/YOUR-ENVIRONMENT-NAME/.env 文件或 Azure 门户中找到该值。 -
运行以下 .NET CLI 命令以启动 ASP.NET Core Minimal API 服务器(客户端主机):
dotnet run --project ./app/backend/MinimalApi.csproj --urls=http://localhost:7181/
导航到 http://localhost:7181 并测试应用程序。
使用 .NET MAUI 客户端本地运行
此示例包括一个 .NET MAUI 客户端,将体验包装为一个可以在 Windows/macOS 桌面或 Android 和 iOS 设备上运行的应用程序。这里的 MAUI 客户端使用 Blazor 混合实现,使其可以与网站前端共享大部分代码。
-
打开 app/app-maui.sln 以打开包含 MAUI 客户端的解决方案
-
编辑 app/maui-blazor/MauiProgram.cs,使用后端的 URL 更新
client.BaseAddress
。如果它在 Azure 中运行,请使用上面步骤中的服务后端 URL。如果在本地运行,请使用 http://localhost:7181。
-
设置 MauiBlazor 作为启动项目并运行应用程序
共享环境
如果您想让其他人访问已部署和现有的环境,请运行以下命令。
- 安装 Azure CLI
- 运行
azd init -t azure-search-openai-demo-csharp
- 运行
azd env refresh -e {环境名称}
- 请注意,他们需要 azd 环境名称、订阅 ID 和位置来运行此命令 - 您可以在您的./azure/{env name}/.env
文件中找到这些值。这将用所有在本地运行应用所需的设置填充其 azd 环境的 .env 文件。 - 运行
pwsh ./scripts/roles.ps1
- 这将为用户分配所有必要的角色,以便他们在本地运行应用。如果他们没有在订阅中创建角色的必要权限,那么您可能需要为他们运行此脚本。只需确保在 azd .env 文件中或在活动 shell 中将AZURE_PRINCIPAL_ID
环境变量设置为其 Azure ID,他们可以使用az account show
获取该 ID。
清理资源
运行 azd down
使用应用
- 在 Azure 中:导航到由
azd
部署的 Azure 容器应用。URL 会在azd
完成时打印出来(显示为 "Endpoint"),或者您可以在 Azure 门户中找到它。 - 本地运行时,导航到 http://localhost:7181 以访问客户端应用,导航到 http://localhost:7181/swagger 以访问 Open API 服务器页面。
进入网页应用后:
- 在 语音聊天 页面,选择语音设置对话框并配置文本到语音的偏好设置。
- 您可以通过键入消息来与 Blazor Clippy 互动,或者选择语音输入按钮来使用语音转文本。
- 尝试在 聊天 上下文中进行不同的对话。对于聊天,尝试跟进问题、澄清、请求简单化或详细解答等。
- 探索引用和来源
- 点击 “设置” 图标尝试不同的选项,调整提示等。
启用可选功能
启用 Application Insights
要启用 Application Insights 和每次请求的跟踪,以及错误日志记录,请在运行 azd up
之前设置 AZURE_USE_APPLICATION_INSIGHTS
变量为 true
- 运行
azd env set AZURE_USE_APPLICATION_INSIGHTS true
- 运行
azd up
要查看性能数据,请转到资源组中的 Application Insights 资源,点击 "Investigate -> Performance" 边栏,导航到任何 HTTP 请求以查看时序数据。要检查聊天请求的性能,请使用 "Drill into Samples" 按钮查看所有 API 调用的端到端跟踪:
要查看任何异常和服务器错误,请导航到 "Investigate -> Failures" 边栏,使用筛选工具定位特定异常。您可以在右侧看到 Python 堆栈追踪。
启用身份验证
默认情况下,部署的 Azure 容器应用没有启用身份验证或访问限制,这意味着任何有路由网络访问容器应用的人都可以与您的索引数据聊天。您可以通过遵循 添加容器应用身份验证 教程并将其设置到已部署的容器应用上来要求 Azure Active Directory 身份验证。
然后要限制特定用户或组的访问,您可以通过更改企业应用程序下的 "Assignment Required?" 选项并分配用户/组访问权限,按照 将您的 Azure AD 应用限制为一组用户 的步骤。未授予明确访问权限的用户将收到错误消息 -AADSTS50105:您的管理员已配置应用程序 <app_name> 阻止用户除非明确授予(‘分配’)访问权限。-
启用视觉(多模态)支持
通过 GPT-4o,支持文本和图像作为源内容的增强型检索增强生成。要启用视觉支持,您需要启用 USE_VISION
并在部署时使用 GPT-4o
模型。
[!NOTE] 如果您之前已部署应用,在启用 GPT-4o 支持后需要重新索引支持材料并重新部署应用。这是因为启用 GPT-4o 支持需要向搜索索引添加新字段。
要启用 Azure OpenAI 服务的 GPT-4V 支持,请运行以下命令:
azd env set USE_VISION true
azd env set USE_AOAI true
azd env set AZURE_OPENAI_CHATGPT_MODEL_NAME gpt-4o
azd env set AZURE_OPENAI_RESOURCE_LOCATION westus # 请检查 gpt-4o 的可用性以获取更多详情。
azd up
要启用 OpenAI 的视觉支持,请运行以下命令:
azd env set USE_VISION true
azd env set USE_AOAI false
azd env set OPENAI_CHATGPT_DEPLOYMENT gpt-4o
azd up
要清理之前部署的资源,请运行以下命令:
azd down --purge
azd env set AZD_PREPDOCS_RAN false # 这是为了确保文件使用新字段重新索引。
投产
此示例设计为您自己的生产应用的起点,但在部署到生产环境之前,您应进行彻底的安全性和性能审查。以下是一些需要考虑的事项:
- OpenAI 容量:默认 TPM(每分钟令牌数)设置为 30K。假设每个用户消息/回应为 1K,这相当于大约 30 次每分钟对话。您可以通过将
chatGptDeploymentCapacity
和embeddingDeploymentCapacity
参数更改为您帐户的最大容量来增加容量。您还可以查看 Azure OpenAI studio 中的配额标签以了解您的容量。 - Azure 存储:默认存储帐户使用
Standard_LRS
SKU。要提高弹性,我们建议在生产部署中使用Standard_ZRS
,您可以使用infra/main.bicep
文件中的storage
模块下的sku
属性指定。 - Azure AI 搜索:如果遇到搜索服务容量超出的错误,您可能会发现增加副本数量有帮助,您可以通过更改
infra/core/search/search-services.bicep
文件中的replicaCount
来实现这一点,或者从 Azure 门户手动扩展。 - Azure 容器应用:默认情况下,此应用部署的容器具有 0.5 CPU 核和 1GB 内存。最小副本数量为 1,最大数量为 10。对于此应用,您可以在
infra/core/host/container-app.bicep
文件中设置containerCpuCoreCount
、containerMaxReplicas
、containerMemory
、containerMinReplicas
等值以适应您的需求。您可以使用自动缩放规则或预定缩放规则,并根据负载调整最大/最小值。 - 身份验证:默认情况下,部署的应用是公开访问的。我们建议限制对经过身份验证的用户的访问。请参阅上文 启用身份验证 了解如何启用身份验证。
- 网络:我们建议在虚拟网络内进行部署。如果应用仅供内部企业使用,请使用私有 DNS 区域。还可以考虑使用 Azure API 管理(APIM)进行防火墙和其他形式的保护。更多详情请参阅 Azure OpenAI 登陆区参考架构。
- 负载测试:我们建议进行预期用户数量的负载测试。
资源
- 利用 ChatGPT 革新您的企业数据:Azure OpenAI 和认知搜索的下一代应用
- Azure AI 搜索
- Azure OpenAI 服务
Azure.AI.OpenAI
NuGet 包- 原始 Blazor 应用
[!NOTE]
本演示中使用的 PDF 文档包含使用语言模型(Azure OpenAI 服务)生成的信息。此文档中包含的信息仅用于演示目的,并不反映微软的意见或信念。微软不对本文件中的信息的完整性、准确性、可靠性、适用性或可用性作出任何形式的陈述或担保,无论是明示还是暗示。微软保留所有权利。
常见问题
问题:既然 Azure AI 搜索支持搜索大型文档,为什么我们还需要将 PDF 分成多个部分?
回答:分块处理可以让我们在发送信息到 OpenAI 时控制在 token 限制范围内。通过将内容分块,我们可以轻松找到可以注入 OpenAI 的文本片段。我们使用的分块方法采用了滑动窗口技术,使得一个片段结束的句子会成为下一个片段的开始。这可以减少丢失文本上下文的可能性。