从 .NET AI 聊天应用获取有关数据的见解
使用 .NET 8 控制台应用连接到 OpenAI gpt-3.5-turbo
模型,开始使用 AI 开发。 使用语义内核连接到 AI 模型,以分析徒步旅行数据并提供见解。
先决条件
- .NET 8.0 SDK - 安装 .NET 8.0 SDK。
- OpenAI 的 API 密钥,可以用于运行此示例。
- 在 Windows 上,必须安装 PowerShell
v7+
。 若要验证版本,请在终端中运行pwsh
。 它应返回当前版本。 如果返回错误,请执行以下命令dotnet tool update --global PowerShell
。
使用 .NET 8 控制台应用连接到 Azure 上部署的 OpenAI gpt-3.5-turbo
模型,开始使用 AI 开发。 使用语义内核连接到 AI 模型,以分析徒步旅行数据并提供见解。
先决条件
- .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
部署期间遇到错误,请访问故障排除部分。
尝试使用徒步旅行聊天示例
在终端或命令提示符下,导航到
openai\03-ChattingAboutMyHikes
目录。运行以下命令,将 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);
创建 OpenAIChatCompletionService
客户端后,应用会读取 hikes.md
文件的内容,并通过添加系统提示向模型提供更多上下文。 这会影响模型行为和对话过程中产生的补全。
应用程序使用 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);
创建 OpenAIChatCompletionService
客户端后,应用会读取 hikes.md
文件的内容,并通过添加系统提示向模型提供更多上下文。 这会影响模型行为和对话过程中产生的补全。
// Provide context for the AI model
ChatHistory chatHistory = new($"""
You are upbeat and friendly. You introduce yourself when first saying hello.
Provide a short answer only based on the user hiking records below:
{File.ReadAllText("hikes.md")}
""");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
以下代码使用 AddUserMessage
函数向模型添加用户提示。 GetChatMessageContentAsync
函数指示模型根据系统和用户提示生成响应。
// Start the conversation
chatHistory.AddUserMessage("Hi!");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
chatHistory.Add(
await service.GetChatMessageContentAsync(
chatHistory,
new OpenAIPromptExecutionSettings()
{
MaxTokens = 400
}));
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
该应用将模型的响应添加到 chatHistory
以维护聊天历史记录或上下文。
// Continue the conversation with a question.
chatHistory.AddUserMessage(
"I would like to know the ratio of the hikes I've done in Canada compared to other countries.");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
chatHistory.Add(await service.GetChatMessageContentAsync(
chatHistory,
new OpenAIPromptExecutionSettings()
{
MaxTokens = 400
}));
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
自定义系统或用户提示以提供不同的问题和上下文:
- 我有多少次在下雨时徒步旅行?
- 2021 年我徒步旅行了几次?
该模型根据你的输入生成与每个提示相关的响应。
清理资源
不再需要示例应用程序或资源时,请删除相应的部署和所有资源。
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 应用现已配置用户机密,可以对其进行测试。