入门文档(docs)
指南(Guides)
聊天指南(Chat Guide)

对话任务 Beta

寻找ChatGPT? 前往chat.openai.com (opens in a new tab)

使用OpenAI Chat API,您可以使用gpt-3.5-turbogpt-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_reasonfinish_reason的可能值为:

  • stop: API返回完整的模型输出。
  • length: 由于max_tokens参数 (opens in a new tab)或标记限制而导致的不完整模型输出
  • content_filter: 由于我们的内容过滤器中的标志而省略的内容
  • null: API响应仍在进行中或不完整

管理标记(tokens)

语言模型会将文本读入块中,这些块称为标记(tokens)。 在英语中,标记可以短至一个字符或长至一个单词(例如:aapple), 在某些语言中,标记甚至可以比一个字符还要短或比一个单词还要长。

例如,字符串"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-turbogpt-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使用政策的内容。