使用 .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,并了解如何使用语义内核。
先决条件
- .NET 8 SDK - 安装 .NET 8 SDK。
- Azure 订阅 - 免费创建订阅。
- Azure Developer CLI - 安装或更新 Azure Developer CLI。
- 访问 Azure OpenAI 服务。
- 在 Windows 上,必须安装 PowerShell
v7+
。 若要验证版本,请在终端中运行pwsh
。 它应返回当前版本。 如果返回错误,请执行以下命令dotnet tool update --global PowerShell
。
获取示例项目
克隆 GitHub 存储库,其中包含用于所有快速入门的示例应用:
git clone https://github.com/dotnet/ai-samples.git
创建 Azure OpenAI 服务
示例 GitHub 存储库构造为 Azure Developer CLI (azd
) 模板,azd
可以使用此模板为你预配 Azure OpenAI 服务和模型。
从终端或命令提示符导航到示例存储库的 src\quickstarts\azure-openai 目录。
运行
azd up
命令来预配 Azure OpenAI 资源。 创建 Azure OpenAI 服务并部署模型可能需要几分钟。azd up
azd
还为示例应用配置所需的用户机密,例如 OpenAI 访问密钥。注意
如果在
azd up
部署期间遇到错误,请访问故障排除部分。
尝试 HikerAI 示例
在终端或命令提示符下,导航到
openai\02-HikerAI
目录。运行以下命令,将 OpenAI API 密钥配置为示例应用的机密:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key>
使用
dotnet run
命令运行应用:dotnet run
在终端或命令提示符下,导航到
azure-openai\02-HikerAI
目录。使用
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 应用现已配置用户机密,可以对其进行测试。