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

用只有35行代码创建一个简单的ChatGPT客户端

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

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

获取OpenAI API密钥

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

创建控制台应用程序项目

打开您的Visual Studio并创建一个新的控制台应用程序项目。

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

安装OpenAI和Spectre.Console包

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

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

写代码。

配置

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

using OpenAI.Chat;
using Spectre.Console;

我们需要定义模型和API密钥:

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

创建聊天客户端

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

ChatClient 是一个实例,使用模型和 API 密钥与 OpenAI 的 API 进行通信。 消息列表跟踪用户与 GPT 之间的对话历史,以保持上下文。

用户界面设置

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());

FigletText 在控制台顶部用大号的黄色字体显示“ConsoleGPT”。下面的文本以灰色显示简单的指示,告诉用户如何退出应用程序。

主要聊天循环

循环将继续,直到用户决定退出:

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));

这段代码管理控制台中用户的输入。它首先画一条灰线,然后以蓝色提示用户输入他们的消息“你:”。

在捕捉输入后,为了清晰起见,会再画一条深灰线。如果输入是“/q”,则循环退出并结束聊天。否则,用户的消息会被添加到消息列表中,作为UserChatMessage来跟踪对话历史,以便ChatGPT进行处理。

处理用户输入

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

该代码使用 AnsiConsole.Status 来显示“ChatGPT正在思考...”,并等待API响应。然后调用 CompleteChatAsync 来发送最后10条消息到OpenAI API,以保持对话上下文。

显示响应

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

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

messages.Add(new AssistantChatMessage(responseText));

这段代码通过访问内容的第一个元素提取完成对象的响应文本,并将其赋值给responseText。

然后使用 AnsiConsole.Markup 在控制台上以绿色显示“ChatGPT:”。实际的响应文本通过 Console.WriteLine 方法打印到控制台上。

最后,响应文本被添加到消息列表中作为一个AssistantChatMessage,以确保在发送下一个聊天时保持对话的上下文。

完整的代码

以下是整个代码,仅仅包含35行代码:

using OpenAI.Chat;
using Spectre.Console;

const string model = "gpt-4o";
const string apiKey = "sk-proj-udHkcJPpwywDVtBZFKbxT3BlbkFJpUqLQ6kP6dVtOaNhF7gu";

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提问:

这个项目展示了通过简单的代码向应用程序添加人工智能有多容易。它为那些对在.NET环境中探索生成式人工智能感兴趣的人提供了一个很好的起点。

2024-10-08 04:10:57 AI中文站翻译自原文