文档地址:https://platform.openai.com/docs/guides/text-generation

文本生成(Text generation)

文本生成模型现在支持JSON 模式和可重现的输出。我们还推出了Assistants API,使您能够在我们的文本生成模型之上构建类似代理的体验。通过指定 gpt-4-1106-preview 作为模型名称,可以使用 GPT-4 Turbo 预览版。

OpenAI 的文本生成模型(通常称为生成预训练转换器或大型语言模型)经过训练可以理解自然语言、代码和图像。这些模型提供文本输出来响应其输入。这些模型的输入也称为“prompts”。设计提示本质上是如何“编程”大型语言模型,通常是通过提供说明或一些如何成功完成任务的示例。

使用 OpenAI 的文本生成模型,您可以构建应用程序来:

  • 文件草案
  • 编写计算机代码
  • 回答有关知识库的问题
  • 分析文本
  • 为软件提供自然语言界面
  • 一系列科目的导师
  • 翻译语言
  • 模拟游戏角色

随着 gpt-4-vision-preview 的发布,您现在可以构建能够处理和理解图像的系统。

要通过 OpenAI API 使用其中一个模型,您需要发送包含输入和 API 密钥的请求,并接收包含模型输出的响应。我们的最新模型 gpt-4gpt-3.5-turbo 可通过聊天完成 API 端点访问。

模型 API端点
较新型号 (2023–) gpt-4, gpt-4 turbo, gpt-3.5-turbo https://api.openai.com/v1/chat/completions
更新旧模型(2023) gpt-3.5-turbo-instruct, babbage-002, davinci-002 https://api.openai.com/v1/completions
旧型号(2020–2022) text-davinci-003, text-davinci-002, davinci, curie, babbage, ada https://api.openai.com/v1/completions

您可以在聊天平台中尝试各种模型。如果您不确定要使用哪个模型,请使用 gpt-3.5-turbo 或 gpt-4

聊天完成 API

聊天模型将消息列表作为输入,并返回模型生成的消息作为输出。尽管聊天格式旨在使多轮对话变得容易,但它对于没有任何对话的单轮任务也同样有用。

聊天完成 API 调用示例如下所示:

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.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?"}
  ]
)

要了解更多信息,您可以查看聊天 API 的完整API 参考文档

主要输入是 messages 参数。消息必须是消息对象的数组,其中每个对象具有角色(“系统”、“用户”或“助理”)和内容。对话可以短至一条消息,也可以来回多次。

通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。

系统消息有助于设置助手的行为。例如,您可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,并且没有系统消息的模型的行为可能类似于使用通用消息,例如“你是一个有用的助手”。

用户消息提供助理响应的请求或评论。助理消息存储以前的助理响应,但也可以由您编写以给出所需行为的示例。

当用户指令引用之前的消息时,包含对话历史记录非常重要。在上面的示例中,用户的最后一个问题是“在哪里播放的?”仅在有关 2020 年世界职业棒球大赛的先前消息的上下文中才有意义。由于模型没有过去请求的记忆,因此所有相关信息必须作为每个请求中的对话历史记录的一部分提供。如果对话无法满足模型的令牌限制,则需要以某种方式缩短。

要模仿 ChatGPT 中迭代返回文本的效果,请将 stream 参数设置为 true。

聊天完成响应格式

聊天完成 API 响应示例如下所示:

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "The 2020 World Series was played in Texas at Globe Life Field in Arlington.",
        "role": "assistant"
      },
      "logprobs": null
    }
  ],
  "created": 1677664795,
  "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
  "model": "gpt-3.5-turbo-0613",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 17,
    "prompt_tokens": 57,
    "total_tokens": 74
  }
}

助理的回复可以通过以下方式提取:

response['choices'][0]['message']['content']

每个回复都会包含finish_reason。 finish_reason 的可能值为:

  • stop:API 返回完整消息,或由通过 stop 参数提供的停止序列之一终止的消息
  • length:由于max_tokens参数或令牌限制导致模型输出不完整
  • function_call:模型决定调用一个函数
  • content_filter:由于我们的内容过滤器中的标记而省略了内容
  • null:API 响应仍在进行中或不完整

根据输入参数,模型响应可能包括不同的信息。

JSON模式

使用聊天完成的常见方法是通过在系统消息中指定,指示模型始终返回对您的用例有意义的 JSON 对象。虽然这在某些情况下确实有效,但有时模型可能会生成无法解析为有效 JSON 对象的输出。

为了防止这些错误并提高模型性能,在调用gpt-4-1106-preview或时gpt-3.5-turbo-1106,可以将response_format设置为{ "type": "json_object" }启用JSON模式。启用 JSON 模式时,模型仅限于生成解析为有效 JSON 对象的字符串。

重要笔记:

  • 使用 JSON 模式时,请始终指示模型通过对话中的某些消息(例如通过系统消息)生成 JSON。如果您不包含生成 JSON 的显式指令,则模型可能会生成无休止的空白流,并且请求可能会持续运行,直到达到令牌限制。”JSON”为了帮助确保您不会忘记,如果该字符串没有出现在上下文中的某个位置,API 将抛出错误。
  • finish_reason 如果是,则模型返回的消息中的 JSON 可能是部分的(即被截断)length,这表示生成超出max_tokens或会话超出令牌限制。为了防止这种情况,请finish_reason 在解析响应之前进行检查。
  • JSON 模式不保证输出匹配任何特定模式,仅保证其有效且解析无错误。
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo-1106",
  response_format={ "type": "json_object" },
  messages=[
    {"role": "system", "content": "You are a helpful assistant designed to output JSON."},
    {"role": "user", "content": "Who won the world series in 2020?"}
  ]
)
print(response.choices[0].message.content)

