快速入門:使用您自己的資料與 Azure OpenAI 模型聊天

在本快速入門中,您可以使用自己的資料搭配 Azure OpenAI 模型。 將 Azure OpenAI 的模型用在您的資料上,可提供強大的交談 AI 平台,讓您更快速且更精確進行通訊。

必要條件

下列資源:

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

聊天遊樂場

透過聊天遊樂場以無程式碼方法開始探索 Azure OpenAI 功能。 這只是一個文字方塊,您可以在其中提交提示來產生完成。 您可以透過此頁面,快速逐一查看並實驗各種功能。

Azure OpenAI Studio 遊樂場頁面的螢幕擷取畫面,其中已醒目提示各個區段。

遊樂場為您提供了量身打造聊天體驗的選項。 在右側,您可以選取 [部署],以判斷哪個模型會使用索引中的搜尋結果來產生回應。 您可以選擇過去訊息的數目,以作為未來所產生回應的交談記錄。 交談記錄提供用以產生相關回應的內容,但也會取用權杖使用方式。 輸入語彙基元進度指示器會追蹤您提交問題的語彙基元計數。

左側 [進階設定]執行階段參數,可讓您控制從資料擷取和搜尋的相關資訊。 良好的使用案例是當您想要確定只會根據您的資料產生回應,或您發現模型無法根據資料上存在的資訊產生回應時。

  • 嚴謹度會根據系統的相似度分數來決定篩選搜尋文件的積極度。 將嚴謹度設定為 5 表示系統會積極篩選出文件,並套用非常高的相似度閾值。 在這種情況下,語意搜尋會很有幫助,因為排名模型能更好地推斷查詢的意圖。 如果嚴格度降低,產生的答案會更詳細,但也可能包含索引中未出現的資訊。 依預設,這會設定為 3。

  • 擷取的文件是一個整數,可以設定為 3、5、10 或 20,並控制提供給大型語言模型的文件區塊數目,以制定最終回應。 根據預設,這項設定為 5。

  • 啟用 [限制對您資料的回應] 時,模型會嘗試只依賴您的文件進行回應。 根據預設,這會設定為 true。

進階設定的螢幕擷取畫面。

傳送第一個查詢。 聊天模型在問答練習中表現最佳。 例如,「我有哪些可用的健康情況計劃?」或「什麼是健康情況附加選項?」。

需要資料分析的查詢可能會失敗,例如「最受歡迎的健康情況計劃是哪個?」。 需要所有資料相關資訊的查詢也可能會失敗,例如「我上傳了多少份文件?」。 請記住,搜尋引擎會尋找包含與查詢完全相同或類似字詞、片語或建構的區塊。 雖然模型可能理解了問題,但如果搜尋結果是來自資料集的區塊,那麼這些搜尋結果也不適合回答這類問題。

聊天也會受到回應中傳回文件 (區塊) 數量的限制 (在 Azure OpenAI Studio 遊樂場中限制為 3 到 20)。 您可以想象到,如果是提出有關「所有標題」這樣的問題,則需要完整掃描整個向量存放區。

部署模型

當您對 Azure OpenAI Studio 中的體驗感到滿意之後,您可以選取 [部署至] 按鈕,直接從 Studio 部署 Web 應用程式。

顯示 Azure OpenAI Studio 中模型部署按鈕的螢幕擷取畫面。

這可讓您選擇將模型部署至獨立的 Web 應用程式,或部署為 Copilot Studio (預覽) 中的一個副手 (若您在模型上使用自己的資料)。

例如,如果您選擇部署 Web 應用程式:

第一次部署 Web 應用程式時,您應該選取 [建立新的 Web 應用程式]。 選擇應用程式的名稱,其會成為應用程式 URL 的一部分。 例如: https://<appname>.azurewebsites.net

選取已發佈應用程式的訂用帳戶、資源群組、位置和定價方案。 若要更新現有的應用程式,請選取 [發佈到現有的 Web 應用程式],然後從下拉式功能表中選擇先前應用程式的名稱。

如果您選擇部署 Web 應用程式,請參閱使用方式的重要考量

必要條件

下列資源:

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

建立新的 .NET Core 應用程式

在主控台視窗中 (例如 cmd、PowerShell 或 Bash),使用 dotnet new 命令建立名為 azure-openai-quickstart 的新主控台應用程式。 此命令會建立簡單的 "Hello World" 專案,內含單一 C# 來源檔案:Program.cs

dotnet new console -n azure-openai-quickstart

