今天这篇文章,我们再来分享一个关于构建 ChatGPT 的 GPT-4 聊天机器人的过程,其中包含分步说明和完整的代码片段。我将介绍有关 GPT-4 API 的基本信息,并提供实用的见解来帮助您创建一个功能强大、引人入胜的聊天机器人。

在昨天我们跟大家分享了关于GPT-3.5模型的初学者教程指南《OpenAI 的 GPT-3.5-Turbo 模型初学者指南》,今天这篇文章,我们再来分享一个关于构建 ChatGPT 的 GPT-4 聊天机器人的过程,其中包含分步说明和完整的代码片段。我将介绍有关 GPT-4 API 的基本信息,并提供实用的见解来帮助您创建一个功能强大、引人入胜的聊天机器人。

我们将深入研究模型定价,探索聊天完成令牌的确切计算方式。此外,我将讨论 GPT-3.5-turbo 和 GPT-4 之间的区别,比较它们的性能,让您全面了解 GPT-4 必须提供的功能。


1.了解 GPT-4 模型

如果您阅读了本文教程,您很可能已经熟悉 OpenAI 和 ChatGPT。GPT 模型 API 允许像我们这样的开发人员访问和使用 GPT 系列中的预训练语言模型,例如 GPT-4 和 GPT-3.5-turbo。这些模型能够生成类似人类的文本,执行自然语言处理任务,并支持广泛的相关应用。

GPT-4 是 OpenAI 的 GPT 模型家族中最新且功能最强大的成员。OpenAI 声称 GPT-4 在大多数测试基准中都超过了 ChatGPT,这意味着我们有更好的机会实现我们想要的结果。

此外,它还具有改进的安全功能。然而,GPT-4 并不是 GPT 模型的全部和终结,并不意味着我们应该立即停止使用其他模型。我将在本教程后面的与 GPT-3.5-turbo 的比较部分进一步讨论这一点。

2.获得对 GPT-4 模型的访问权限

在撰写本教程时,公众可以通过两种方式访问 GPT-4 模型。

ChatGPT Plus 订阅:通过订阅 ChatGPT Plus,您将获得对 GPT-4 的有限访问权限。此订阅允许用户每 3 小时发送 25 条聊天消息。

GPT-4 API(仅限受邀者):目前只有受邀者才能通过等候名单访问 GPT-4 API。我在注册后大约 48 小时收到了我的邀请邮件。

请记住,可用性可能会随着时间的推移而改变,因此请确保及时了解 OpenAI 的公告。

3.使用 GPT-4 模型构建聊天机器人

升级到新的 GPT-4 模型 API 非常简单,因为它使用与 GPT-3.5-turbo 相同的聊天完成方法。如果我们有权访问,我们可以期望我们现有的代码能够与 GPT-4 无缝协作。

在本教程中,我将演示如何在 Node.js 中使用 GPT-4 API 构建聊天机器人。但是,相同的概念适用于您选择的其他编程语言。

如果您不确定提示完成和聊天完成的概念,请务必查看 GPT-3.5-Turbo 教程《OpenAI 的 GPT-3.5-Turbo 模型初学者指南》,我在其中提供了两者的详细比较和示例。

在继续之前,请确保您已获取 OpenAI API 密钥并相应地设置您的项目。

现在我们已经掌握了基础知识,让我们开始构建我们的 GPT-4 支持的聊天机器人。

4.安装必要的 NPM 包

npm install dotenv openai chalk1.

这些库有以下用途:

  • dotenv:允许我们将 API 密钥安全地存储为环境变量。

  • openai:用于轻松调用 OpenAI 模型 API 的官方 Node.js 库。

  • chalk:由于我们正在构建一个在我们的终端中运行的聊天机器人,我们将使用 Chalk 为对话添加一些风格,使其更具可读性和视觉吸引力。

  • readline:一个内置的 Node.js 库,我们将使用它来读取用户输入,从而可以轻松地通过命令行与我们的聊天机器人进行交互。

代码片段:打造您的聊天机器人

