聊天补全
使用 OpenAI 聊天 API,您可以构建自己的应用程序并执行以下操作:gpt-3.5-turbo``gpt-4
- 起草电子邮件或其他文章
- 编写蟒蛇代码
- 回答有关一组文档的问题
- 创建会话代理
- 为您的软件提供自然语言界面
- 一系列科目的导师
- 翻译语言
- 模拟视频游戏的角色 等等
本指南介绍了如何对基于聊天的语言模型进行 API 调用,并分享了获得良好结果的技巧。您还可以在OpenAI Playground中尝试新的聊天格式。
介绍
聊天模型将一系列消息作为输入,并返回模型生成的消息作为输出。
尽管聊天格式旨在简化多轮对话,但它对于没有任何对话的单轮任务同样有用(例如以前由指令遵循模型提供的任务),例如 )。text-davinci-003
示例 API 调用如下所示:
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
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?"}
]
)
主要输入是消息参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“系统”、“用户”或“助手”)和内容(消息的内容)。对话可以短至 1 条消息或填满许多页面。
通常,对话的格式首先是系统消息,然后是交替的用户和助理消息。
系统消息有助于设置助手的行为。在上面的例子中,助理被指示“你是一个乐于助人的助手”。
用户消息有助于指示助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。
助理消息有助于存储先前的响应。它们也可以由开发人员编写,以帮助提供所需行为的示例。
当用户说明引用以前的消息时,包括对话历史记录会有所帮助。在上面的例子中,用户的最后一个问题“在哪里玩?”只有在之前关于2020年世界大赛的消息的上下文中才有意义。由于模型没有过去请求的记忆,因此必须通过对话提供所有相关信息。如果对话无法适应模型的令牌限制,则需要以某种方式缩短它。
响应格式
示例 API 响应如下所示:
{
'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
'object': 'chat.completion',
'created': 1677649420,
'model': 'gpt-3.5-turbo',
'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
'choices': [
{
'message': {
'role': 'assistant',
'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
'finish_reason': 'stop',
'index': 0
}
]
}
在 Python 中,助手的回复可以用 .response['choices'][0]['message']['content']
每个响应都将包含 .的可能值为:finish_reason``finish_reason
stop
:API 返回完整的模型输出length
:由于参数或令牌限制max_tokens
模型输出不完整content_filter
:由于内容过滤器中的标志而遗漏了内容null
:API 响应仍在进行中或不完整
管理令牌
语言模型以称为标记的块的形式读取文本。在英语中,标记可以短至一个字符或长至一个单词(例如,或),在某些语言中,标记甚至可以短于一个字符,甚至长于一个单词。a
apple
例如,字符串编码为六个标记:。"ChatGPT is great!"``["Chat", "G", "PT", " is", " great", "!"]
API 调用中的令牌总数会影响:
- 您的 API 调用费用(按每个代币支付)
- 您的 API 调用需要多长时间,因为写入更多令牌需要更多时间
- 您的 API 调用是否有效,因为总代币必须低于模型的最大限制(4096 个代币
gpt-3.5-turbo-0301
)
输入和输出令牌都计入这些数量。例如,如果您的 API 调用在消息输入中使用了 10 个令牌,而您在消息输出中收到了 20 个令牌,则需要支付 30 个令牌的费用。
要查看 API 调用使用了多少令牌,请检查 API 响应中的字段(例如,)。usage``response['usage']['total_tokens']
聊天模型喜欢和使用令牌的方式与其他模型相同,但由于其基于消息的格式,因此更难计算对话将使用多少令牌。gpt-3.5-turbo``gpt-4
要在不进行 API 调用的情况下查看文本字符串中有多少个令牌,请使用 OpenAI 的 tiktoken Python 库。示例代码可以在 OpenAI 食谱的指南中找到,了解如何使用 tiktoken 计算代币。
传递给 API 的每条消息都会消耗内容、角色和其他字段中的令牌数量,以及一些用于后台格式化的额外令牌。将来可能会略有变化。
如果对话的标记过多,无法适应模型的最大限制(例如,超过 4096 个标记),则必须截断、省略或以其他方式缩小文本,直到它适合为止。请注意,如果从消息输入中删除消息,模型将失去对它的所有了解。gpt-3.5-turbo
另请注意,很长的对话更有可能收到不完整的回复。例如,长度为 4090 个令牌的对话将在仅 6 个令牌后将其回复截断。gpt-3.5-turbo
指导聊天模型
指导模型的最佳做法可能会因模型版本而异。以下建议适用于 gpt-3.5-turbo-0301,可能不适用于未来的型号。
许多对话都以系统消息开始,以温和地指示助手。例如,以下是用于 ChatGPT 的系统消息之一:
你是ChatGPT,一个由OpenAI训练的大型语言模型。回答尽可能简洁。知识截止:{knowledge_cutoff} 当前日期:{current_date}
一般来说,系统消息并不十分注意,因此重要的指令往往最好放在用户消息中。gpt-3.5-turbo-0301
如果模型未生成所需的输出,请随意迭代并尝试潜在的改进。您可以尝试以下方法:
- 让您的指示更明确
- 指定您想要答案的格式
- 要求模型逐步思考或在确定答案之前辩论利弊
有关更多及时的工程想法,请阅读有关提高可靠性技术的 OpenAI 食谱指南。
除了系统消息之外,温度和最大令牌是开发人员必须影响聊天模型输出的众多选项中的两个。对于温度,较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定。对于最大令牌,如果要将响应限制为特定长度,则可以将最大令牌设置为任意数字。例如,如果将最大令牌值设置为 5,这可能会导致问题,因为输出将被切断,并且结果对用户没有意义。
聊天与完成
由于执行的功能与每个代币的价格相似,但价格为每个代币的 10%,因此我们建议用于大多数用例。gpt-3.5-turbo``text-davinci-003``gpt-3.5-turbo
对于许多开发人员来说,转换就像重写和重新测试提示一样简单。
例如,如果您使用以下完成提示将英语翻译成法语:
Translate the following English text to French: "{text}"
等效的聊天对话可能如下所示:
[
{"role": "system", "content": "You are a helpful assistant that translates English to French."},
{"role": "user", "content": 'Translate the following English text to French: "{text}"'}
]
甚至只是用户消息:
[
{"role": "user", "content": 'Translate the following English text to French: "{text}"'}
]
常见问题
是否可以对 进行微调?gpt-3.5-turbo
不。自 1 年 2023 月 3 日起,您只能微调基本 GPT-<> 型号。有关如何使用微调模型的更多详细信息,请参阅微调指南。
是否存储传递到 API 中的数据?
自 1 年 2023 月 30 日起,我们会将您的 API 数据保留 <> 天,但不再使用您通过 API 发送的数据来改进我们的模型。如需了解详情,请参阅我们的数据使用政策。
添加审核层
如果您想在聊天 API 的输出中添加审核层,您可以按照我们的审核指南来防止显示违反 OpenAI 使用策略的内容。