OpenAI API - Text generation models 的概念与使用(一)

目录

前言

概念定义

1. Chat Completions API

2. JSON mode

3. Reproducible outputs

未完成内容包括


前言

        此篇文章基于OpenAI 官方文档,用中文的方式为大家讲解 Text generation models(文本生成模型),有需要的朋友可以收藏方便后续的学习和使用

概念定义

        什么是 Text generation models 

        OpenAI的文本生成模型(通常称为生成式预训练变换器或大型语言模型)经过训练,能够理解自然语言、代码和图像。这些模型根据输入生成文本输出。输入给这些模型的文本也被称为“提示词”(prompts)。设计提示词实际上就是如何“编程”大型语言模型,通常通过提供指令或一些成功完成任务的示例来实现。

1. Chat Completions API

        Chat模型以消息列表作为输入,并返回模型生成的消息作为输出。虽然聊天格式旨在使多轮对话变得简单,但它同样适用于没有任何对话的单轮任务。

一个示例的Chat Completions 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?"}
  ]
)

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

主要的输入是messages参数。messages必须是一个消息对象的数组,其中每个对象都有一个角色("system"、"user"或"assistant")和内容。对话可以只包含一个消息,也可以包含许多往返的轮次。

通常,对话格式是先有一个系统消息,然后是用户和助手消息交替出现。

系统消息有助于设置助手的行为。例如,你可以修改助手的个性或提供具体的指示,说明它在整个对话中的行为方式。然而,请注意,系统消息是可选的,即使没有系统消息,模型的行为可能类似于使用“你是一个有帮助的助手”这样的通用消息。

用户消息提供请求或评论,助手响应这些消息。助手消息存储以前的助手响应,但你也可以通过编写助手消息来给出期望行为的示例。

包含对话历史很重要,因为用户指示可能会参考之前的消息。在上面的例子中,用户的最后一个问题“它在哪里进行的?”只有在了解前面的关于2020年世界大赛的消息时才有意义。由于模型没有过去请求的记忆,所有相关信息必须作为对话历史的一部分在每个请求中提供。如果对话无法在模型的令牌限制内完成,就需要以某种方式进行缩短。

要模拟 ChatGPT 中迭代返回文本的效果,请将 stream 参数设置为 true。OpenAI API - Streaming(流) 的概念与基本使用

Chat Completions response format (返回对象的格式与内容)

{
  "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
  }
}

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

completion.choices[0].message.content

每个响应都会包含一个finish_reasonfinish_reason可能的值包括:

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

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

2. JSON mode

在使用Chat Completions时,常见的方法是通过在系统消息中指定,指示模型始终返回一个适合你用例的JSON对象。虽然这种方法在某些情况下确实有效,但有时模型生成的输出可能无法解析为有效的JSON对象。

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

重要提示:

  1. 使用JSON模式时,始终通过对话中的某条消息指示模型生成JSON,例如通过系统消息。如果没有包含明确的生成JSON的指示,模型可能会生成不断的空白字符,导致请求持续进行直到达到令牌限制。为了确保不会忘记,API会在上下文中没有出现"JSON"字符串时抛出错误。
  2. 如果finish_reasonlength,表示生成超过了max_tokens或对话超过了令牌限制,模型返回的消息中的JSON可能是部分的(即被截断)。为防止这种情况,在解析响应之前检查finish_reason
  3. JSON模式不能保证输出符合任何特定的模式,只能保证输出是有效的并且解析时没有错误。
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo-0125",
  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模式始终启用。

3. Reproducible outputs

默认情况下,Chat Completions是非确定性的(这意味着模型输出可能因请求而异)。尽管如此,我们提供了一些控制以实现确定性输出,通过给你访问seed参数和system_fingerprint响应字段来实现。

要在API调用中获得(大部分)确定性的输出,你可以:

  1. seed参数设置为你选择的任何整数,并在希望获得确定性输出的请求中使用相同的值。
  2. 确保所有其他参数(例如提示或温度)在请求中完全相同。

有时,由于OpenAI在我们这边对模型配置进行的必要更改,确定性可能会受到影响。为了帮助你跟踪这些更改,我们公开了system_fingerprint字段。如果这个值不同,由于我们系统上的更改,你可能会看到不同的输出。

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  seed=42,
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"}
  ]
)
print(response.choices[0].message.content)
print(response.system_fingerprint)

在这个例子中,seed参数被设置为42,这样可以在多次调用API时获得相对一致的输出结果。通过检查system_fingerprint字段,你可以确定是否由于系统更改导致输出差异。

未完成内容包括

Managing tokens

Parameter details

Completions API (Legacy)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值