第一段代码

下面代码来自官方文档,使用了 openai 这个 npm 包,这个包是官方提供的,可以直接使用。

hello.js
const { Configuration, OpenAIApi } = require("openai");

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

const completion = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [{role: "user", content: "Hello world"}],
});
console.log(completion.data.choices[0].message);

这段代码什么意思呢?

在之前的章节中,我们已经成功注册了 ChatGPT 和 OpenAI 的账号,现在我们可以使用它们了。打开 ChatGPT,输入下面内容:

ChatGPT 输入
解释一下这段代码:

const { Configuration, OpenAIApi } = require("openai");

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

const completion = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [{role: "user", content: "Hello world"}],
});
console.log(completion.data.choices[0].message);

ChatGPT 会返回下面内容:

下面内容由 ChatGPT 自动生成

ChatGPT 输出
这段代码使用 OpenAI 的 JavaScript 客户端库来调用 OpenAI API,对消息进行自然语言处理。

以下是每行代码的解释:

1. `const { Configuration, OpenAIApi } = require("openai");`

    引入 OpenAI 的 JavaScript 客户端库中的 `Configuration` 和 `OpenAIApi` 类,以便可以使用 OpenAI API。

2. `const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, });`

    创建了一个 OpenAI Configuration 实例,该实例包含用于调用 OpenAI API 的 apiKey 信息。其中,apiKey 存储在环境变量 OPENAI_API_KEY 中。

3. `const openai = new OpenAIApi(configuration);`

    通过上一步创建的 `Configuration` 实例,创建了一个连到 OpenAI API 的 `OpenAIApi` 实例(即客户端)。

4. `const completion = await openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: [{role: "user", content: "Hello world"}], });`

    调用 `openai.createChatCompletion()` 方法,创建一个聊天完成请求,该方法的参数对象包含以下信息:

    - `model`:指定使用的模型。
    -` messages`:一个包含角色和内容字段的数组,表示一组指示请求意图的消息。

    `createChatCompletion()` 方法返回一个带有 OpenAI API 的响应的 `Promise`。`await` 关键字将等待新 `Promise` 解决后继续执行代码。

5. `console.log(completion.data.choices[0].message);`

    输出调用 OpenAI API 的响应文本,文本内容在响应的 `choices` 属性中,而在此次调用中只有一个选择。而 `completion.data.choices[0].message` 是响应文本的实际内容。

概述

通过 OpenAI Chat API,你可以使用 gpt-3.5-turbo 和 gpt-4 创建自己的应用程序来执行以下操作:

  • 撰写电子邮件或其他文本
  • 编写 Python/Nodejs/Deno 代码
  • 回答问题
  • 创建聊天机器人
  • 在软件中提供自然语言接口
  • 翻译语言

你还可以在 OpenAI Playground 中尝试各种聊天参数和格式。

说明

聊天模型以一系列消息作为输入,并返回由模型生成的消息作为输出。

尽管聊天格式使多轮对话变得容易,但它同样适用于没有任何对话的单轮任务。一个 API 调用的示例如下:

chat.js
import { Configuration, OpenAIApi } from "openai";

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

const completion = await openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [
    { role: "system", content: "你是一个非常实用的 AI 助手" },
    { role: "user", content: "2022世界杯在哪儿举行?" },
    { role: "assistant", content: "2022年世界杯将在卡塔尔举行。" },
    { role: "user", content: "冠军是谁?" },
  ],
});

console.log(completion.data.choices[0]);

messages 参数是 createChatCompletion 方法中最重要的参数,该参数包含多个消息对象。每个消息都有一个角色,可以是 systemuserassistant 中的任意一个。

  • user:代表用户发送的消息,即用户输入的问题或者指令。在上述代码中,第二个和第四个消息都是 user 类型的。

  • assistant:代表聊天机器人通过调用 AI 算法给出的回答或者响应。在上述代码中,第三个消息就是一个 assistant 类型的消息。

  • system:代表系统或者客户端通过代码发出的消息。系统消息的目的是给 assistant 提供进一步的指导或者指示,从而让 assistant 作出更好的响应。

一个聊天记录以 system 类型的消息开始,接着是交替的 userassistant 类型的消息。system 类型的消息可以帮助设置 assistant 的行为,指导它应该如何回答用户的问题,例如上述示例中的系统消息”你是一个非常实用的 AI 助手”就告诉 assistant 自己是一个实用的助手。

整个消息列表可以非常短,只有一个消息,也可以非常长,占据数页。

在聊天机器人交互中,聊天历史记录也很重要,因为用户的指令可能需要引用之前的消息信息。在上述代码示例中,用户的最后一个问题“冠军是谁?”只有在之前的消息中提到2022年世界杯时才有意义。

由于机器学习模型没有以前请求的记忆,因此必须通过对话提供所有相关信息。如果一个对话不能适合模型 Token 限制内,就需要做一些缩短处理。