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

科技   2024-10-22 17:16   上海  


本文将指导您使用 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 的人提供了一个很好的起点。

如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章