目录
前言
此篇文章基于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_reason
。finish_reason
可能的值包括:
stop
: API 返回完整消息,或消息被stop
参数提供的停止序列终止。length
: 由于max_tokens
参数或令牌限制导致的模型输出不完整。function_call
: 模型决定调用一个函数。content_filter
: 由于内容过滤器的标志而省略的内容。null
: API 响应仍在进行中或不完整。
根据输入参数,模型响应可能包含不同的信息。
2. JSON mode
在使用Chat Completions时,常见的方法是通过在系统消息中指定,指示模型始终返回一个适合你用例的JSON对象。虽然这种方法在某些情况下确实有效,但有时模型生成的输出可能无法解析为有效的JSON对象。
为了防止这些错误并提高模型性能,当使用gpt-4o
、gpt-4-turbo
或gpt-3.5-turbo
时,可以将response_format
设置为{ "type": "json_object" }
以启用JSON模式。启用JSON模式时,模型仅限于生成可以解析为有效JSON对象的字符串。
重要提示:
- 使用JSON模式时,始终通过对话中的某条消息指示模型生成JSON,例如通过系统消息。如果没有包含明确的生成JSON的指示,模型可能会生成不断的空白字符,导致请求持续进行直到达到令牌限制。为了确保不会忘记,API会在上下文中没有出现"JSON"字符串时抛出错误。
- 如果
finish_reason
为length
,表示生成超过了max_tokens
或对话超过了令牌限制,模型返回的消息中的JSON可能是部分的(即被截断)。为防止这种情况,在解析响应之前检查finish_reason
。 - 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调用中获得(大部分)确定性的输出,你可以:
- 将
seed
参数设置为你选择的任何整数,并在希望获得确定性输出的请求中使用相同的值。 - 确保所有其他参数(例如提示或温度)在请求中完全相同。
有时,由于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)