对话任务 Beta
寻找ChatGPT? 前往chat.openai.com (opens in a new tab)。
使用OpenAI Chat API,您可以使用gpt-3.5-turbo
和 gpt-4
构建自己的应用程序,以完成以下任务:
- 起草电子邮件或其他文档
- 编写Python代码
- 回答有关一些文档的问题
- 创建对话代理人
- 为软件提供自然语言界面
- 在各种学科上进行辅导
- 翻译语言
- 为视频游戏模拟角色
并且更多
本指南说明如何调用基于聊天的语言模型的API (opens in a new tab),并分享获得良好结果的技巧。您还可以在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?"}
]
)
主要输入是消息参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“系统”、“用户”或“助手”)和内容(消息内容)。
对话可以短至一条消息,或填满许多页面。
通常,对话格式为首先是系统消息,然后是交替的用户和助手消息。
系统消息有助于设置助手的行为。在上面的示例中,助手被指示为“您是一位有帮助的助手。”。
gpt-3.5-turbo-0301 并不总是会高度关注系统消息。未来的模型将被训练以更加重视系统消息。用户消息有助于指导助手。这些消息可以由应用程序最终用户生成,也可以由开发人员设置为指令。
助手信息有助于存储以前的响应。开发人员还可以编写助手信息,以帮助提供所需行为的示例。
包括聊天历史记录有助于在用户指令提到之前的消息时保持连贯性。在上面的示例中,用户的最后一个问题:“在哪里播放?”只有在关于2020年世界大赛的先前消息的上下文中才有意义。因为模型没有记忆过去的请求,所有相关信息都必须通过对话提供。如果对话无法适应模型的令牌限制,则需要以某种方式缩短。
API响应格式 Response format
示例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
参数 (opens in a new tab)或标记限制而导致的不完整模型输出content_filter
: 由于我们的内容过滤器中的标志而省略的内容null
: API响应仍在进行中或不完整
管理标记(tokens)
语言模型会将文本读入块中,这些块称为标记(tokens)。
在英语中,标记可以短至一个字符或长至一个单词(例如:a
或apple
),
在某些语言中,标记甚至可以比一个字符还要短或比一个单词还要长。
例如,字符串"ChatGPT is great!"
被编码为六个标记:["Chat", "G", "PT", " is", " great", "!"]
。
API调用中的令牌总数影响:
- 您的API调用成本,因为您按令牌付费
- 您的API调用时间,因为编写更多令牌需要更长时间
- 在总令牌数必须低于模型的最大限制(对于
gpt-3.5-turbo-0301
,最大为4096个令牌)的情况下,您的API调用是否有效。
** 输入和输出的令牌都计入这些数量。**
例如,如果您的API调用在消息输入中使用了10个令牌,并且在消息输出中接收了20个令牌,则您将被计费30个令牌。
要查看API调用使用了多少令牌,请检查API响应中的usage
字段 (例如:response['usage']['total_tokens']
)。
像 gpt-3.5-turbo
和 gpt-4
这样的聊天模型以与其他模型相同的方式使用令牌,但由于其基于消息的格式,更难计算会话将使用多少令牌。
深入探讨计算聊天API调用的令牌
要查看文本字符串中有多少令牌而不进行API调用,请使用OpenAI的 tiktoken (opens in a new tab) Python库。 在OpenAI Cookbook的 如何使用tiktoken计数令牌 (opens in a new tab) 指南中可以找到示例代码。
每次传递给API的消息会消耗内容、角色和其他字段中的令牌数量,再加上一些后台格式化所需的额外令牌。 这可能在将来会稍微有所改变。
如果会话的令牌数太多,超过了模型的最大限制(例如gpt-3.5-turbo
的4096个令牌以上),您必须将文本截短、省略或以其他方式缩小,直到符合基本要求。
请注意,如果从消息输入中删除了一条消息,则模型将失去有关该消息的所有知识。
还要注意,非常长的会话更有可能收到不完整的回复。例如,长度为4090个令牌的gpt-3.5-turbo
对话将在仅6个令牌之后停止回复。
主导聊天模型工作
指导模型工作的最佳实践可能因模型版本而异。以下建议适用于gpt-3.5-turbo-0301
,可能不适用于未来的模型。
许多对话以系统消息开始,以便温和地指导助手。例如,以下是用于ChatGPT:的一个系统消息。
您是OpenAI训练的大型语言模型ChatGPT。请尽可能简洁地回答问题。知识截止日期: {knowledge_cutoff} 当前日期: {current_date}
通常情况下,gpt-3.5-turbo-0301
不会高度关注系统消息,因此重要的指令通常最好放在用户消息中。
如果模型生成的输出不能满足您的要求,请随意迭代并试验潜在的改进方法。您可以尝试以下方法:
- 让您的指令更加明确
- 指定您想要的回答格式
- 要求模型在确定答案之前逐步思考或辩论利弊
了解更多提示工程的想法,请查看OpenAI Cookbook关于提高可靠性的技术 (opens in a new tab)指南。
除了系统消息之外,温度(temperature)和最大令牌是开发人员可以用来影响聊天模型输出的众多选项之一。对于温度(temperature),更高的值,如0.8,会使输出更加随机,而较低的值,如0.2,会使它更加集中和确定性。
在最大令牌的情况下,如果您希望将响应限制在一定长度内,可以将最大令牌设置为任意数字。
例如,如果您将最大令牌值设置为5,这可能会导致问题,因为输出将被截断,结果对用户来说是没有意义的。
聊天与完成比较(chat-vs-completions)
由于gpt-3.5-turbo
在类似文本的能力上与text-davinci-003
表现相似,但每个令牌的价格仅为后者的10%,因此我们建议在大多数情况下使用gpt-3.5-turbo
。
对于许多开发人员来说,转换只需要重写和重新测试提示。
例如,如果您使用以下完成提示将英语翻译为法语prompt:
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}"'}
]
FAQ
gpt-3.5-turbo
可以微调吗 ?
不行。截至2023年3月1日,你只能微调基础的GPT-3模型。有关如何使用微调模型的详细信息,请参见微调指南。
你们会用我们通过API传递的数据去训练吗?
截至2023年3月1日,我们会保留您的API数据30天,但不再使用通过API发送的数据来改进我们的模型。了解更多信息,请查看我们的数据使用政策 (opens in a new tab)。
添加一个审核层
如果您想为聊天API的输出添加一个审核层,您可以按照我们的审核指南来防止显示违反OpenAI使用政策的内容。