跳转至

聊天补全 Beta

ChatGPT 由 OpenAI 最先进的语言模型 gpt-3.5-turbo 支持。

使用 OpenAI API,你可以用 gpt-3.5-turbo 构建你自己的应用程序来做以下事情:

  • 起草一封电子邮件或其他文字
  • 编写 Python 代码
  • 回答关于一组文档的问题
  • 创建会话代理
  • 给你的软件一个自然语言界面
  • 辅导各种学科
  • 翻译语言
  • 模拟角色的视频游戏和更多

本指南解释了如何对基于聊天的语言模型进行 API 调用,并分享了获得良好结果的技巧。你也可以在 OpenAI Playground 中尝试新的聊天格式。

介绍

聊天模型以一系列消息作为输入,并返回模型生成的消息作为输出。

尽管聊天格式的设计是为了简化多回合对话,但它对于没有任何对话的单回合任务同样有用(例如以前由 text-davinci-003 等指令遵循模型提供的任务)。

一个 API 调用示例如下所示:

# 注意:下面的代码需要使用OpenAI Python v0.27.0才能工作

import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "你是个很有帮助的助手。"},
        {"role": "user", "content": "谁赢得了2020年的世界职业棒球大赛?"},
        {"role": "assistant", "content": "洛杉矶道奇队在2020年赢得了世界职业棒球大赛冠军。"},
        {"role": "user", "content": "在哪里演出的?"}
    ]
)

主要输入是 messages 参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“system”, “user”, or “assistant”)和内容(消息的内容)。对话可以短到一条信息,也可以填满很多页。

通常,会话首先使用系统消息格式化,然后交替使用用户消息和助手消息。

系统消息帮助设置助手的行为。在上面的例子中,助理被告知“你是一个乐于助人的助理。”

Tips

Gpt-3.5-turbo-0301并不总是特别注意系统消息。未来的模型将被训练成对系统信息更加关注。

用户消息帮助指示助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。

辅助消息有助于存储先前的响应。它们也可以由开发人员编写,以帮助给出所需行为的示例。

当用户指示引用先前的消息时,包含会话历史将有所帮助。 在上面的例子中,用户的最后一个问题是“在哪里播放?”只有在之前关于 2020 年世界职业棒球大赛的消息中才有意义。 因为模型对过去的请求没有记忆,所以所有相关信息都必须通过对话提供。 如果会话不能符合模型的令牌限制,则需要以某种方式缩短会话。

返回: 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": "2020年世界职业棒球大赛在德克萨斯州阿灵顿的环球生活球场举行,这里是德州游骑兵队的新主场。"
      },
      "finish_reason": "stop",
      "index": 0
    }
  ]
}

在 Python 中,助手的回复可以通过 response[‘choices’][0][‘message’][‘content’] 提取出来.

每个响应都将包含一个完成原因 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 调用是否有效,因为总的令牌必须低于模型的最大限制(gpt-3.5-turbo-0301 的 4096 个令牌)

API 调用中的令牌总数影响:当你为每个令牌支付费用时,你的 API 调用需要多长时间,因为写更多令牌需要更多时间,你的 API 调用是否有效,因为总令牌必须低于模型的最大限制(gpt-3.5-turbo-0301 的 4096 个令牌)

输入和输出令牌都计入这些数量。例如,如果您的 API 调用在消息输入中使用了 10 个令牌,而您在消息输出中收到了 20 个令牌,那么您将为 30 个令牌付费。

要查看 API 调用使用了多少令牌,请检查 API 响应中的 usage 字段 (e.g., response[‘usage’][‘total_tokens’]).

要在不调用 API 的情况下查看文本字符串中有多少令牌,请使用 OpenAI 的 tiktoken Python 库。示例代码可以在 OpenAI Cookbook 关于如何使用 tiktoken 计算令牌的指南中找到。

传递给 API 的每条消息都会消耗内容、角色和其他字段中的令牌数量,以及一些用于幕后格式化的额外令牌。这种情况在未来可能会略有改变。

如果一个对话有太多的标记,无法满足模型的最大限制(例如,对于 gpt-3.5-turbo,超过 4096 个标记),您将不得不截断、省略或以其他方式缩小您的文本,直到它适合。 注意,如果从消息输入中删除消息,模型将失去对该消息的所有知识。

还要注意,非常长的对话更有可能收到不完整的回复。例如,一个 gpt-3.5-turbo 会话有 4090 个令牌,它的回复在 6 个令牌后就会被切断。

指导聊天模型

指导模型的最佳实践可能会因模型版本的不同而有所不同。以下建议适用于 gpt-3.5-turbo-0301,可能不适用于未来的型号。

许多对话都以系统消息开始,以温和地指示助手。例如,下面是 ChatGPT 使用的一个系统消息:

::: 你是 ChatGPT, OpenAI 训练的大型语言模型。回答要尽可能简洁。当前日期:{current_date}

一般来说,gpt-3.5-turbo-0301 不太关注系统消息,因此重要的指令通常更好地放在用户消息中。

如果模型不能生成您想要的输出,可以随意迭代并尝试潜在的改进。你可以尝试以下方法:

  • 让你的指示更明确
  • 指定你想要的答案格式
  • 让模型一步一步地思考,或者在确定答案之前辩论正反两方面

想要获得更多快速的工程想法,请阅读 OpenAI Cookbook 关于提高可靠性的技术指南。

除了系统消息之外,温度和最大令牌是开发人员必须影响聊天模型输出的众多选项中的两个。 对于温度,较高的值(如 0.8)将使输出更随机,而较低的值(如 0.2)将使输出更集中和确定。 对于 max 令牌,如果希望将响应限制在某个长度,则可以将 max 令牌设置为任意数字。 这可能会导致问题,例如,如果您将最大令牌值设置为 5,因为输出将被切断,结果对用户没有意义。

聊天与补全

因为 gpt-3.5-turbo 的性能与 text-davinci-003 相似,但每个令牌的价格是它的 10%,所以我们推荐在大多数情况下使用 gpt-3.5-turbo

对于许多开发人员来说,转换就像重写和重新测试提示符一样简单。

例如,如果使用以下补全提示符将英语翻译为法语:

将以下英文文本翻译成法文:"{text}" 一个等价的聊天对话可以是这样的:

1
2
3
4
[
{“role”: “system”, “content: “You are a helpful assistant that translates English to French.”},
{“role”: “user”, “content: ‘Translate the following English text to French: {text}”’}
]

或者仅仅是用户信息:

1
2
3
[
{“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发送的数据来改进我们的模型。在我们的数据使用政策中了解更多信息。

添加调节层

如果你想在聊天API的输出中添加一个审核层,你可以按照我们的审核指南来防止违反OpenAI使用策略的内容被显示出来。