文本生成
OpenAI 提供了简单的 API 来使用大型语言模型从提示中生成文本,就像使用 ChatGPT 一样。这些模型已经在大量数据上进行了训练,以理解多媒体输入和自然语言指令。根据这些提示,模型几乎可以生成任何类型的文本响应,例如代码、数学方程式、结构化 JSON 数据或类似人类的散文。
快速入门
要生成文本,您可以使用 REST API 中的 chat completions 端点,如以下示例所示。您可以从您选择的 HTTP 客户端使用 REST API,也可以使用 OpenAI 的官方 SDK 之一作为您的首选编程语言。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import OpenAI from "openai";
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{
role: "user",
content: "Write a haiku about recursion in programming.",
},
],
});
console.log(completion.choices[0].message);
选择模型
在发出文本生成请求时,要配置的第一个选项是要生成响应的模型。您选择的模型会极大地影响输出,并影响每次生成请求的成本。
- 像
gpt-4o
这样的大型模型将提供非常高的智能水平和强大的性能,同时具有更高的每个令牌成本。 - 像
gpt-4o-mini
这样的小型模型提供的智能水平不如大型模型,但每个代币更快、更便宜。 - 像
o1
系列模型这样的推理模型返回结果的速度较慢,并且使用更多的标记来“思考”,但能够进行高级推理、编码和多步骤规划。
在 Playground 中尝试不同的模型,看看哪一种最适合您的提示!有关选择型号的更多信息,也可以在这里找到。
构建提示
制作提示以从模型获得正确输出的过程称为提示工程。通过为模型提供精确的说明、示例和必要的上下文信息(例如模型训练数据中未包含的私有或专业信息),您可以提高模型输出的质量和准确性。在这里,我们将介绍一些关于构建提示的高级指导,但您可能还会发现提示工程指南很有帮助。
在聊天补全 API 中,您可以通过提供包含模型说明的数组来创建提示。每条消息可以具有不同的 ,这会影响模型如何解释输入。messages
role
用户消息
用户消息包含请求模型的特定类型输出的指令。您可以将消息视为您作为最终用户可能键入到 ChatGPT 的消息。user
下面是一个用户消息提示示例,它要求模型根据提示生成一首俳句诗。gpt-4o
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Write a haiku about programming."
}
]
}
]
});
系统消息
具有该角色的消息充当模型的顶级指令,通常描述模型应该做什么以及它通常应该如何行为和响应。system
下面是一个系统消息示例,该消息在生成对消息的响应时修改模型的行为:user
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
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "system",
"content": [
{
"type": "text",
"text": `
You are a helpful assistant that answers programming questions
in the style of a southern belle from the southeast United States.
`
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Are semicolons optional in JavaScript?"
}
]
}
]
});
此提示以请求的修辞风格返回文本输出:
1
2
3
4
5
6
7
8
Well, sugar, that's a fine question you've got there! Now, in the world of
JavaScript, semicolons are indeed a bit like the pearls on a necklace – you
might slip by without 'em, but you sure do look more polished with 'em in place.
Technically, JavaScript has this little thing called "automatic semicolon
insertion" where it kindly adds semicolons for you where it thinks they
oughta go. However, it's not always perfect, bless its heart. Sometimes, it
might get a tad confused and cause all sorts of unexpected behavior.
Google 助理消息
具有该角色的消息被假定为由模型生成,可能是在上一代请求中(请参阅下面的“对话”部分)。它们还可用于为模型提供示例,说明它应该如何响应当前请求 - 这种技术称为小样本学习。assistant
下面是一个使用助手消息捕获上一个文本生成结果的结果,并基于该结果发出新请求的示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "user",
"content": [{ "type": "text", "text": "knock knock." }]
},
{
"role": "assistant",
"content": [{ "type": "text", "text": "Who's there?" }]
},
{
"role": "user",
"content": [{ "type": "text", "text": "Orange." }]
}
]
});
为模型提供额外的数据以用于生成
上述消息类型还可用于向模型提供可能超出其训练数据的其他信息。您可能希望包含数据库查询、文本文档或其他资源的结果,以帮助模型生成相关响应。这种技术通常被称为检索增强生成 (RAG)。在此处了解有关 RAG 技术的更多信息。
对话和上下文
虽然每个文本生成请求都是独立且无状态的(除非您使用的是助手),但您仍然可以通过向文本生成请求提供其他消息作为参数来实现多轮次对话。考虑上面显示的 “knock knock” 笑话示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "user",
"content": [{ "type": "text", "text": "knock knock." }]
},
{
"role": "assistant",
"content": [{ "type": "text", "text": "Who's there?" }]
},
{
"role": "user",
"content": [{ "type": "text", "text": "Orange." }]
}
]
});
通过使用交替 和 消息,您可以在对模型的一个请求中捕获会话的先前状态。user
assistant
管理文本生成的上下文
随着您的输入变得越来越复杂,或者您在对话中包含越来越多的轮次,您将需要考虑输出标记和Context window限制。模型输入和输出以令牌计量,这些令牌从输入中解析以分析其内容和意图,并组合以呈现逻辑输出。模型对在文本生成请求的生命周期内可以使用的令牌数量有限制。
- 输出令牌是模型为响应提示而生成的令牌。每个模型都支持不同的输出令牌限制,如此处所述。例如,最多可以生成 16,384 个输出令牌。
gpt-4o-2024-08-06
- Context window描述了可用于 input token(对于某些模型,还包括推理token)的 token 总数,此处记录了这些token。例如,具有 128k 个令牌的总上下文窗口。
gpt-4o-2024-08-06
如果您创建一个非常大的提示(通常是通过包含大量对话上下文或模型的其他数据/示例),则可能会超出为模型分配的上下文窗口,这可能会导致输出被截断。
你可以使用分词器工具(使用 tiktoken 库)来查看字符串中存在多少个词元。
优化模型输出
在迭代提示时,您将不断尝试提高准确性、成本和延迟。
目标 | 可用技术 | |
---|---|---|
准确性 |
确保模型对您的提示产生准确且有用的响应。 |
准确的响应要求模型具有所需的所有信息 生成响应,并且知道如何创建响应 (从解释输入到格式设置和样式设置)。通常,这将 需要 prompt engineering、RAG、 以及模型微调。 |
成本 |
通过减少代币使用并尽可能使用更便宜的模型来降低模型使用的总成本。 |
为了控制成本,您可以尝试使用更少的代币或更小、更便宜的模型。在此处了解有关优化成本的更多信息。 |
延迟 |
减少生成对提示的响应所需的时间。 |
优化延迟是一个多方面的过程,包括提示工程、 您自己的代码中的并行度,等等。在此处了解更多信息。 |
后续步骤
文本生成中还有更多内容需要探索 - 这里有一些资源可以更深入地了解。
从各种使用案例的示例提示中获得灵感。
使用 Playground 开发和迭代提示。
说明书包含涵盖各种使用案例的复杂示例。
确保从模型发出的 JSON 数据符合 JSON 架构。
在 API 参考中查看文本生成的所有选项。