练习 - 安装用于 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”。 请注意,我们将使用“HikingConversations-RG”作为资源组名称,使用“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 客户端对象要使用哪个已部署的模型。

    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 模型来创建有助于提供徒步旅行建议的对话。 接下来,让我们看看如何改进发送给模型的提示。