// index.js // 导入所需的库import dotenv from "dotenv";import { Configuration, OpenAIApi } from "openai";import readline from "readline";import chalk from "chalk";// Load environment variablesdotenv.config();// Initialize the OpenAI API clientconst openai = new OpenAIApi(  new Configuration({ apiKey: process.env.OPENAI_API_KEY })
);// Create a readline interface for user inputconst rl = readline.createInterface({  input: process.stdin,  output: process.stdout});// Define an array to store the conversation messagesconst GPTMessages = [];// Set the model name; replace with other model names if neededconst modelName = "gpt-4"; // "gpt-3.5-turbo"// Define an async function to call the GPT APIconst GPT = async (message) => {  // Call the GPT API with the model, messages, and max tokens
  const response = await openai.createChatCompletion({    model: modelName,    messages: message,    max_tokens: 100,
  });  // Return the response content and the total number of tokens used
  return {    content: response.data.choices[0].message.content,    tokensUsed: response.data.usage.total_tokens,
  };
};// Define a function to ask the user a question and handle their inputconst askUserQuestion = (role) => {  // Set the prompt text based on the role (system or user)
  const prompt = role === "system" ? "Enter system message: " : "Enter your question: ";  // Ask the user a question and process their input
  rl.question(prompt, async (userInput) => {    // Add the user's input to the GPTMessages array
    GPTMessages.push({ role: role, content: userInput });    // If the input is a system message, ask the user for their question
    if (role === "system") {      askUserQuestion("user");
    } else {      // Call the GPT function with the current conversation messages
      const assistantResponse = await GPT(GPTMessages);      // Add the assistant's response to the GPTMessages array
      GPTMessages.push({ role: "assistant", content: assistantResponse.content });      // Display the assistant's response and the number of tokens used
      console.log(chalk.yellow("-----"));      console.log(chalk.green("Assistant: "), assistantResponse.content);      console.log(chalk.cyan("Tokens used: "), assistantResponse.tokensUsed);      // Ask the user another question
      askUserQuestion("user");
    }
  });
};// Display the model name and begin the conversationconsole.log(`### I'm ${chalk.blue(modelName.toUpperCase())}. ####`);askUserQuestion("system");1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.

要有效地使用聊天完成构建聊天机器人,请按照以下步骤操作:

  1. 为用户输入和输出做准备:我们为聊天机器人设置了一种方式来接收来自用户的消息,并使用“readline”库通过命令行发送响应。

  2. 跟踪对话:我们创建一个名为 GPTMessages 的数组来存储用户和聊天机器人之间交换的消息。我们还在 modelName 变量中指定要使用的 GPT 模型(例如 GPT-3.5-turbo 或 GPT-4)。

  3. 制作聊天机器人功能:我们创建一个名为 GPT 的功能,它将用户的消息发送到 OpenAI API 并接收响应。它还会跟踪聊天机器人在其响应中使用了多少令牌,并返回内容和令牌使用情况。

  4. 创建来回对话:我们构建一个名为 askUserQuestion 的函数,它要求用户输入,将输入保存在 GPTMessages 数组中,并通过调用 GPT 函数获取聊天机器人的响应。然后它使用“chalk”库以格式良好的方式显示聊天机器人的响应。

  5. 启动聊天机器人:我们输入一条欢迎消息,让用户知道他们正在与哪个聊天机器人聊天。然后,我们通过使用初始消息的“系统”角色调用 askUserQuestion 函数来开始对话。

提示:在写这篇文章的时候,GPT-4 模型有点不稳定,你会经常看到服务器错误、使用限制问题。我建议你为 GPT 函数实现一个自动重试功能,如果服务器没有返回状态 200,它允许应用程序延迟重试 API 调用。这个自动重试功能应该有配置最大值的选项 重试次数和重试之间的延迟。

5.GPT-4 聊天机器人在行动:一个演示

下面是我们的聊天机器人的一个例子,展示了它如何有效地回答问题并在整个聊天过程中保持对话的上下文。请注意,由于 max_tokens 设置为 100,部分响应可能会被截断,您可以根据您的要求进行调整。

请注意,在此实现中,根据邀请电子邮件,对话会话的最大令牌限制为 8k。不过,OpenAI 还有一个 32k 的 GPT-4 模型,可以一次性生成多达 50 页的文本。截至目前,似乎还无法访问此模型,或者可能仅适用于他们的企业合作伙伴。

当您使用提供的代码运行聊天机器人时,您可以与模型进行对话,它会记住聊天记录以相应地回答新问题。这有助于为与聊天机器人交互的用户创造更加无缝和自然的对话体验。

当您测试聊天机器人并探索其功能时,您会发现 GPT-4 相对于之前模型的改进,包括更好的响应质量、上下文理解和安全功能(值得商榷