在此示例中,响应包含一个 JSON 对象,如下所示:

"content": "{\"winner\": \"Los Angeles Dodgers\"}"

请注意,当模型生成参数作为函数调用的一部分时,JSON 模式始终处于启用状态。

可重复的输出

默认情况下,聊天完成是不确定的(这意味着模型输出可能因请求而异)。话虽这么说,我们通过让您访问种子参数和system_fingerprint响应字段来提供对确定性输出的一些控制。

要跨 API 调用接收(大部分)确定性输出,您可以:

  • 将种子参数设置为您选择的任何整数,并在您想要确定性输出的请求中使用相同的值。
  • 确保所有其他参数(如prompt或temperature)在请求中完全相同。
  • 有时,由于 OpenAI 对我们端的模型配置进行必要的更改,确定性可能会受到影响。为了帮助您跟踪这些更改,我们公开了system_fingerprint字段。如果该值不同,您可能会因我们对系统所做的更改而看到不同的输出。

确定性输出
探索 OpenAI 食谱中的新种子参数

管理Tokens

语言模型以称为标记的块的形式读取和写入文本。在英语中,标记可以短至一个字符,也可以长至一个单词(例如,aapple),而在某些语言中,标记甚至可以短于一个字符,甚至长于一个单词。

例如,字符串"ChatGPT is great!"被编码为六个标记:["Chat", "G", "PT", " is", " great", "!"]

API 调用中的令牌总数会影响:

  • 您的 API 调用费用是多少(按令牌支付)
  • API 调用需要多长时间,因为写入更多令牌需要更多时间
  • 您的 API 调用是否有效,因为令牌总数必须低于模型的最大限制(4097 个令牌 gpt-3.5-turbo)

输入和输出令牌都计入这些数量。例如,如果您的 API 调用在消息输入中使用了 10 个令牌,而您在消息输出中收到了 20 个令牌,则您将需要支付 30 个令牌。但请注意,对于某些模型,输入中的代币与输出中的代币的每个代币的价格是不同的(有关更多信息,请参阅定价页面)。

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

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

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

请注意,很长的对话更有可能收到不完整的回复。例如,长度为 4090 个令牌的 gpt-3.5-turbo 对话将在仅 6 个令牌后就被切断。

参数详情

频率和存在处罚

聊天完成 API和旧版完成 API中发现的频率和存在惩罚可用于降低对令牌重复序列进行采样的可能性。它们的工作原理是通过附加贡献直接修改 logits(非标准化对数概率)。

mu[j] -> mu[j] - c[j] * alpha_frequency - float(c[j] > 0) * alpha_presence

在哪里:

  • mu[j]是第 j 个标记的 logits
  • c[j]是在当前位置之前对该令牌进行采样的频率
  • float(c[j] > 0)如果为 1,c[j] > 0否则为 0
  • alpha_frequency是频率惩罚系数
  • alpha_presence是存在惩罚系数

正如我们所看到的,存在惩罚是一种一次性的附加贡献,适用于至少被采样一次的所有令牌,而频率惩罚是与特定令牌已经被采样的频率成正比的贡献。

如果目的只是稍微减少重复样本,那么惩罚系数的合理值约为 0.1 到 1。如果目标是强烈抑制重复,那么可以将系数增加到 2,但这会明显降低样本的质量。负值可用于增加重复的可能性。

令牌对数概率

聊天完成 API和旧版完成 API中的logprobs参数根据请求提供每个输出标记的对数概率,以及每个标记位置的有限数量的最可能的标记及其对数概率。在某些情况下,这对于评估模型对其输出的置信度或检查模型可能给出的替代响应很有用。

Completions API

Completions API 端点于 2023 年 7 月收到最终更新,并且具有与新的聊天完成端点不同的界面。输入不是消息列表,而是称为 的自由格式文本字符串 prompt

API 调用示例如下所示:

from openai import OpenAI
client = OpenAI()

response = client.completions.create(
  model="gpt-3.5-turbo-instruct",
  prompt="Write a tagline for an ice cream shop."
)

请参阅完整的API 参考文档了解更多信息。

插入文本

除了被视为前缀的标准提示之外,完成端点还支持通过提供后缀来插入文本。当编写长文本、段落之间的转换、遵循大纲或引导模型走向结局时,这种需求自然会出现。这也适用于代码,并且可用于插入到函数或文件的中间。

Completions 响应格式

完成 API 响应示例如下所示:

{
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "logprobs": null,
      "text": "\n\n\"Let Your Sweet Tooth Run Wild at Our Creamy Ice Cream Shack"
    }
  ],
  "created": 1683130927,
  "id": "cmpl-7C9Wxi9Du4j1lQjdjhxBlO22M61LD",
  "model": "gpt-3.5-turbo-instruct",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 16,
    "prompt_tokens": 10,
    "total_tokens": 26
  }
}

在 Python 中,可以使用 response['choices'][0]['text'] 提取输出。

响应格式与聊天完成 API 的响应格式类似。

Chat Completions 与 Completions 对比

通过使用单个用户消息构造请求,可以使聊天完成格式与完成格式类似。例如,可以通过以下完成提示将英语翻译成法语:

Translate the following English text to French: "{text}"

等效的聊天提示是:

[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]

同样,Completions API 可用于通过相应地格式化输入来模拟用户和助理之间的聊天。

这些 API 之间的区别在于每个 API 中可用的底层模型。Chat Completions API 是我们功能最强大的模型 (gpt-4) 和最具成本效益的模型 (gpt-3.5-turbo) 的接口。

作者:Jeebiz  创建时间:2023-12-17 00:49
最后编辑:Jeebiz  更新时间:2023-12-28 16:43