下面代码来自官方文档,使用了 openai 这个 npm 包,这个包是官方提供的,可以直接使用。
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,输入下面内容:
解释一下这段代码:
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 自动生成
这段代码使用 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 创建自己的应用程序来执行以下操作:
你还可以在 OpenAI Playground 中尝试各种聊天参数和格式。
聊天模型以一系列消息作为输入,并返回由模型生成的消息作为输出。
尽管聊天格式使多轮对话变得容易,但它同样适用于没有任何对话的单轮任务。一个 API 调用的示例如下:
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
方法中最重要的参数,该参数包含多个消息对象。每个消息都有一个角色,可以是 system
、user
、assistant
中的任意一个。
user
:代表用户发送的消息,即用户输入的问题或者指令。在上述代码中,第二个和第四个消息都是 user 类型的。
assistant
:代表聊天机器人通过调用 AI 算法给出的回答或者响应。在上述代码中,第三个消息就是一个 assistant 类型的消息。
system
:代表系统或者客户端通过代码发出的消息。系统消息的目的是给 assistant 提供进一步的指导或者指示,从而让 assistant 作出更好的响应。
一个聊天记录以 system
类型的消息开始,接着是交替的 user
和 assistant
类型的消息。system
类型的消息可以帮助设置 assistant
的行为,指导它应该如何回答用户的问题,例如上述示例中的系统消息”你是一个非常实用的 AI 助手”就告诉 assistant
自己是一个实用的助手。
整个消息列表可以非常短,只有一个消息,也可以非常长,占据数页。
在聊天机器人交互中,聊天历史记录也很重要,因为用户的指令可能需要引用之前的消息信息。在上述代码示例中,用户的最后一个问题“冠军是谁?”只有在之前的消息中提到2022年世界杯时才有意义。
由于机器学习模型没有以前请求的记忆,因此必须通过对话提供所有相关信息。如果一个对话不能适合模型 Token 限制内,就需要做一些缩短处理。