使用 .NET 构建 AI 聊天应用

通过创建简单的 .NET 8 控制台聊天应用程序,开始使用 OpenAI 和语义内核。 该应用程序将在本地运行并使用 OpenAI gpt-3.5-turbo 模型。 按照以下步骤访问 OpenAI,并了解如何使用语义内核。

先决条件

  • .NET 8.0 SDK - 安装 .NET 8.0 SDK
  • OpenAI 的 API 密钥,可以用于运行此示例。
  • 在 Windows 上,必须安装 PowerShell v7+。 若要验证版本,请在终端中运行 pwsh。 它应返回当前版本。 如果返回错误,请执行以下命令 dotnet tool update --global PowerShell

通过创建简单的 .NET 8 控制台聊天应用程序,开始使用 OpenAI 和语义内核。 该应用程序将在本地运行,并连接到部署到 Azure OpenAI 的 OpenAI gpt-35-turbo 模型。 按照以下步骤预配 Azure OpenAI,并了解如何使用语义内核。

先决条件

获取示例项目

克隆 GitHub 存储库,其中包含用于所有快速入门的示例应用:

git clone https://github.com/dotnet/ai-samples.git

创建 Azure OpenAI 服务

示例 GitHub 存储库构造为 Azure Developer CLI (azd) 模板,azd 可以使用此模板为你预配 Azure OpenAI 服务和模型。

  1. 从终端或命令提示符导航到示例存储库的 src\quickstarts\azure-openai 目录。

  2. 运行 azd up 命令来预配 Azure OpenAI 资源。 创建 Azure OpenAI 服务并部署模型可能需要几分钟。

    azd up
    

    azd 还为示例应用配置所需的用户机密,例如 OpenAI 访问密钥。

    注意

    如果在 azd up 部署期间遇到错误,请访问故障排除部分。

尝试 HikerAI 示例

  1. 在终端或命令提示符下,导航到 openai\02-HikerAI 目录。

  2. 运行以下命令,将 OpenAI API 密钥配置为示例应用的机密:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. 使用 dotnet run 命令运行应用:

    dotnet run
    
  1. 在终端或命令提示符下,导航到 azure-openai\02-HikerAI 目录。

  2. 使用 dotnet run 命令运行应用:

    dotnet run
    

    提示

    如果收到错误消息,表明 Azure OpenAI 资源可能尚未完成部署。 等待几分钟,然后重试。

浏览代码

应用使用 Microsoft.SemanticKernel 包向 OpenAI 服务发送和接收请求。

应用代码包含在 Program.cs 文件中。 前几行代码设置配置值,并获取以前使用 dotnet user-secrets 命令设置的 OpenAI 密钥。

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];

OpenAIChatCompletionService 服务有助于请求和响应。

// Create the OpenAI Chat Completion Service
OpenAIChatCompletionService service = new(model, key);

浏览代码

应用程序使用 Microsoft.SemanticKernel 包向部署在 Azure 中的 Azure OpenAI 服务发送和接收请求。

整个应用程序包含在 Program.cs 文件中。 前几行代码检索在应用程序预配期间在 dotnet user-secrets 中设置的机密和配置值。

// Retrieve the local secrets saved during the Azure deployment
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

AzureOpenAIChatCompletionService 服务有助于请求和响应。

// Create the Azure OpenAI Chat Completion Service
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);

添加一个系统提示来为模型提供更多上下文,这会影响模型行为和对话中生成的补全。

// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area. 
    You are upbeat and friendly. You introduce yourself when first saying hello.
    When helping people out, you always ask them for this information
    to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length
    after you get that information. You will also share an interesting fact about
    the local nature on the hikes when making a recommendation.
    """);

使用 AddUserMessage 函数将用户消息添加到聊天历史记录。 使用 GetChatMessageContentAsync 函数指示模型根据系统提示语和用户请求生成回复。


// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");

// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

// Get response
var response = await service.GetChatMessageContentAsync(
    chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });

添加来自模型的回复以维护聊天历史记录。

// Add response to chat history
chatHistory.Add(response);

// Print Response to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

自定义系统提示和用户消息,了解模型如何响应以帮助你找到你喜欢的徒步旅行。

清理资源

当你不再需要示例应用程序或资源时,请移除相应的部署和所有资源。

azd down

疑难解答

在 Windows 上,运行 azd up 后,可能会收到以下错误消息:

postprovision.ps1 未进行数字签名。 该脚本不会在系统上执行

执行脚本 postprovision.ps1 以设置应用程序中使用的 .NET 用户机密。 若要避免此错误,请运行以下 PowerShell 命令:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

然后,重新运行 azd up 命令。

另一个可能的错误:

“pwsh”没有被识别为内部或外部命令、可运行程序或批处理文件。 警告:“postprovision”挂钩失败,退出代码为“1”,路径:“.\infra\post-script\postprovision.ps1”。 :退出代码:1 执行将继续,因为 ContinueOnError 已设置为 true。

执行脚本 postprovision.ps1 以设置应用程序中使用的 .NET 用户机密。 若要避免此错误,请使用以下 PowerShell 命令手动运行脚本:

.\infra\post-script\postprovision.ps1

.NET AI 应用现已配置用户机密,可以对其进行测试。

后续步骤