練習 - 安裝適用於 Azure OpenAI 的 .NET SDK 並建立您的第一個應用程式

已完成

既然我們已經瞭解文字和聊天完成,讓我們建立使用它們的基本應用程式。

您任職于一個組織,該組織通過推薦路線來協助登山客探索戶外。 您考慮將交談式 AI 新增至建議功能,並想要建立原型。

您決定需要使用 GPT-35-Turbo 模型所提供的聊天完成 API。

建立 Azure OpenAI 資源

第一個步驟是建立 Azure OpenAI 資源並部署模型。 讓我們在此練習中使用 GPT-3 Turbo 模型。 如文件所述,GPT-3.5 Turbo 使用聊天完成 API,非常適合我們的使用案例。

必要條件

  • Azure 訂用帳戶

  • 在所需訂用帳戶中授予 Azure OpenAI 的存取權限

    目前只有應用程式會授予此服務的存取權。 您可以填妥 https://aka.ms/oai/access 的表單,以申請 Azure OpenAI 的存取權。

  • Azure CLI 已安裝

建立資源並部署模型

建立資源並部署模型是多步驟程序。 使用 Azure CLI,因為它比使用 Azure 入口網站更快。 但請注意,如果您想要的話,您可以使用Azure 入口網站

  1. 如果您尚未登入,請執行 az login 命令來登入。

  2. 當您建立新的 Azure 資源時,您可以建立新的資源群組,或使用現有的資源群組。 此命令會向您顯示建立新的資源群組的方法。 使用 HikingConversations-RG 名稱,但您可以以您選擇的名稱進行取代,或使用現有的群組名稱。

    az group create \
    --name HikingConversations-RG \
    --location eastus
    
    az group create `
    --name HikingConversations-RG `
    --location eastus
    
  3. 執行下列命令以在 HikingConversations-RG 資源群組中建立 OpenAI 資源。 將 OpenAI 資源命名為 HikingConversationsAI

    az cognitiveservices account create \
    -n HikingConversationsAI \
    -g HikingConversations-RG \
    -l eastus \
    --kind OpenAI \
    --sku s0
    
    az cognitiveservices account create `
    -n HikingConversationsAI `
    -g HikingConversations-RG `
    -l eastus `
    --kind OpenAI `
    --sku s0
    
  4. 接下來,我們想要將 GPT-35-Turbo 模型部署到我們建立的 OpenAI 資源。 呼叫模型部署 HikingRecommendationTurbo。 請注意,現在我們使用 HikingRecommendationTurbo 作為資源群組名稱,HikingConversationsAI 作為 OpenAI 資源名稱,如果您使用的是不同的值,請確定您取代了那些值。

    az cognitiveservices account deployment create \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --deployment-name HikingRecommendationTurbo \
    --model-name gpt-35-turbo \
    --model-version "0301" \
    --model-format OpenAI \
    --scale-settings-scale-type "Standard"
    
    az cognitiveservices account deployment create `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --deployment-name HikingRecommendationTurbo `
    --model-name gpt-35-turbo `
    --model-version "0301" `
    --model-format OpenAI `
    --scale-settings-scale-type "Standard"
    
  5. 建立資源和模型之後,我們需要取得基底 URL 和存取金鑰,讓 .NET SDK 可以存取 Azure OpenAI 資源。 使用這些命令來取得端點和主要 API 金鑰,並記下這些金鑰以供稍後使用:

    端點

    az cognitiveservices account show \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "properties.endpoint"
    
    az cognitiveservices account show `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "properties.endpoint"
    

    主要 API 金鑰

    az cognitiveservices account keys list \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "key1"
    
    az cognitiveservices account keys list `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "key1"
    

建立主控台應用程式並新增 OpenAI SDK

接下來,我們想要建立裸機的 .NET 主控台應用程式,並新增 Azure OpenAI SDK。

  1. 執行下列項目,以建立名為 HikingConversationsAI 的新 .NET 應用程式。

    dotnet new console -n HikingConversationsAI
    
  2. 切換置新建立的 HikingConversationsAI 目錄。

    cd HikingConversationsAI
    
  3. 然後新增 Azure Open AI SDK。

    dotnet add package Azure.AI.OpenAI --prerelease
    
  4. 在 VS Code 或 Visual Studio 中開啟專案。

  5. Program.cs 檔案中,刪除所有現有的程式碼。

  6. using Azure.AI.OpenAI; 新增至 Program.cs 頂端。

  7. using Azure; 新增至 Program.cs 頂端。

  8. 新增三個類別層級變數,以保存對 Azure OpenAI 資源端點、主要 API 金鑰的參考,以及您部署的模型名稱。

    string openAIEndpoint = "<YOUR ENDPOINT URL VALUE>";
    string openAIAPIKey = "<YOUR PRIMARY API KEY VALUE>";
    string openAIDeploymentName = "HikingRecommendationTurbo";
    

    在上述步驟中,我們將部署命名為 HikingRecommendationTurbo,如果您使用不同的值,請確定您改用該值。

  9. 最後,具現化與 Azure OpenAI 資源通訊所需的類別。

    var endpoint = new Uri(openAIEndpoint);
    var credentials = new AzureKeyCredential(openAIAPIKey);
    var openAIClient = new AzureOpenAIClient(endpoint, credentials);
    

