該示例演示了一些使用檢索增強生成模式在您自己的數據上創建類似於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 loginazd 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 --purgeyy資源組和所有資源將被刪除。
默認情況下,部署的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 loginazd env get-values > .env以獲取應用程序的環境變量az loginnpm 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服務)生成的信息。這些文檔中包含的信息僅用於演示目的,並不反映微軟的觀點或信念。微軟對本文檔中所包含的信息的完整性,準確性,可靠性,適用性或可用性不做任何形式或暗示的保證。保留給微軟的所有權利。