ChatGPT由gpt-3.5-turbo驱动,这是OpenAI最先进的语言模型。
使用OpenAI的API,你可以用gpt-3.5-turbo建立你自己的应用程序,做一些事情。
- 起草电子邮件或其他文章
- 编写Python代码
- 回答关于一组文件的问题
- 创建对话式代理
- 给你的软件一个自然语言界面
- 辅导一系列的科目
- 翻译语言
- 模拟视频游戏中的人物,以及更多
- 本指南解释了如何为基于聊天的语言模型进行API调用,并分享了获得良好结果的技巧。你也可以在OpenAI游乐场中试验新的聊天格式。
简介
聊天模型将一系列消息作为输入,并将模型生成的消息作为输出。
虽然聊天格式的设计是为了使多轮对话变得简单,但它对没有任何对话的单轮任务也同样有用(比如之前由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条消息,也可以写满很多页。
通常情况下,对话的格式是先有系统消息,然后是交替出现的用户和助手消息。
系统消息有助于设定助手的行为。在上面的例子中,助理被指示为 "你是一个有帮助的助理"。
gpt-3.5-turbo-0301并不总是对系统信息给予强烈关注。未来的模型将被训练成对系统信息的更强关注。
用户信息有助于指导助手。它们可以由应用程序的终端用户生成,也可以由开发人员设置为指令。
助理信息帮助存储先前的反应。它们也可以由开发人员编写,以帮助提供所需行为的例子。
当用户指令参考先前的信息时,包括对话历史有助于。在上面的例子中,用户的最后一个问题 "在哪里播放的?"只有在先前关于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['choice'][0]['message']['content']来提取助手的回复。
每个响应都会包括一个 finish_reason。finish_reason的可能值是:
- stop: API返回完整的模型输出
- length: 由于max_tokens参数或token限制,模型输出不完整
- content_filter: 由于我们的内容过滤器的一个标志而遗漏了内容
- null: API响应仍在进行中或不完整
管理tokens
语言模型以称为 "token"的块来读取文本。在英语中,一个token可以短到一个字符或长到一个单词(例如,a或apple),而在一些语言中,token甚至可以短于一个字符或长于一个单词。
例如,字符串 "ChatGPT is great!"被编码为六个标记:["Chat", "G", "PT", " is", " great", "!"]。
一个API调用中的token总数会影响到。
- 你的API调用费用是多少,因为你是按token付费的
- 你的API调用需要多长时间,因为编写更多的token需要更多的时间
- 你的API调用是否有效,因为token总数必须低于模型的最大限制(gpt-3.5-turbo-0301的4096token)。
- 输入和输出token都算在这些数量里。例如,如果你的API调用在信息输入中使用了10个token,而你在信息输出中收到了20个代币,你将被收取30个token的费用。
要查看一个API调用使用了多少token,请检查API响应中的使用情况字段(例如,response['usage']['total_tokens']))。
像gpt-3.5-turbo这样的聊天模型使用token的方式与其他模型相同,但由于其基于消息的格式,更难以计算一个对话将使用多少token。
指导聊天模型
指导模型的最佳做法可能会因模型版本而改变。下面的建议适用于 gpt-3.5-turbo-0301,可能不适用于未来的模型。
许多对话以系统信息开始,以温和地指导助手。例如,这里是用于 ChatGPT 的系统消息之一。
You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible. Knowledge cutoff: {knowledge_cutoff} Current date: {current_date}
一般来说,gpt-3.5-turbo-0301不会强烈关注系统消息,因此重要的指示往往放在用户消息中更好。
如果模型没有产生你想要的输出,请随意迭代并尝试潜在的改进。你可以尝试以下方法。
使你的指令更加明确
指定你希望答案的格式
要求模型一步一步地思考,或在确定答案之前辩论利弊
关于更多提示工程的想法,请阅读OpenAI Cookbook关于提高可靠性的技术指南。
在系统消息之外,temperature and max tokens是开发者影响聊天模型输出的众多选项中的两个。对于temperature ,较高的值如0.8会使输出更加随机,而较低的值如0.2会使其更加集中和确定。在最大tokens的情况下,如果你想把响应限制在一定的长度内,最大令牌可以被设置为一个任意的数字。这可能会引起一些问题,例如,如果你将最大标记值设置为5,因为输出会被切断,结果对用户来说没有意义。
Chat vs Completions
因为gpt-3.5-turbo的性能与text-davinci-003相似,但每个token的价格却只有10%,所以我们推荐gpt-3.5-turbo用于大多数使用情况。
对于许多开发者来说,过渡就像重写和重新测试一个提示符一样简单。
例如,如果你把英语翻译成法语,有以下的完成度提示。
Translate the following English text to French: "{text}"
一个相当的Chat对话可能看起来像
[
{"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}"'}
]