文本生成模型
OpenAI 的文本生成模型(通常被称为生成式先进的变压器或大型语言模型)已经被训练以理解自然语言、代码和图像。这些模型提供文本输出作为对其输入的响应。这些模型的输入也被称为“提示”。设计提示 essentially 是如何“编程”大型语言模型模型,通常通过提供指令或成功完成任务的一些示例来实现。
使用 OpenAI 的文本生成模型,您可以构建应用程序来:
- 草稿文件
- 写计算机代码
- 回答有关知识库的问题
- 分析文本
- 给软件一个自然语言界面
- 在各种主题中进行教学
- 翻译语言
- 模拟游戏中的角色
与发布 gpt-4-turbo
同时,您现在还可以使用这些模型来处理和理解图像。
注意:gpt-4
和 gpt-3.5-turbo
模型目前处于预览阶段,可能会更改,并且可能不会按预期工作。
有关详细信息,请参阅视觉指南。
要使用这些模型,您可以通过 OpenAI API 发送包含输入和 API 密钥的请求,并接收包含模型输出的响应。我们最新的模型 gpt-4
、gpt-4-turbo-preview
和 gpt-3.5-turbo
通过聊天完成 API 端点提供。
Model Families | API Endpoint |
---|---|
Newer Models (2023–) | API Link |
Updated Legacy Models (2023) | API Link |
如果您不确定使用哪个模型,请使用 gpt-4-turbo
或 gpt-3.5-turbo
。
您可以在聊天游乐场中尝试各种模型。
聊天完成API
Chat 模型采用消息列表作为输入,并返回模型生成的消息作为输出。虽然聊天格式旨在使多轮对话易于实现,但它也适用于单轮任务,而无需进行对话。
一个 聊天完成API 调用如下所示:
import openai
openai.api_key = "sk-your-api-key"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
要模拟 ChatGPT 中看到的效果,其中文本逐步返回,请将 stream
参数设置为 true
。
聊天完成相应格式
聊天完成API 响应如下所示:
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "The 2020 World Series was played in Texas at Globe Life Field in Arlington.",
"role": "assistant"
},
"logprobs": null
}
],
"created": 1677664795,
"id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"completion_tokens": 17,
"prompt_tokens": 57,
"total_tokens": 74
}
}
助手的回复可以使用以下方式提取:
completion.choices[0].message.content
每个响应都将包含一个 finish_reason
。finish_reason
的可能值为:
stop
:API 返回完整的消息,或由提供的停止序列中的一个终止的消息length
:模型输出不完整,原因可能是由于max_tokens
参数或令牌限制function_call
:模型决定调用函数content_filter
:内容因我们的内容过滤器的标志而被省略null
:API 响应正在进行中或不完整
根据输入参数,模型响应可能包含不同的信息。
JSON 模式
一种常见的使用 Chat Completions 的方法是指示模型始终返回 JSON 对象,该对象在您的用例中有意义。虽然这在某些情况下有效,但偶尔模型会生成无法解析为有效 JSON 对象的输出。
为了防止这些错误并提高模型性能,当调用 gpt-4-turbo-preview
或 gpt-3.5-turbo-0125
时,您可以通过将 response_format
设置为 {"type": "json_object"}
来启用 JSON 模式。启用 JSON 模式后,模型仅生成可解析为有效 JSON 对象的字符串。
重要提示:
- 当使用 JSON 模式时,始终在对话中指示模型生成 JSON,方法是在系统消息中包含显式指令。如果您忘记了,API 会抛出一个错误,因为字符串
"JSON"
没有出现在上下文中。 - 如果
finish_reason
为length
,则消息可能是部分的(即被切断的),因为生成超过了max_tokens
或对话超过了令牌限制。为了保护自己,在解析响应之前,请检查finish_reason
。 - JSON 模式不保证输出匹配任何特定的架构,只保证它是有效的并且可以解析,而不会出现错误。
以下是使用 JSON 模式的示例:
import openai
openai.api_key = "sk-your-api-key"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0125",
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
print(response.choices[0].message.content)
在此示例中,响应包含一个类似于以下内容的 JSON 对象:
"content": "{\"winner\": \"Los Angeles Dodgers\"}"
请注意,当模型生成函数参数作为函数调用的一部分时,始终启用 JSON 模式。
可重现输出
聊天完成默认情况下是非确定性的(这意味着模型输出可能因请求而异)。但是,我们提供对确定性输出的某些控制,方法是提供对 seed
参数和 system_fingerprint
响应字段的访问权限。
要接收(大多数)确定性输出,您可以:
- 将
seed
参数设置为任意整数,并在希望接收确定性输出的所有请求中使用相同的值。 - 确保所有其他参数(如
prompt
或temperature
)在所有请求中都完全相同。
有时,确定性可能会受到 OpenAI 对模型配置所做的必要更改的影响。为了帮助您跟踪这些更改,我们公开了 system_fingerprint
字段。如果此值不同,则可能会看到不同的输出,原因是我们在系统上进行了更改。
要了解有关如何使用 seed
参数实现可重复的输出的更多信息,请参阅 OpenAI Cookbook 中的如何使用 seed 参数实现可重复的输出。
管理令牌
语言模型以称为令牌的块读写文本。在英语中,令牌可能只有一个字符或一个单词(例如 a
或 apple
),在某些语言中,令牌可能比一个字符更短或比一个单词更长。
例如,字符串 "ChatGPT is great!"
被编码为六个令牌:["Chat", "G", "PT", " is", " great", "!"]
。
令牌的总数会影响:
- 您的 API 调用的成本,因为您按令牌支付费用
- 您的 API 调用所需的时间,因为写入更多令牌需要更多时间
- 您的 API 调用是否有效,因为总令牌数必须低于模型的最大限制(对于
gpt-3.5-turbo
为 4097 个令牌)
输入和输出令牌都计入这些量。例如,如果您的 API 调用使用了 10 个令牌的消息输入,并且您收到了 20 个令牌的消息输出,则将按 30 个令牌计费。但是,请注意,对于某些模型,输入令牌和输出令牌的价格可能不同(有关详细信息,请参阅定价页面)。
要查看 API 调用使用了多少令牌,请检查 API 响应中的 usage
字段(例如,response['usage']['total_tokens']
)。
Chat 模型(如 gpt-3.5-turbo
和 gpt-4-turbo-preview
)使用令牌的方式与可用于完成 API 的模型相同,但是由于其基于消息的格式,因此更难计算对话将使用多少令牌。
要了解有关如何计算令牌数量的更多信息,请参阅 OpenAI Cookbook 中的如何使用 tiktoken 计算令牌。
每条消息传递给 API 时都会消耗消息中的令牌数量,角色和其他字段,加上一些用于背后格式化的额外令牌。这可能会在未来发生轻微变化。
如果对话中的令牌太多,无法适应模型的最大限制(例如,gpt-3.5-turbo
�� 4097 个令牌),则必须截断、省略或以其他方式缩小文本,直到它适合为止。请注意,如果从消息输入中删除消息,则模型将失去对它的了解。
注意,非常长的对话更有可能收到不完整的回复。例如,gpt-3.5-turbo
的对话长达 4090 个令牌将在仅仅 6 个令牌后被切断。
参数详细信息
频率和存在惩罚可用于减少采样重复令牌序列的可能性。这些参数可以在聊天完成 API 和遗留完成 API 中找到。
合理的惩罚系数值为 0.1 到 1,如果目的是仅仅减少重复采样。如果目的是强烈抑制重复,则可以将系数增加到 2,但这可能会明显降低采样的质量。负值可用于增加重复的可能性。
令牌日志概率
logprobs
参数可用于请求每个输出令牌的对数概率,以及每个令牌位置处最可能的几个令牌及其对数概率。这在某些情况下可能有助于评估模型对其输出的信心,或者检查模型可能给出的替代响应。
完成API
完成 API 端点最后在 2023 年 7 月收到更新,并具有与新聊天完成端点不同的接口。输入不是消息列表,而是自由格式的文本字符串,称为 prompt
。
遗留完成 API 调用如下所示:
import openai
openai.api_key = "sk-your-api-key"
response = openai.Completion.create(
model="gpt-3.5-turbo-instruct",
prompt="Write a tagline for an ice cream shop."
)
有关详细信息,请参阅完整的 API 参考文档。
插入文本
完成端点还支持通过提供 suffix
以及标准提示来插入文本,该提示被视为前缀。这种需求自然地出现在写长篇文章、过渡到新段落、遵循大纲或引导模型向结尾转移时。这也适用于代码,可用于在函数或文件的中间插入。
聊天完成与完成
通过构造使用单个用户消息的请求来使其类似于完成格式。例如,可以使用以下完成提示将英语翻译成法语:
Translate the following English text to French: "{text}"
等效的聊天提示如下:
[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]
同样,完成 API 可用于通过相应地格式化输入来模拟用户和助手之间的聊天。
这些 API 之间的区别在于每个 API 中可用的基础模型。聊天完成 API 是我们功能最强大的模型 (gpt-4o
) 和最具成本效益的模型 (gpt-3.5-turbo
) 的接口。
提示工程
了解使用 OpenAI 模型的最佳实践可以对应用程序性能产生重大影响。每种故障模式以及解决或纠正这些故障模式的方法并不总是直观的。有一个与语言模型相关的整个领域被称为“提示工程”,但随着该领域的发展,其范围已经超出了仅仅将提示工程设计到使用模型查询作为组件的工程系统中。要了解更多信息,请阅读我们的提示工程指南,其中介绍了改进模型推理、减少模型幻觉可能性等方法。您还可以在OpenAI Cookbook中找到许多有用的资源,包括代码示例。
常见问题解答
我应该使用哪种型号?
我们通常建议您默认使用 gpt-4o
、 gpt-4-turbo
或 gpt-3.5-turbo
。如果您的用例需要对图像和文本进行高智商或推理,我们建议您同时 gpt-4o
评估 和 gpt-4-turbo
(尽管它们具有非常相似的智能,但请注意,这 gpt-4o
既更快又更便宜)。如果您的用例需要最快的速度和最低的成本,我们建议 gpt-3.5-turbo
您使用它,因为它针对这些方面进行了优化。
gpt-4o
并且 gpt-4-turbo
也不太可能 gpt-3.5-turbo
编造信息,这种行为被称为“幻觉”。最后, gpt-4o
并且 gpt-4-turbo
有一个上下文窗口,最多支持 128,000 个令牌,而 4,096 个令牌 gpt-3.5-turbo
,这意味着他们可以一次推理更多信息。
温度参数应该如何设置?
温度值越低,输出越一致(例如 0.2),而越高,则生成的结果越多样且创造性越强(例如 1.0)。请根据您特定应用中一致性和创造性之间的期望权衡,选择温度值。温度的范围为 0 到 2。
最新型号是否可以进行微调?
请参阅微调指南,了解有关哪些型号可用于微调以及如何开始的最新信息。
是否存储传递到API的数据 ?
自 2023 年 3 月 1 日起,我们会将您的 API 数据保留 30 天,但不再使用您通过 API 发送的数据来改进我们的模型。如需了解详情,请参阅我们的数据使用政策。某些终结点提供零保留。
如何使我的应用程序更安全?
如果您想在聊天 API 的输出中添加审核层,您可以按照我们的审核指南进行操作,以防止显示违反 OpenAI 使用政策的内容。我们还鼓励您阅读我们的安全指南,了解有关如何构建更安全系统的更多信息。
我应该使用ChatGPT还是API?
ChatGPT 为我们的模型提供聊天界面和一系列内置功能,例如集成浏览、代码执行、插件等。相比之下,使用 OpenAI 的 API 提供了更大的灵活性,但需要您编写代码或以编程方式向我们的模型发送请求。