將目錄變更為新建立的應用程式資料夾。 您可以使用下列命令來建置應用程式:

dotnet build

建置輸出應該不會有警告或錯誤。

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

使用下列項目安裝 OpenAI .NET 用戶端程式庫:

dotnet add package Azure.AI.OpenAI --prerelease

從專案目錄中,開啟 Program.cs 檔案並將其內容取代為以下程式碼:

沒有回應串流

using Azure;
using Azure.AI.OpenAI;
using Azure.AI.OpenAI.Chat;
using OpenAI.Chat;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");

#pragma warning disable AOAI001
AzureOpenAIClient azureClient = new(
    new Uri(azureOpenAIEndpoint),
    new AzureKeyCredential(azureOpenAIKey));
ChatClient chatClient = azureClient.GetChatClient(deploymentName);

ChatCompletionOptions options = new();
options.AddDataSource(new AzureSearchChatDataSource()
{
    Endpoint = new Uri(searchEndpoint),
    IndexName = searchIndex,
    Authentication = DataSourceAuthentication.FromApiKey(searchKey),
});

ChatCompletion completion = chatClient.CompleteChat(
    [
        new UserChatMessage("What are my available health plans?"),
    ], options);

Console.WriteLine(completion.Content[0].Text);

AzureChatMessageContext onYourDataContext = completion.GetAzureMessageContext();

if (onYourDataContext?.Intent is not null)
{
    Console.WriteLine($"Intent: {onYourDataContext.Intent}");
}
foreach (AzureChatCitation citation in onYourDataContext?.Citations ?? [])
{
    Console.WriteLine($"Citation: {citation.Content}");
}

重要

在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

dotnet run program.cs

輸出

Contoso Electronics offers two health plans: Northwind Health Plus and Northwind Standard [doc1]. Northwind Health Plus is a comprehensive plan that provides coverage for medical, vision, and dental services, prescription drug coverage, mental health and substance abuse coverage, and coverage for preventive care services. It also offers coverage for emergency services, both in-network and out-of-network. On the other hand, Northwind Standard is a basic plan that provides coverage for medical, vision, and dental services, prescription drug coverage, and coverage for preventive care services. However, it does not offer coverage for emergency services, mental health and substance abuse coverage, or out-of-network services [doc1].

Intent: ["What are the available health plans?", "List of health plans available", "Health insurance options", "Types of health plans offered"]

Citation:
Contoso Electronics plan and benefit packages

Thank you for your interest in the Contoso electronics plan and benefit packages. Use this document to

learn more about the various options available to you...// Omitted for brevity

這會等到模型產生整個回應,才會列印結果。 或者,如果您想要以非同步方式串流回應並列印結果,您可以將 Program.cs 的內容取代為下一個範例中的程式碼。

使用串流進行非同步處理

using Azure;
using Azure.AI.OpenAI;
using Azure.AI.OpenAI.Chat;
using OpenAI.Chat;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");

#pragma warning disable AOAI001

AzureOpenAIClient azureClient = new(
    new Uri(azureOpenAIEndpoint),
    new AzureKeyCredential(azureOpenAIKey));
ChatClient chatClient = azureClient.GetChatClient(deploymentName);

ChatCompletionOptions options = new();
options.AddDataSource(new AzureSearchChatDataSource()
{
    Endpoint = new Uri(searchEndpoint),
    IndexName = searchIndex,
    Authentication = DataSourceAuthentication.FromApiKey(searchKey),
});

var chatUpdates = chatClient.CompleteChatStreamingAsync(
    [
        new UserChatMessage("What are my available health plans?"),
    ], options);

AzureChatMessageContext onYourDataContext = null;
await foreach (var chatUpdate in chatUpdates)
{
    if (chatUpdate.Role.HasValue)
    {
        Console.WriteLine($"{chatUpdate.Role}: ");
    }

    foreach (var contentPart in chatUpdate.ContentUpdate)
    {
        Console.Write(contentPart.Text);
    }

    if (onYourDataContext == null)
    {
        onYourDataContext = chatUpdate.GetAzureMessageContext();
    }
}

Console.WriteLine();
if (onYourDataContext?.Intent is not null)
{
    Console.WriteLine($"Intent: {onYourDataContext.Intent}");
}
foreach (AzureChatCitation citation in onYourDataContext?.Citations ?? [])
{
    Console.Write($"Citation: {citation.Content}");
}

原始程式碼 (英文) | 原始程式碼 (英文) | 範例 (英文)

必要條件

下列資源:

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 如需詳細資料,請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)。

