C# 调用 Azure OpenAI 创建聊天机器人
The following article is from 精致码农 Author liamwang
前言
由于众所周知的原因,国内是没法直接调用 OpenAI 接口的。幸好可以白嫖 Cloudfare Workers、Vercel 等免费服务做 API 代理,我之前一直是这么用的,速度也还可以。前两天申请的微软的 Azure OpenAI 接口通过了,立即体验了一下。
它的流式响应速度比用 Cloudfare Worders 代理 OpenAI 官方接口快多了。你可以在我的这个小程序上体验一番EazAI智能助手。
下面我将演示如何开通 Azure OpenAI 服务,以及如何使用 C# 调用 Azure OpenAI 接口创建一个 Console 应用程序并实现聊天机器人功能。
一、开通 Azure OpenAI 服务
要开通 Azure OpenAI 服务,前提是你得有一个国际信用卡(比如 Visa 或 MasterCard),然后在 Azure 国际版(azure.com)注册一个账号。如果你不是微软 MVP,最好用公司邮箱注册,否则无法申请开通 OpenAI 服务。
第一次注册并成功绑卡后,还有200美金的免费额度哦。完成账号注册和绑卡后,在"创建资源"里找到 OpenAI 服务,根据提示点击下面这个链接填写申请表单:
或者直接访问这个链接:
https://aka.ms/oai/access
表单说明了 Azure OpenAI 服务目前只对企业或 MVP 开放,所以如果你不是 MVP 需要用公司的邮箱申请,个人 Gmail 或 Outlook 等邮箱都会被直接拒绝。
表单中涉及到公司信息部分,最好如实填写,不然也很可能被拒。填写完提交后,一般两个工作日内就会收到邮件通知。
二、创建 Azure OpenAI 服务
当你的申请通过后,就可以到 Azure 上创建 OpenAI 服务了。点击"创建资源",搜索找到"OpenAI":
点击进入,填写这一页的信息:
然后一直下一步就可以完成创建了。服务创建好以后,还要部署一个 ChatGPT 模型。在你创建好的 OpenAI 服务中,依次点击"模型部署"-"创建",在弹出的对话框中填写模型名称,选择 gpt-35-turbo
模型:
再到"密钥和终点"复制保存 API 要用的密钥和终结点:
三、创建 Console 聊天应用程序
使用.NET 的 CLI 命令行工具或通过 IDE 创建一个 Console 应用程序:
dotnet new console -o ChatConsole cd ChatConsole
安装两个需要用到的 Nuget 包:
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
dotnet add package Azure.AI.OpenAI --prerelease
第一个包是用来管理本地密钥的,请不要直接在代码中填写密码。第二个包是 Azure 官方的 OpenAI API 库,目前只有预览版。安装好后,通过 user-secrets
添加好下面三个配置,分别是上面创建好的终结点、密钥和模型名称:
dotnet user-secrets init
dotnet user-secrets set Azure:OpenAI:Endpoint [YOUR_AZURE_OPENAI_ENDPOINT]
dotnet user-secrets set Azure:OpenAI:ApiKey [YOUR_AZURE_OPENAI_APIKEY]
dotnet user-secrets set Azure:OpenAI:ModelName [YOUR_MODEL_DEPLOYMENT]
实现聊天功能有两种方式。一种是非流式响应,即一次性返回所有文字;另一种是流式响应,即一个字或几个字地返回,是最常用的方式。流式响应的好处是第一时间响应用户请求,在用户阅读的同时逐渐响应后面的内容,体验更佳。这两种方式的实现,请参考 Azure OpenAI API 文档:
https://learn.microsoft.com/en-us/azure/cognitive-services/openai/chatgpt-quickstart
下面以流式响应为例,实现一个 Console 版本的聊天机器人。编辑 Program.cs
文件,完整参考代码如下:
using Azure;
using Azure.AI.OpenAI;
using Microsoft.Extensions.Configuration;
using System.Text;
Console.OutputEncoding = Encoding.UTF8;
var configuration = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
var apiKey = configuration["Azure:OpenAI:ApiKey"];
var endpoint = configuration["Azure:OpenAI:Endpoint"];
var modelName = configuration["Azure:OpenAI:ModelName"];
var client = new OpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
var completionsOptions = new ChatCompletionsOptions
{
Messages =
{
new ChatMessage(ChatRole.System, "你是一个温柔的女生,擅长用理性的语言鼓励和引导人,对情绪低落的人进行劝慰。温柔一点,口语化一些。"),
new ChatMessage(ChatRole.User, "你好"),
}
};
while (true)
{
Console.WriteLine();
Console.Write("她: ");
var completionsResponse = await client.GetChatCompletionsStreamingAsync(
modelName,
completionsOptions
);
var resonseText = new StringBuilder();
await foreach (var choice in completionsResponse.Value.GetChoicesStreaming())
{
await foreach (var message in choice.GetMessageStreaming())
{
resonseText.Append(message.Content);
Console.Write(message.Content);
await Task.Delay(TimeSpan.FromMilliseconds(100));
}
}
completionsOptions.Messages.Add(new ChatMessage(ChatRole.Assistant, resonseText.ToString()));
Console.WriteLine();
Console.WriteLine();
Console.Write("我: ");
var userMessage = Console.ReadLine();
completionsOptions.Messages.Add(new ChatMessage(ChatRole.User, userMessage));
}
由于 Azure OpenAI 的响应速度非常快,为了模拟打字效果特意加了一点延迟。使用 dot run 运行效果如下:
四、总结
本文介绍了如何使用 Azure OpenAI 和 C# 创建聊天机器人。由于国内无法直接访问 OpenAI 接口,但可以通过 Cloudfare Workers 等做代理,但使用微软的 Azure OpenAI 服务可以有更快的响应体验。
介绍如何在 Azure 中注册和创建 Azure OpenAI 服务,以及如何在服务中部署 ChatGPT 模型。接着,我演示了如何使用 .NET CLI 创建控制台应用程序,并添加相关配置。
最后,我使用 C# 代码演示如何调用 Azure OpenAI 接口实现一个 Console 聊天机器人。
- EOF -
C# 异步有多少种实现方式?.NET 7 中实现速率限制无痛接入
看完本文有收获?请转发分享给更多人
推荐关注「DotNet」,提升.Net技能
点赞和在看就是最大的支持❤️