建立系統提示字元

讓我們建立初始系統角色提示,以提供模型的初始指示。

  1. 首先建立提示,以指示模型在建議登山時,您想要在交談期間採取動作的方式。

    var systemPrompt = 
    """
    You are a hiking enthusiast who helps people discover fun hikes. You are upbeat and friendly. 
    You ask people what type of hikes they like to take and then suggest some.
    """;
    
  2. 接下來,建立 List<ChatMessage> 以保存要傳送至模型及從模型傳送的所有訊息。

    List<ChatMessage> chatHistory = new();
    
  3. 然後建立新的 SystemChatMessage 物件,並將其新增至 chatHistory 清單。 我們會將 ChatMessage 設定為來自 [系統] 角色。

    SystemChatMessage systemMessage = ChatMessage.CreateSystemMessage(systemPrompt);
    
    chatHistory.Add(systemMessage);
    

起始交談

接下來,我們會將第一則訊息傳送至模型,起始交談。

  1. 建立使用者的提示,並將它新增至 chatHistory 作為使用者訊息。

    string userGreeting = """
    Hi there hiking recommendation bot! 
    Can't wait to hear what you have in store for me!
    """;
    
    UserChatMessage userGreetingMessage = ChatMessage.CreateUserMessage(userGreeting);
    chatHistory.Add(userGreetingMessage);
    
    Console.WriteLine($"User >>> {userGreeting}");
    
  2. 現在,您必須取得 ChatClient 物件的參考。 此物件負責促進與模型的聊天交談。 因此,您必須告訴 Azure OpenAI Client 物件您所部署要使用的模型。

    var chatClient = openAIClient.GetChatClient(openAIDeploymentName);
    
  3. 接下來,呼叫傳入 chatHistoryChatClient 類別的 CompleteChatAsync 函式。

    var response = await chatClient.CompleteChatAsync(chatHistory);
    
  4. 最後,讀出模型傳回的值。

    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  5. 讓我們看看到目前為止的情況,您可以輸入 dotnet run 至終端來執行應用程式。

  6. 藉由變更 userGreetingMessage 的值來查看模型如何以不同的方式回應的實驗。

在一個範例執行中,我們收到下列項目:

Hello! Great to hear from you. What type of hikes are you interested in? Do you enjoy easy scenic walks, challenging trails, or something in between? Do you prefer hikes with waterfalls, mountain views, or unique geological formations?

您可能會因為模型不具決定性而收到不同的內容,或甚至會產生不同的輸出,即使輸入相同也一樣。

繼續交談

讓我們繼續回應交談,然後輸出回應。

  1. 請確定我們會保留交談的內容,因此請新增直接傳回到 chatHistory 清單的回應。

    var assistantMessage = ChatMessage.CreateAssistantMessage(response.Value.Content.Last().Text);
    
    chatHistory.Add(assistantMessage); 
    
  2. 接下來,建立另一個使用者提示,並將其傳送至模型。

    var hikeRequest = 
    """
    I would like a strenuous hike near where I live that ends with
    a view that is amazing.
    """;
    
    Console.WriteLine($"User >>> {hikeRequest}");
    
    UserChatMessage hikeMessage = ChatMessage.CreateUserMessage(hikeRequest);
    
    chatHistory.Add(hikeMessage);
    
    response = await chatClient.CompleteChatAsync(chatHistory); 
    
    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  3. 您可以藉由變更 hikeRequest 變數來要求不同類型的登山道來進行實驗。 在一個範例中,我們收到:

    Great choice! If you're up for a challenge, I recommend checking out the hike to Poo Poo Point in Issaquah, Washington. The hike is 7.2 miles roundtrip, with an elevation gain of 1,858 feet, so it's definitely a workout. But the stunning views of Mount Rainier and the Cascade Mountains make it all worthwhile. Plus, you'll get to see paragliders taking off from Poo Poo Point. It's a popular hike, so I recommend going early to avoid crowds. Let me know if you need more information!
    

摘要

我們現在能夠使用 Azure OpenAI SDK 以及 gpt-35-turbo 模型來建立交談,以協助提供建議。 接下來,讓我們看看如何改善傳送至模型的提示。