變數名稱
AZURE_OPENAI_ENDPOINT 您可以在從 Azure 入口網站查看您的 Azure OpenAI 資源時,在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resource.openai.azure.com
AZURE_OPENAI_API_KEY 您可以在從 Azure 入口網站查看您的 Azure OpenAI 資源時,在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPEN_AI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 您可以在 Azure 入口網站中的 [資源管理] > [部署] 底下找到此值,也可以在 Azure AI Studio 的 [管理] > [部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 您可以在從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 您可以在從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求

注意

Spring AI 會將模型名稱預設為 gpt-35-turbo。 只有在您使用了不同名稱部署模型時,才需要提供 SPRING_AI_AZURE_OPENAI_MODEL 值。

export SPRING_AI_AZURE_OPENAI_ENDPOINT=REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
export SPRING_AI_AZURE_OPENAI_API_KEY=REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_ENDPOINT=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_API_KEY=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_INDEX=REPLACE_WITH_YOUR_INDEX_NAME_HERE
export SPRING_AI_AZURE_OPENAI_MODEL=REPLACE_WITH_YOUR_MODEL_NAME_HERE

建立新的 Spring 應用程式

Spring AI 目前不支援允許 Azure AI 查詢封裝擷取擴增產生 (RAG) 方法,並隱藏使用者詳細資料的 AzureCognitiveSearchChatExtensionConfiguration 選項。 作為替代方法,您仍然可以在應用程式中直接叫用 RAG 方法來查詢 Azure AI Search 索引中的資料,並使用所擷取的文件來增強您的查詢。

Spring AI 支援 VectorStore 抽象概念,而且您可以將 Azure AI 搜尋封裝在 Spring AI VectorStore 實作中,以便查詢自訂資料。 下列專案會實作 Azure AI 搜尋服務所支援的自訂 VectorStore,並直接執行 RAG 作業。

在 Bash 視窗中,為您的應用程式建立新目錄,並瀏覽至其中。

mkdir ai-custom-data-demo && cd ai-custom-data-demo

從您的工作目錄執行 spring init 命令。 此命令會為您的 Spring 專案建立標準目錄結構 (包括主要 JAVA 類別來源檔案),以及用於管理 Maven 型專案的 pom.xml 檔案。

spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x

產生的檔案與資料夾類似下列結構:

ai-custom-data-demo/
|-- pom.xml
|-- mvn
|-- mvn.cmd
|-- HELP.md
|-- src/
    |-- main/
    |   |-- resources/
    |   |   |-- application.properties
    |   |-- java/
    |       |-- com/
    |           |-- example/
    |               |-- aicustomdatademo/
    |                   |-- AiCustomDataApplication.java
    |-- test/
        |-- java/
            |-- com/
                |-- example/
                    |-- aicustomdatademo/
                        |-- AiCustomDataApplicationTests.java

編輯 Spring 應用程式

  1. 編輯 pom.xml 檔案。

    從專案目錄的根目錄中,以慣用的編輯器或 IDE 開啟 pom.xml 檔案,並將此檔案覆寫為下列內容:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>ai-custom-data-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>AICustomData</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.experimental.ai</groupId>
                <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
                <version>0.7.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.6.0-beta.10</version>
                <exclusions>
                    <!-- exclude this to avoid changing the default serializer and the null-value behavior -->
                    <exclusion>
                        <groupId>com.azure</groupId>
                        <artifactId>azure-core-serializer-json-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    </project>
    
  2. src/main/java/com/example/aicustomdatademo 資料夾中,以慣用的編輯器或 IDE 開啟 AiCustomDataApplication.java,並貼入下列程式碼:

    package com.example.aicustomdatademo;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    import org.springframework.ai.client.AiClient;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingClient;
    import org.springframework.ai.prompt.Prompt;
    import org.springframework.ai.prompt.SystemPromptTemplate;
    import org.springframework.ai.prompt.messages.MessageType;
    import org.springframework.ai.prompt.messages.UserMessage;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Context;
    import com.azure.search.documents.SearchClient;
    import com.azure.search.documents.SearchClientBuilder;
    import com.azure.search.documents.models.IndexingResult;
    import com.azure.search.documents.models.SearchOptions;
    import com.azure.search.documents.models.RawVectorQuery;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.extern.jackson.Jacksonized;
    
    @SpringBootApplication
    public class AiCustomDataApplication implements CommandLineRunner
    {
        private static final String ROLE_INFO_KEY = "role";
    
        private static final String template = """
                You are a helpful assistant. Use the information from the DOCUMENTS section to augment answers.
    
                DOCUMENTS:
                {documents}
                """;
    
        @Value("${spring.ai.azure.cognitive-search.endpoint}")
        private String acsEndpoint;
    
        @Value("${spring.ai.azure.cognitive-search.api-key}")
        private String acsApiKey;
    
        @Value("${spring.ai.azure.cognitive-search.index}")
        private String acsIndexName;
    
        @Autowired
        private AiClient aiClient;
    
        @Autowired
        private EmbeddingClient embeddingClient;
    
        public static void main(String[] args) {
            SpringApplication.run(AiCustomDataApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception
        {
            System.out.println(String.format("Sending custom data prompt to AI service. One moment please...\r\n"));
    
            final var store = vectorStore(embeddingClient);
    
            final String question = "What are my available health plans?";
    
            final var candidateDocs = store.similaritySearch(question);
    
            final var userMessage = new UserMessage(question);
    
            final String docPrompts =
                    candidateDocs.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n"));
    
            final SystemPromptTemplate promptTemplate = new SystemPromptTemplate(template);
            final var systemMessage = promptTemplate.createMessage(Map.of("documents", docPrompts));
    
            final var prompt = new Prompt(List.of(systemMessage, userMessage));
    
            final var resps = aiClient.generate(prompt);
    
            System.out.println(String.format("Prompt created %d generated response(s).", resps.getGenerations().size()));
    
            resps.getGenerations().stream()
              .forEach(gen -> {
                  final var role = gen.getInfo().getOrDefault(ROLE_INFO_KEY, MessageType.ASSISTANT.getValue());
    
                  System.out.println(String.format("Generated respose from \"%s\": %s", role, gen.getText()));
              });
    
        }
    
        @Bean
        public VectorStore vectorStore(EmbeddingClient embeddingClient)
        {
            final SearchClient searchClient = new SearchClientBuilder()
                    .endpoint(acsEndpoint)
                    .credential(new AzureKeyCredential(acsApiKey))
                    .indexName(acsIndexName)
                    .buildClient();
            return new AzureCognitiveSearchVectorStore(searchClient, embeddingClient);
        }
    
        public static class AzureCognitiveSearchVectorStore implements VectorStore
        {
            private static final int DEFAULT_TOP_K = 4;
    
            private static final Double DEFAULT_SIMILARITY_THRESHOLD = 0.0;
    
            private SearchClient searchClient;
    
            private final EmbeddingClient embeddingClient;
    
            public AzureCognitiveSearchVectorStore(SearchClient searchClient, EmbeddingClient embeddingClient)
            {
                this.searchClient = searchClient;
                this.embeddingClient = embeddingClient;
            }
    
            @Override
            public void add(List<Document> documents)
            {
                final var docs = documents.stream().map(document -> {
    
                    final var embeddings = embeddingClient.embed(document);
    
                    return new DocEntry(document.getId(), "", document.getContent(), embeddings);
    
                }).toList();
    
                searchClient.uploadDocuments(docs);
            }
    
            @Override
            public Optional<Boolean> delete(List<String> idList)
            {
                final List<DocEntry> docIds = idList.stream().map(id -> DocEntry.builder().id(id).build())
                    .toList();
    
                var results = searchClient.deleteDocuments(docIds);
    
                boolean resSuccess = true;
    
                for (IndexingResult result : results.getResults())
                    if (!result.isSucceeded()) {
                        resSuccess = false;
                        break;
                    }
    
                return Optional.of(resSuccess);
            }
    
            @Override
            public List<Document> similaritySearch(String query)
            {
                return similaritySearch(query, DEFAULT_TOP_K);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k)
            {
                return similaritySearch(query, k, DEFAULT_SIMILARITY_THRESHOLD);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k, double threshold)
            {
                final var searchQueryVector = new RawVectorQuery()
                        .setVector(toFloatList(embeddingClient.embed(query)))
                        .setKNearestNeighborsCount(k)
                        .setFields("contentVector");
    
                final var searchResults = searchClient.search(null,
                        new SearchOptions().setVectorQueries(searchQueryVector), Context.NONE);
    
                return searchResults.stream()
                        .filter(r -> r.getScore() >= threshold)
                        .map(r -> {
    
                            final DocEntry entry = r.getDocument(DocEntry.class);
    
                            final Document doc = new Document(entry.getId(), entry.getContent(), Collections.emptyMap());
                            doc.setEmbedding(entry.getContentVector());
    
                            return doc;
                        })
                        .collect(Collectors.toList());
            }
    
            private List<Float> toFloatList(List<Double> doubleList)
            {
                return doubleList.stream().map(Double::floatValue).toList();
            }
    
        }
    
        @Data
        @Builder
        @Jacksonized
        @AllArgsConstructor
        @NoArgsConstructor
        static class DocEntry
        {
            private String id;
    
            private String hash;
    
            private String content;
    
            private List<Double> contentVector;
        }
    
    }
    

    重要

    在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

  3. 瀏覽回專案根資料夾,並使用下列命令執行應用程式:

    ./mvnw spring-boot:run
    

輸出

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T14:40:45.250-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...

Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

必要條件

參考文件 | 原始程式碼 | 套件 (npm) | 範例

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

建立節點應用程式

在主控台視窗 (例如 cmd、PowerShell 或 Bash) 中,為您的應用程式建立新的目錄,並瀏覽至該目錄。 然後執行 npm init 命令以使用 package.json 檔案建立節點應用程式。

npm init

安裝用戶端程式庫

使用 npm 安裝適用於 JavaScript 的 Azure OpenAI 用戶端和 Azure 身分識別程式庫:

npm install openai @azure/identity @azure/openai 

包含 @azure/openai/types 相依性,以擴充 data_sources 屬性的 Azure OpenAI 模型。 只有 TypeScript 才需要此匯入。

應用程式的 package.json 檔案將會隨著相依項目更新。

建立應用程式範例

  1. 開啟要新增專案的命令提示字元,然後建立名為 ChatWithOwnData.ts 的新檔案。 將下列程式碼複製至 ChatWithOwnData.ts 檔案。

    import "dotenv/config";
    import { AzureOpenAI } from "openai";
    import "@azure/openai/types";
    
    // Set the Azure and AI Search values from environment variables
    const endpoint = process.env["AZURE_OPENAI_ENDPOINT"];
    const apiKey = process.env["AZURE_OPENAI_API_KEY"];
    const searchEndpoint = process.env["AZURE_AI_SEARCH_ENDPOINT"];
    const searchKey = process.env["AZURE_AI_SEARCH_API_KEY"];
    const searchIndex = process.env["AZURE_AI_SEARCH_INDEX"];
    
    // Required Azure OpenAI deployment name and API version
    const deploymentName = "gpt-4";
    const apiVersion = "2024-07-01-preview";
    
    function getClient(): AzureOpenAI {
      return new AzureOpenAI({
        endpoint,
        apiKey,
        deployment: deploymentName,
        apiVersion,
      });
    }
    
    async function main() {
      const client = getClient();
    
      const messages = [
        { role: "user", content: "What are my available health plans?" },
      ];
    
      console.log(`Message: ${messages.map((m) => m.content).join("\n")}`);
    
      const events = await client.chat.completions.create({
        stream: true,
        messages: [
          {
            role: "user",
            content:
              "What's the most common feedback we received from our customers about the product?",
          },
        ],
        max_tokens: 128,
        model: "",
        data_sources: [
          {
            type: "azure_search",
            parameters: {
              endpoint: searchEndpoint,
              index_name: searchIndex,
              authentication: {
                type: "api_key",
                key: searchKey,
              },
            },
          },
        ],
      });
    
      let response = "";
      for await (const event of events) {
        for (const choice of event.choices) {
          const newText = choice.delta?.content;
          if (newText) {
            response += newText;
            // To see streaming results as they arrive, uncomment line below
            // console.log(newText);
          }
        }
      }
      console.log(response);
    }
    
    main().catch((err) => {
      console.error("The sample encountered an error:", err);
    });
    
  2. 使用下列命令建置應用程式:

    tsc
    
  3. 使用下列命令執行您的應用程式:

    node ChatWithOwnData.js
    

重要

在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

輸出

Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

必要條件

下列資源:

參考 (英文) | 原始程式碼 (英文) | 封裝 (pypi) (英文) | 範例 (英文)

這些連結會參考適用於 Python 的 OpenAI API。 目前還沒有針對 Azure 的 OpenAI Python SDK。 了解如何在 OpenAI 服務和 Azure OpenAI 服務之間切換 (部分機器翻譯)。

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

建立 Python 環境

  1. 為您的專案建立名為 openai-python 的新資料夾,以及名為 main.py 的新 Python 程式碼檔案。 變更為該目錄:
mkdir openai-python
cd openai-python
  1. 安裝下列 Python 程式庫:
pip install openai
pip install python-dotenv

建立 Python 應用程式

  1. 從專案目錄中開啟 main.py 檔案,並增下列程式碼:
import os
import openai
import dotenv

dotenv.load_dotenv()

endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_ID")

client = openai.AzureOpenAI(
    azure_endpoint=endpoint,
    api_key=api_key,
    api_version="2024-02-01",
)

completion = client.chat.completions.create(
    model=deployment,
    messages=[
        {
            "role": "user",
            "content": "What are my available health plans?",
        },
    ],
    extra_body={
        "data_sources":[
            {
                "type": "azure_search",
                "parameters": {
                    "endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
                    "index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
                    "authentication": {
                        "type": "api_key",
                        "key": os.environ["AZURE_AI_SEARCH_API_KEY"],
                    }
                }
            }
        ],
    }
)

print(completion.model_dump_json(indent=2))

重要

在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

  1. 執行以下 命令:
python main.py

應用程式會以 JSON 格式列印適用於許多案例的回應。 其中包含來自所上傳檔案之查詢和引文的解答。

必要條件

下列資源:

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

範例 PowerShell 命令

Azure OpenAI 聊天模型已最佳化,以使用格式化為交談的輸入。 messages 變數會在系統、使用者、工具和助理所描述的交談中傳遞具有不同角色的字典陣列。 dataSources 變數會連線到您的 Azure 認知搜尋索引,並讓 Azure OpenAI 模型使用您的資料回應。

若要觸發模型的回應,您應該以使用者訊息結尾,指出輪到助理回應。

提示

您可以使用數個參數來變更模型的回應,例如 temperaturetop_p。 如需詳細資訊,請參閱參考文件

# Azure OpenAI metadata variables
   $openai = @{
       api_key     = $Env:AZURE_OPENAI_API_KEY
       api_base    = $Env:AZURE_OPENAI_ENDPOINT # your endpoint should look like the following https://YOUR_RESOURCE_NAME.openai.azure.com/
       api_version = '2023-07-01-preview' # this may change in the future
       name        = 'YOUR-DEPLOYMENT-NAME-HERE' #This will correspond to the custom name you chose for your deployment when you deployed a model.
   }

   $acs = @{
       search_endpoint     = 'YOUR ACS ENDPOINT' # your endpoint should look like the following https://YOUR_RESOURCE_NAME.search.windows.net/
       search_key    = 'YOUR-ACS-KEY-HERE' # or use the Get-Secret cmdlet to retrieve the value
       search_index = 'YOUR-INDEX-NAME-HERE' # the name of your ACS index
   }

   # Completion text
   $body = @{
    dataSources = @(
        @{
            type = 'AzureCognitiveSearch'
            parameters = @{
                    endpoint = $acs.search_endpoint
                    key = $acs.search_key
                    indexName = $acs.search_index
                }
        }
    )
    messages = @(
            @{
                role = 'user'
                content = 'What are my available health plans?'
            }
    )
   } | convertto-json -depth 5

   # Header for authentication
   $headers = [ordered]@{
       'api-key' = $openai.api_key
   }

   # Send a completion call to generate an answer
   $url = "$($openai.api_base)/openai/deployments/$($openai.name)/extensions/chat/completions?api-version=$($openai.api_version)"

   $response = Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Post -ContentType 'application/json'
   return $response.choices.messages[1].content

範例輸出

The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

重要

針對生產環境,請使用儲存和存取認證的安全方式,例如搭配 Azure Key Vault 的 PowerShell 祕密管理。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

使用 Web 應用程式與模型聊天

若要開始與使用您資料的 Azure OpenAI 模型聊天,您可以使用 Azure OpenAI Studio 或我們在 GitHub 上提供的 (英文) 範例程式碼來部署 Web 應用程式。 此應用程式會使用 Azure 應用程式服務進行部署,並提供用來傳送查詢的使用者介面。 此應用程式可由使用您的資料的 Azure OpenAI 模型,或不使用您的資料的模型使用。 如需需求、設定和部署的指示,請參閱存放庫中的讀我檔案。 您可以選擇性地對原始程式碼進行變更,以自訂 Web 應用程式的前端及後端邏輯 (部分機器翻譯)。

必要條件

下列資源:

參考 (部分機器翻譯) | 原始程式碼 (英文) | 封裝 (Go) (英文) | 範例 (英文)

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

建立 Go 環境

  1. 為您的專案建立名為 openai-go 的新資料夾,以及名為 sample.go 的新 Go 程式碼檔案。 變更為該目錄:

    mkdir openai-go
    cd openai-go
    
  2. 安裝下列 Go 套件:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. 啟用程式碼的相依性追蹤。

    go mod init example/azure-openai
    

建立 Go 應用程式

  1. 從專案目錄中開啟 sample.go 檔案,並增下列程式碼:

    package main
    
    import (
     "context"
     "fmt"
     "log"
     "os"
    
     "github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    )
    
    func main() {
     azureOpenAIKey := os.Getenv("AZURE_OPENAI_API_KEY")
     modelDeploymentID := os.Getenv("AZURE_OPENAI_DEPLOYMENT_ID")
    
     // Ex: "https://<your-azure-openai-host>.openai.azure.com"
     azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
    
     // Azure AI Search configuration
     searchIndex := os.Getenv("AZURE_AI_SEARCH_INDEX")
     searchEndpoint := os.Getenv("AZURE_AI_SEARCH_ENDPOINT")
     searchAPIKey := os.Getenv("AZURE_AI_SEARCH_API_KEY")
    
     if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" || searchIndex == "" || searchEndpoint == "" || searchAPIKey == "" {
     	fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
     	return
     }
    
     keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
    
     // In Azure OpenAI you must deploy a model before you can use it in your client. For more information
     // see here: https://video2.skills-academy.com/azure/cognitive-services/openai/how-to/create-resource
     client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{
     	Messages: []azopenai.ChatRequestMessageClassification{
     		&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What are my available health plans?")},
     	},
     	MaxTokens: to.Ptr[int32](512),
     	AzureExtensionsOptions: []azopenai.AzureChatExtensionConfigurationClassification{
     		&azopenai.AzureSearchChatExtensionConfiguration{
     			// This allows Azure OpenAI to use an Azure AI Search index.
     			//
     			// > Because the model has access to, and can reference specific sources to support its responses, answers are not only based on its pretrained knowledge
     			// > but also on the latest information available in the designated data source. This grounding data also helps the model avoid generating responses
     			// > based on outdated or incorrect information.
     			//
     			// Quote from here: https://video2.skills-academy.com/en-us/azure/ai-services/openai/concepts/use-your-data
     			Parameters: &azopenai.AzureSearchChatExtensionParameters{
     				Endpoint:  &searchEndpoint,
     				IndexName: &searchIndex,
     				Authentication: &azopenai.OnYourDataAPIKeyAuthenticationOptions{
     					Key: &searchAPIKey,
     				},
     			},
     		},
     	},
     	DeploymentName: &modelDeploymentID,
     }, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n",
     	*resp.Choices[0].Message.Role,
     	len(*resp.Choices[0].Message.Content))
    
     fmt.Fprintf(os.Stderr, "ChatRole: %s\nChat content: %s\n",
     	*resp.Choices[0].Message.Role,
     	*resp.Choices[0].Message.Content,
     )
    }
    

    重要

    在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需有關認證安全性的詳細資訊,請參閱 Azure AI 服務安全性一文。

  2. 執行以下 命令:

    go run sample.go
    

    應用程式會列印回應,包括來自所上傳檔案的查詢和引文答案。

必要條件

下列資源:

使用 Azure OpenAI Studio 新增您的資料

提示

您可以使用 Azure Developer CLI,以程式設計方式建立 Azure OpenAI On Your Data 所需的資源

瀏覽至 Azure OpenAI Studio,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  1. 選取 [攜帶您自己的資料]

    Azure OpenAI Studio 登陸頁面的螢幕擷取畫面。

  2. 在 [聊天遊樂場] 中,選取 [新增您的資料],然後選取 [新增資料來源]

    OpenAI Studio 中聊天遊樂場的螢幕擷取畫面。

  3. 在出現的窗格中,選取 [選取資料來源] 底下的 [上傳檔案 (預覽)]。 Azure OpenAI 需要儲存資源和搜尋資源,才能存取及為資料編製索引。

    提示

    1. 若要讓 Azure OpenAI 存取儲存體帳戶,您必須開啟跨原始來源資源分享 (CORS)(部分機器翻譯)。 如果未開啟 Azure Blob 儲存體資源的 CORS,請選取 [開啟 CORS]

    2. 選取您的 Azure AI 搜尋服務資源,然後選取連線的通知,將會在您的帳戶上產生使用量。 然後選取下一步

    顯示可在 Azure OpenAI Studio 中選取資料來源的選項的螢幕擷取畫面。

  4. 在 [上傳檔案] 窗格中,選取 [瀏覽檔案],然後選取您從 [必要條件] 區段或您自己的資料所下載的檔案。 接著選取 [上傳檔案]。 然後選取下一步

  5. 在 [資料管理] 窗格中,您可以選擇為索引啟用語意搜尋或向量搜尋

    重要

    • 語意搜尋向量搜尋需額外付費。 您必須選擇 [基本或更高] SKU,才能啟用語意搜尋或向量搜尋。 如需詳細資訊,請參閱定價層差異服務限制
    • 為了協助改善資訊擷取和模型回應的品質,建議您啟用下列資料來源語言的語意搜尋:英文、法文、西班牙文、葡萄牙文、義大利文、德文、中文(Zh)、日文、韓文、俄文和阿拉伯文。
  6. 檢閱輸入的詳細資料,然後選取 [儲存並關閉]。 您現在可以與模型聊天,模型會使用您資料中的資訊來建構回應。

擷取必要的變數

若要成功對 Azure OpenAI 發出呼叫,您將需要下列變數。 本快速入門假設您已將資料上傳至 Azure Blob 儲存體帳戶,並已建立 Azure AI 搜尋服務索引。 請參閱使用 Azure AI Studio 新增您的資料 (部分機器翻譯)

變數名稱
AZURE_OPENAI_ENDPOINT 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure AI Studio]>[聊天遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://my-resoruce.openai.azure.com
AZURE_OPENAI_API_KEY 從 Azure 入口網站查看您的 Azure OpenAI 資源時,可以在 [資源管理] > [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_OPENAI_DEPLOYMENT_ID 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure AI Studio 的 [管理]>[部署] 下找到。
AZURE_AI_SEARCH_ENDPOINT 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。
AZURE_AI_SEARCH_API_KEY 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [設定] > [金鑰] 區段中找到此值。 您可以使用主要系統管理金鑰或次要系統管理金鑰。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。
AZURE_AI_SEARCH_INDEX 此值會對應至您建立來儲存資料的索引名稱。 從 Azure 入口網站查看您的 Azure AI 搜尋服務資源時,可以在 [概觀] 區段中找到此值。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

範例 cURL 命令

Azure OpenAI 聊天模型已最佳化,以使用格式化為交談的輸入。 messages 變數會在系統、使用者、工具和助理所描述的交談中傳遞具有不同角色的字典陣列。 dataSources 變數會連線到您的 Azure AI 搜尋服務索引,並讓 Azure OpenAI 模型使用您的資料回應。

若要觸發模型的回應,您應該以使用者訊息結尾,指出輪到助理回應。

提示

您可以使用數個參數來變更模型的回應,例如 temperaturetop_p。 如需詳細資訊,請參閱參考文件

curl -i -X POST $AZURE_OPENAI_ENDPOINT/openai/deployments/$AZURE_OPENAI_DEPLOYMENT_ID/chat/completions?api-version=2024-02-15-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d \
'
{
    "data_sources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
                "key": "'$AZURE_AI_SEARCH_API_KEY'",
                "index_name": "'$AZURE_AI_SEARCH_INDEX'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What are my available health plans?"
        }
    ]
}
'

範例輸出

{
    "id": "12345678-1a2b-3c4e5f-a123-12345678abcd",
    "model": "gpt-4",
    "created": 1709835345,
    "object": "extensions.chat.completion",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "content": "The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans. [doc1].",
                "end_turn": true,
                "context": {
                    "citations": [
                        {
                            "content": "...",
                            "title": "...",
                            "url": "https://mysearch.blob.core.windows.net/xyz/001.txt",
                            "filepath": "001.txt",
                            "chunk_id": "0"
                        }
                    ],
                    "intent": "[\"Available health plans\"]"
                }
            }
        }
    ],
    "usage": {
        "prompt_tokens": 3779,
        "completion_tokens": 105,
        "total_tokens": 3884
    }
}

使用 Web 應用程式與模型聊天

若要開始與使用您資料的 Azure OpenAI 模型聊天,您可以使用 Azure OpenAI Studio 或我們在 GitHub 上提供的 (英文) 範例程式碼來部署 Web 應用程式。 此應用程式會使用 Azure 應用程式服務進行部署,並提供用來傳送查詢的使用者介面。 此應用程式可由使用您的資料的 Azure OpenAI 模型,或不使用您的資料的模型使用。 如需需求、設定和部署的指示,請參閱存放庫中的讀我檔案。 您可以選擇性地對原始程式碼進行變更,以自訂 Web 應用程式的前端及後端邏輯 (部分機器翻譯)。

清除資源

如果您想要清除和移除 Azure OpenAI 或 Azure AI 搜尋服務資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

下一步