openai文本生成
有一个与使用语言模型相关的整个领域,被称为“提示工程”,但随着该领域的发展,其范围已经超出了仅仅将提示工程设计为使用模型查询作为组件的工程系统的范围。这些模型的输入也称为“提示”。但请注意,对于某些模型,输入中的代币与输出中的代币的每个代币的价格是不同的(有关更多信息,请参阅定价。但请注意,系统消息是可选的,没有系统消息的模型行为可能类似于使用通用消息,例如“你是一个有用的助手”。等聊天模型使用令
文本生成
OpenAI 的文本生成模型(通常称为生成式预训练 Transformer 或大型语言模型)经过训练可以理解自然语言、代码和图像。这些模型提供文本输出来响应其输入。这些模型的输入也称为“提示”。设计提示本质上是如何“编程”大型语言模型,通常是通过提供说明或一些如何成功完成任务的示例。
要通过 OpenAI API 使用这些模型之一,您将发送包含输入和 API 密钥的请求,并接收包含模型输出的响应。我们最新的模型 gpt-4-turbo 和 gpt-3.5-turbo 是通过 chat completions聊天完成 API 端点访问的。
| MODEL FAMILIES 模范家庭 | API ENDPOINT | |
|---|---|---|
| Newer models (2023–) 较新型号 (2023–) | gpt-4, gpt-4-turbo-preview, gpt-3.5-turbo |
https://api.openai.com/v1/chat/completions |
| Updated legacy models (2023) 更新旧模型(2023) | gpt-3.5-turbo-instruct, babbage-002, davinci-002 |
https://api.openai.com/v1/completions |
Chat Completions API 聊天完成 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?"}
]
)
主要输入是 messages 参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“系统system”、“用户user”或“助理assistant”)和内容。对话可以短至一条消息,也可以来回多次。
通常,对话首先由系统system消息格式化,然后是交替的用户user消息和助理assistant消息。
系统消息有助于设置助手的行为。例如,您可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,没有系统消息的模型行为可能类似于使用通用消息,例如“你是一个有用的助手”。
用户消息提供助理响应的请求或评论。助理消息存储以前的助理响应,但也可以由您编写以给出所需行为的示例。
当用户指令引用之前的消息时,包含对话历史记录非常重要。在上面的示例中,用户的最后一个问题是“在哪里播放的?”仅在有关 2020 年世界职业棒球大赛的先前消息的上下文中才有意义。由于模型没有过去请求的记忆,因此所有相关信息必须作为每个请求中的对话历史记录的一部分提供。如果对话无法满足模型的令牌限制,则需要以某种方式缩短。
要模仿 ChatGPT 中迭代返回文本的效果,请将stream流参数设置为 true。
Chat Completions聊天完成响应格式
聊天完成 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
}
}
助理的回复可以通过以下方式提取:
completion.choices[0].message.content
每个响应都将包含 finish_reason 。 finish_reason 的可能值为:
stop :API 返回完整消息,或由通过 stop 参数提供的停止序列之一终止的消息
length :由于 max_tokens 参数或令牌限制导致模型输出不完整
function_call :模型决定调用函数
content_filter :由于我们的内容过滤器中的标志而省略内容
null :API 响应仍在进行中或不完整
根据输入参数,模型响应可能包括不同的信息。
可重复的输出
默认情况下,聊天完成是不确定的(这意味着模型输出可能因请求而异)。话虽这么说,我们通过让您访问seed种子参数和 system_fingerprints 响应字段来提供对确定性输出的一些控制。
要跨 API 调用接收(大部分)确定性输出,您可以:
-
将seed种子参数设置为您选择的任何整数,并在您想要确定性输出的请求中使用相同的值。
-
确保所有其他参数(例如
prompt或temperature)在请求之间完全相同。
有时,由于 OpenAI 对我们端的模型配置进行必要的更改,确定性可能会受到影响。为了帮助您跟踪这些更改,我们公开了 system_fingerprint 字段。如果该值不同,您可能会因我们对系统所做的更改而看到不同的输出。
Managing tokens管理代币
语言模型以称为标记的块的形式读取和写入文本。在英语中,标记可以短至一个字符,也可以长至一个单词(例如 a 或 apple ),在某些语言中,标记甚至可以短于一个字符甚至比一个词还要长。
例如,字符串 "ChatGPT is great!" 被编码为六个标记: ["Chat", "G", "PT", " is", " great", "!"] 。
API 调用中的令牌总数会影响:
-
您的 API 调用费用是多少(按令牌支付)
-
API 调用需要多长时间,因为写入更多令牌需要更多时间
-
您的 API 调用是否有效,因为令牌总数必须低于模型的最大限制(
gpt-3.5-turbo为 4097 个令牌)
输入和输出令牌都计入这些数量。例如,如果您的 API 调用在消息输入中使用了 10 个令牌,而您在消息输出中收到了 20 个令牌,则您将需要支付 30 个令牌。但请注意,对于某些模型,输入中的代币与输出中的代币的每个代币的价格是不同的(有关更多信息,请参阅定价pricing 页面)。
要查看 API 调用使用了多少个令牌,请检查 API 响应中的 usage 字段(例如 response['usage']['total_tokens'] )。
gpt-3.5-turbo 和 gpt-4-turbo-preview 等聊天模型使用令牌的方式与完成 API 中可用的模型相同,但由于它们基于消息的格式,因此更难以计算有多少令牌将被对话使用。
传递到 API 的每条消息都会消耗内容、角色和其他字段中的令牌数量,以及一些用于幕后格式化的额外令牌。这在未来可能会略有改变。
如果对话有太多标记而无法满足模型的最大限制(例如,gpt-3.5-turbo 超过 4097 个标记),您将必须截断、省略或以其他方式缩小文本,直到适合为止。请注意,如果从消息输入中删除消息,模型将丢失它的所有知识。
请注意,很长的对话更有可能收到不完整的回复。例如,长度为 4090 个令牌的 gpt-3.5-turbo 对话将在仅 6 个令牌后就被切断。
Parameter details 参数详情
聊天完成 API Chat Completions API 和旧版完成 Legacy Completions API API 中发现的频率和存在惩罚可用于降低对令牌重复序列进行采样的可能性。
如果目的只是稍微减少重复样本,那么惩罚系数的合理值约为 0.1 到 1。如果目标是强烈抑制重复,那么可以将系数增加到 2,但这会明显降低样本的质量。负值可用于增加重复的可能性。
旧版 Completions 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."
)
[
Completions response format完工响应格式]
完成 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
}
}
Chat Completions vs. Completions聊天完成与完成
通过使用单个用户消息构造请求,可以使聊天完成格式与完成格式类似。例如,可以通过以下完成提示将英语翻译成法语:
Translate the following English text to French: "{text}"
等效的聊天提示是:
[{"role": "user", "content": 'Translate the following English text to French: "{text}"'}]
这些 API 之间的区别在于每个 API 中可用的底层模型。聊天完成 API 是我们功能最强大的模型 ( gpt-4-turbo-preview ) 和最具成本效益的模型 ( gpt-3.5-turbo ) 的接口。
使用哪种型号
我们通常建议您使用 gpt-4-turbo-preview 或 gpt-3.5-turbo 。您应该使用哪一个取决于您使用模型执行的任务的复杂性。 gpt-4-turbo-preview 通常在广泛的评估中表现更好。特别是, gpt-4-turbo-preview 更能够仔细遵循复杂的指令。相比之下, gpt-3.5-turbo 更有可能只遵循复杂的多部分指令的一部分。 gpt-4-turbo-preview 比 gpt-3.5-turbo 更不可能编造信息,这种行为被称为“幻觉”。 gpt-4-turbo-preview 还具有更大的上下文窗口,最大大小为 128,000 个令牌,而 gpt-3.5-turbo 为 4,096 个令牌。但是, gpt-3.5-turbo 返回延迟较低的输出,并且每个令牌的成本要低得多。
我们建议在游乐场 playground进行试验,以调查哪些模型可以为您的使用提供最佳的性价比权衡。常见的设计模式是使用几种不同的查询类型,每种查询类型都会分派到适合处理它们的模型。
Prompt engineering 提示工程
了解使用 OpenAI 模型的最佳实践可以对应用程序性能产生重大影响。每种故障模式以及解决或纠正这些故障模式的方法并不总是直观的。有一个与使用语言模型相关的整个领域,被称为“提示工程”,但随着该领域的发展,其范围已经超出了仅仅将提示工程设计为使用模型查询作为组件的工程系统的范围。要了解更多信息,请阅读我们的提示工程prompt engineering指南,其中涵盖了改进模型推理、减少模型幻觉可能性等的方法。您还可以在 OpenAI Cookbook 中找到许多有用的资源,包括代码示例。
FAQ
[How should I set the temperature parameter?
tempreture参数该如何设置?
较低的tempreture值会产生更一致的输出(例如 0.2),而较高的值会产生更加多样化和创造性的结果(例如 1.0)。根据您的特定应用的一致性和创造性之间所需的权衡选择温度值。温度范围为 0 至 2。
应该使用 ChatGPT 还是 API?
ChatGPT 为我们的模型提供了聊天界面以及一系列内置功能,例如集成浏览、代码执行、插件等。相比之下,使用 OpenAI 的 API 提供了更大的灵活性,但需要您以编程方式编写代码或向我们的模型发送请求。
更多推荐


所有评论(0)