使用 C#、OpenAI 和 Spectre.Console 创建控制台 ChatGPT 客户端

科技   2024-11-15 08:02   广东  

本文将指导您使用 C# 和 .NET 8 构建基于控制台的 ChatGPT 客户端。

我们将使用适用于 OpenAI API (https://github.com/openai/openai-dotnet) 的官方 .NET 库和 Spectre.Console 来构建此应用程序。Spectre.Console 是一个 .NET 库,可以更轻松地创建美观的控制台应用程序。

获取 OpenAI API 密钥

如果您还没有 API 密钥,请访问此页面以创建新的 OpenAI API 密钥:https://platform.openai.com/api-keys

创建 Console App 项目

打开 Visual Studio 并创建新的 Console App 项目。

设置项目名称和位置。选择.NET 8作为框架后,点击 [创建] 按钮。

安装 OpenAI 和 Spectre.Console 软件包

打开 NuGet 包管理器并安装 OpenAI 库:

接下来,搜索 Spectre.Console 并安装它:

编写代码

配置

打开 Program.cs 文件。需要两个 using 语句:

using OpenAI.Chat;  
using Spectre.Console;

我们需要定义模型和 API Key:

const string model = "gpt-4o";  
const string apiKey = "YOUR OPEN AI API KEY";

创建 ChatClient

var client = new ChatClient(model, apiKey);  
var messages = new List<ChatMessage>();

这是一个使用模型和 API 密钥与 OpenAI 的 API 通信的实例。该列表跟踪用户与 GPT 之间的对话历史记录以维护上下文。ChatClientmessages

用户界面设置

AnsiConsole.Write(new FigletText("ConsoleGPT").Centered().Color(Color.Yellow));  
AnsiConsole.Write(new Text("Type '/q' to quit the program.\\n", new Style(Color.Grey)).Centered());

控制台顶部以黄色大字体显示 “ConsoleGPT”。在它下方,以灰色显示简单的说明,告诉用户如何退出应用程序。FigletTextText

主聊天循环

循环一直持续,直到用户决定退出:

while (true)  
{
AnsiConsole.Write(new Rule { Style = "grey" });

var input = AnsiConsole.Ask<string>("[blue]You:[/]");

AnsiConsole.Write(new Rule { Style = "grey dim" });

if (input?.ToLower() == "/q") break;

messages.Add(new UserChatMessage(input));

此代码部分管理控制台中的用户输入。它首先绘制一条灰线,然后提示用户输入他们的消息,并带有蓝色的 “You:”。

捕获输入后,为了清晰起见,将绘制另一条暗淡的灰色线。如果输入为 “/q”,则循环退出并结束聊天。否则,用户的消息将作为 a 添加到列表中,以跟踪对话历史记录以供 ChatGPT 处理。messagesUserChatMessage

处理用户输入

var completion = await AnsiConsole.Status()  
.StartAsync("ChatGPT is thinking...", async ctx =>
await client.CompleteChatAsync(messages.TakeLast(10)));

该代码用于显示“ChatGPT 正在思考......”等待 API 响应。然后,它调用将最后 10 条消息发送到 OpenAI API 以维护对话上下文。AnsiConsole.StatusCompleteChatAsync

显示响应

var responseText = completion.Value.Content[0].Text;  

AnsiConsole.Markup("[green]ChatGPT:[/]\n");
Console.WriteLine(responseText.Trim());

messages.Add(new AssistantChatMessage(responseText));

此代码通过访问内容的第一个元素并将其分配给 ,从对象中提取响应的文本。completionresponseText

然后它用于在控制台上以绿色显示“ChatGPT:”。使用 method 将实际响应文本打印到控制台。AnsiConsole.MarkupConsole.WriteLine

最后,将响应文本添加到列表中,以确保在发送下一个聊天时具有对话上下文。messagesAssistantChatMessage

完整代码

这是整个代码,简明扼要,只有 35 行:

using OpenAI.Chat;
using Spectre.Console;

const string model = "gpt-4o";
const string apiKey = "YOUR OPEN AI API KEY";

var client = new ChatClient(model, apiKey);
var messages = new List<ChatMessage>();

AnsiConsole.Write(new FigletText("ConsoleGPT").Centered().Color(Color.Yellow));
AnsiConsole.Write(new Text("Type '/q' to quit the program.\n", new Style(Color.Grey)).Centered());

while (true)
{
AnsiConsole.Write(new Rule { Style = "grey" });

var input = AnsiConsole.Ask<string>("[blue]You:[/]");

AnsiConsole.Write(new Rule { Style = "grey dim" });

if (input?.ToLower() == "/q") break;

messages.Add(new UserChatMessage(input));

var completion = await AnsiConsole.Status()
.StartAsync("ChatGPT is thinking...", async ctx =>
await client.CompleteChatAsync(messages.TakeLast(10)));

var responseText = completion.Value.Content[0].Text;

AnsiConsole.Markup("[green]ChatGPT:[/]\n");
Console.WriteLine(responseText.Trim());

messages.Add(new AssistantChatMessage(responseText));
}

运行应用程序

按 F5 并开始询问 ChatGPT:

该项目展示了使用简单的代码将 AI 添加到应用程序是多么容易。它为那些有兴趣在 .NET 环境中探索生成式 AI 的人提供了一个很好的起点。


推荐阅读:
.NET 9正式发布,亮点是.NET Aspire和AI
今晚零点!一同相约 .NET Conf 2024
适用于 .NET 稳定的官方OpenAI库
.NET无侵入式对象池解决方案
相约 .NET 9!|共同关注 .NET Conf 2024 最新发布
在 .NET 中编写更好的配置文件

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2024开发者路线
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终回顾
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

DotNet NB
.NET 技术学习分享,社区热点分享,专注为 .NET 社区做贡献,愿我们互相交流学习,共同推动社区发展
 最新文章