使用 ChatGPT API 和 Node.js 创建 CLI 聊天机器人

本文作者 Phil Nash 基于 ChatGPT API,分享了使用 Node.js 用 31 行代码实现聊天机器人命令行界面 (CLI) 的过程。

完整代码:

import { createInterface } from "node:readline/promises";
import { stdin as input, stdout as output, env } from "node:process";
import { Configuration, OpenAIApi } from "openai";

const configuration = new Configuration({ apiKey: env.OPENAI_API_KEY });
const openai = new OpenAIApi(configuration);
const readline = createInterface({ input, output });

const chatbotType = await readline.question(
  "What type of chatbot would you like to create? "
);
const messages = [{ role: "system", content: chatbotType }];
let userInput = await readline.question("Say hello to your new assistant.\n\n");

while (userInput !== ".exit") {
  messages.push({ role: "user", content: userInput });
  try {
    const response = await openai.createChatCompletion({
      messages,
      model: "gpt-3.5-turbo",
    });

    const botMessage = response.data.choices[0].message;
    if (botMessage) {
      messages.push(botMessage);
      userInput = await readline.question("\n" + botMessage.content + "\n\n");
    } else {
      userInput = await readline.question("\nNo response, try asking again\n");
    }
  } catch (error) {
    console.log(error.message);
    userInput = await readline.question("\nSomething went wrong, try asking again\n");
  }
}

readline.close();

运行此代码时,它看起来像这样:

使用 ChatGPT API 和 Node.js 创建 CLI 聊天机器人

让我们深入了解它的工作原理以及如何构建自己的聊天机器人。

构建聊天机器人

你需要一个 OpenAI 平台帐户才能与 ChatGPT API 进行交互。注册后,从帐户仪表板创建一个 API 密钥。

安装 Node.js,需要openaiNode.js 模块

让我们开始一个 Node.js 项目并创建这个 CLI 应用程序。首先为项目创建一个目录,切换到该目录下,并使用 npm 对其进行初始化:

mkdir chatgpt-cli
cd chatgpt-cli
npm init --yes

openai模块安装为依赖项:

npm install openai

打开package.json并将密钥添加"type": "module"到配置中,这样我们就可以将其构建为 ES 模块,这将允许我们使用 top level await

创建一个名为的文件index.js并在编辑器中打开它。

与 OpenAI API 交互

代码分为两部分:处理命令行上的输入和输出以及处理 OpenAI API。让我们先看看 API 是如何工作的。

首先,我们从模块中导入两个对象openai, theConfigurationOpenAIApi。该类Configuration将用于创建保存 API 密钥的配置,然后可以使用该配置创建客户端OpenAIApi

import { env } from "node:process";
import { Configuration, OpenAIApi } from "openai";

const configuration = new Configuration({ apiKey: env.OPENAI_API_KEY });
const openai = new OpenAIApi(configuration);

在这种情况下,我们会将 API 密钥存储在环境中并使用env.OPENAI_API_KEY.

为了与 API 交互,我们现在使用 OpenAI 客户端为我们完成创建聊天。OpenAI 的文本生成模型实际上并不与你交谈,而是用来接收输入并在输入后生成听起来合理的文本,看文档。使用 ChatGPT,模型被配置为接收消息列表,然后完成对话。该系统中的消息可以来自 3 个不同实体之一,即“系统”、“用户”和“助手”。“助手”是 ChatGPT 本身,“用户”是交互的人,系统允许程序(或用户,正如我们将在本例中看到的那样)提供定义助手行为方式的指令。更改系统提示助手的行为方式是最有趣的事情之一,它允许您创建不同类型的助手。

通过openai如上配置的对象,我们可以创建消息以发送给助手并请求如下响应:

const messages = [
  { role: "system", content: "You are a helpful assistant" },
  { role: "user", content: "Can you suggest somewhere to eat in the centre of London?" }
];
const response = await openai.createChatCompletion({
  messages,
  model: "gpt-3.5-turbo",
});
console.log(response.data.choices[0].message);
// => "Of course! London is known for its diverse and delicious food scene..."

随着对话的进行,我们可以将用户的问题和助手的回复添加到我们随每个请求一起发送的消息数组中。这给出了对话的机器人历史,它可以在其上构建进一步答案的上下文。

要创建 CLI,我们只需要将其连接到终端中的用户输入即可。

与终端交互

Node.js 提供了Readline 模块,可以轻松接收输入并将输出写入流。要与终端一起工作,这些流将是stdinstdout

我们可以从 node:process 模块中导入 stdin 和 stdout,将它们重命名为 input 和 output,使它们更容易与 Readline 一起使用。我们还从 node:readline 中导入了 createInterface 函数:

import { createInterface } from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

然后,我们将inputoutput流传递给createInterface,这为我们提供了一个对象,我们可以使用该对象写入输出并从输入中读取,所有这些都具有以下questionfunction:

const readline = createInterface({ input, output });

const chatbotType = await readline.question(
  "What type of chatbot would you like to create? "
);

上面的代码连接了输入和输出流。然后使用该readline对象将问题发布到输出并返回承诺。当用户通过写入终端并按回车键进行回复时,承诺将以用户编写的文本进行解析。

完成 CLI

有了这两个部分,我们就可以编写所有的代码了。创建一个名为的新文件index.js并输入下面的代码。

我们从上面描述的导入开始:

import { createInterface } from "node:readline/promises";
import { stdin as input, stdout as output, env } from "node:process";
import { Configuration, OpenAIApi } from "openai";

然后初始化 API 客户端和 Readline 模块:

const configuration = new Configuration({ apiKey: env.OPENAI_API_KEY });
const openai = new OpenAIApi(configuration);
const readline = createInterface({ input, output });

接下来,我们问用户的第一个问题:“您想创建哪种类型的聊天机器人?” 我们将使用此问题的答案在一组新的消息中创建一条“服务”消息,我们将随着对话的进行继续添加这些消息。

const chatbotType = await readline.question(
  "What type of chatbot would you like to create? "
);
const messages = [{ role: "system", content: chatbotType }];

然后我们提示用户开始与聊天机器人交互并启动一个循环,当用户输入不等于字符串“.exit”时继续将输入发送到 API。如果用户输入“.exit”,程序将结束,就像在 Node.js REPL 中一样。

let userInput = await readline.question("Say hello to your new assistant.\n\n");

while (userInput !== ".exit") {
  // loop
}

readline.close();

在循环内,我们将userInput作为“用户”消息添加到消息数组。然后,在 try/catch 块中,将其发送到 OpenAI API。我们将模型设置为“gpt-3.5-turbo”,这是 ChatGPT 的基础名称。

当我们从 API 获得响应时,我们从数组中获取消息response.data.choices。如果有消息,我们将其作为“助手”消息存储在消息数组中并将其输出给用户,等待他们使用 readline 再次输入。如果 API 的响应中没有消息,我们会提醒用户并等待进一步的用户输入。最后,如果向 API 发出请求时出错,我们会捕获错误、记录消息并告诉用户重试。

while (userInput !== ".exit") {
  messages.push({ role: "user", content: userInput });
  try {
    const response = await openai.createChatCompletion({
      messages,
      model: "gpt-3.5-turbo",
    });

    const botMessage = response.data.choices[0].message;
    if (botMessage) {
      messages.push(botMessage);
      userInput = await readline.question("\n" + botMessage.content + "\n\n");
    } else {
      userInput = await readline.question("\nNo response, try asking again\n");
    }
  } catch (error) {
    console.log(error.message);
    userInput = await readline.question(
      "\nSomething went wrong, try asking again\n"
    );
  }
}

把所有这些放在一起,你就有了你的助手。完整代码位于本文顶部或GitHub 上

你现在可以通过在命令行上将您的 OpenAI API 密钥作为环境传递给它来运行助手:

OPENAI_API_KEY=YOUR_API_KEY node index.js

这将开始你与助手的互动,首先询问你想要什么样的助手。一旦你声明了它,你就可以开始和它聊天了。

实验帮助我们理解

就个人而言,我实际上不确定 ChatGPT 有多有用。这显然令人印象深刻;它返回读起来就像是人类写的文本的能力令人难以置信。但是,它返回不一定正确的内容,无论它如何自信地呈现该内容。

尝试使用 ChatGPT 是我们尝试了解它的用途的唯一方法,因此构建一个像这样的简单聊天机器人为我们提供了进行该实验的基础。了解系统命令可以赋予机器人不同的个性并使其以不同的方式响应是非常有趣的。

例如,你可能听说过,你可以请求 ChatGPT 帮助你进行编程,但你也可以指定一个 JSON 结构并将其有效地用作 API。但是当你试验它时,你可能会发现它不应该是一个信息 API,而更可能是可以用来理解你的自然文本并将其转换为 JSON 对象的东西。对我来说,这是令人兴奋的,因为这意味着 ChatGPT 可以帮助创建更自然的语音助手,这些助手可以比现有的期望以更准确的方式给出命令的作物更好地翻译语音中的含义。我仍然在试验这个想法,拥有这个工具给了我这个机会。

这仅仅是个开始

如果试验这项技术对我们了解我们可以用它构建什么以及我们应该或不应该用它构建什么很重要,那么下一个目标就是让实验更容易。我的下一个目标是扩展此工具,使其可以保存、交互和编辑多个助手,以便您可以继续使用它们并随着时间的推移改进它们。

同时,您可以在 GitHub 中查看这个第一助手的完整代码,并关注以跟上改进。

原文链接:https://dzone.com/articles/create-a-cli-chatbot-with-the-chatgpt-api-and-node

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/20517.html

(0)

相关推荐

发表回复

登录后才能评论