N3xtchen 的数字花园

Search

Search IconIcon to open search

OpenAI API: 文本补齐使用说明

上次更新于 Mar 1, 2023 编辑源文件

API Reference - OpenAI API

# 请求体的格式

1
2
3
4
5
6
/* POST https://api.openai.com/v1/completions -d */
{
	"model": "text-davinci-003",
	"prompt": "请告诉我如何编写一个工作汇报",
	... /* 其他可选参数 */
}

# 必需参数

# 调优参数

# 最大令牌数:max_tokens

可以简单理解为生成文本的单词(或者词组)数。

token 是文本的基本单位,他可以是一个单词、一个标点符号或者一个词组,取决于分词器。

默认:16 最大值:4096

较大的 max_tokens 值会导致生成更长的文本,但也会增加生成文本的时间和计算成本。

# 采样方式

temperature 参数更加强调随机性和多样性,而 top_n 参数更加强调准确性和流畅性

# 温度采样:temperature

控制了生成文本的“温度”,温度越高,则生成文本的随机性和创造力也越高,但也可能导致生成的文本不那么准确或连贯。

原理:通过在 softmax 操作中对概率分布进行加权,从而使生成的文本更加随机和多样化。

默认值:1 取值范围:0.0~2.0,值越大,随机性和创造力越高,准确率和连贯性越低。

# 核采样:top_p

温度采样的替代品,其中模型考虑了具有 top_p 概率质量的 token 的结果。

原理:在 softmax 操作中选择概率值最高的前 top_ptoken,从而限制了 token 选择的范围,使生成的文本更加多样化。

默认值: 1 取值范围:0.0-1.0,0.1 意味着只考虑包含前 10% 概率质量的 token

# 使用建议

不推荐 temperature 和 top_n 混用,取其一。

通常情况下,可以先尝试将 temperaturetop_n 参数都设置为较小的值,以获得最基本的生成结果。如果生成的文本不够随机或多样化,可以逐步增大 temperature 参数的值或减小 top_n 参数的值;如果生成的文本不够准确或流畅,可以逐步减小 temperature 参数的值或增大 top_n 参数的值。

# 惩罚参数

frequency_penaltypresence_penaltyOpenAI GPT 系列模型中的两个参数,可以用于控制生成文本中词汇的重复程度和多样性

# 重复惩罚参数: frequency_penalty

用于惩罚在生成文本中出现过多次的词汇;通常建议将该参数设置在 -2.0 到 2.0 之间。

# 出现惩罚参数:presence_penalty

用于惩罚在生成文本中出现过的词汇;通常建议将该参数设置在 -2.0 到 2.0 之间。

# 使用建议

这两个参数的具体设置需要根据具体应用场景和需求进行调整。通常情况下,可以先尝试将 frequency_penaltypresence_penalty 参数都设置为 0.0,以获得最基本的生成结果。

# 文本主题控制

# 提前终止:stop

stop 用于指定模型生成文本的停止词,当模型生成的文本中包含了 stop 参数中指定的词语时,模型将停止生成文本。例如,设置 stop 参数为 ['pizza'],则模型将在生成文本中包含 pizza 时停止生成,从而生成与 pizza 相关的文本。

前提条件top_p > 1

本质:如果指定了某个停止词,生成内容的 token 会尽可能的接近这个停止词的含义,间接达到了控制生成文本主题或方向的作用。

默认值:null

格式:文本或者数组

格式如下

1
2
3
4
5
6
7
8
// 文本
{
	"stop": "pizza"
}
// 数组
{
	"stop": ["pizza", "delicious"]
}

为什么 top_n = 1 时,stop 会失效? 如果将 top_n 参数设置为 1,即只允许模型输出预测概率最高的单个 token,那么设置 stop 参数将不会起到作用,因为模型只会考虑生成的下一个 token 是否是预测概率最高的那个 token,而不会考虑后续的 token。 例如,如果将 top_p 参数设置为 1,stop 参数设置为 ['pizza'],并以 “I love to eat pizza” 为输入,那么模型会在考虑下一个单词时,只会选取概率最高的单个 token,而不会考虑该单词后面是否包含停止词 pizza。因此,如果需要同时使用 stoptop_p 参数,需要将 top_p 参数设置为大于 1 的数值。

# 主题偏好调整:logit_bias

需要注意的是,logit_bias 参数只适用于一些特定的生成任务,例如情感分析、文本分类等任务,对于一般的文本生成任务可能没有显著的效果

logit_bias 参数是一个包含不同标记偏好的字典,可以将该参数用于修改特定标记的生成偏好。例如,将 logit_bias 参数设置为 {'happy': 2.0, 'sad': -2.0},则 API 生成的文本序列中将更有可能出现 happy 相关的单词,同时更少出现 sad 相关的单词。

默认值null

格式如下

1
2
3
{
  "token": weight
}

# 二次筛选:best_of

best_of 参数在服务端生成 K 个结果并挑选最优的结果返回(),可以用于增强生成文本的准确性和流畅度。可以理解为 2 次召回,第一轮进行 K 个结果的粗召回,然后从这个结果中挑选出最优的序列。

筛选原理:选取每个 token对数似然Log Prob)概率都是最高的那一个结果。

默认值:1,它的值一定要大于参数 n

需要注意的是,较大的 best_of 参数值可能会导致 API 响应时间延长和 API 调用次数限制增加

# 优雅的结束符:suffix

suffix 参数可以用于指定生成文本的结尾字符串,帮助控制生成文本的长度和质量。

有三种用途:

# 功能参数

# 返回多条文本

# 流式响应:stream

用于需要大量生成文本时,为了节省内存和提高程序的效率和稳定性,而不是一次性获取所有结果。这种情况下,使用流式响应方式可以逐个获取每个生成的文本结果,以确保程序不会因为内存不足或处理时间过长而崩溃或出现异常情况。

以下是一些适合使用流式响应的场景:

默认值false 结束的标识data: [DONE]

需要注意的是,使用流式响应方式可能会导致程序的运行时间变长,因为 API 需要不断地生成新的结果并返回给客户端,而客户端需要不断地迭代处理每个结果,直到满足预设的条件为止。

# 直接返回:n

在服务测生成 n 条结果后,一次性返回给客户端。

默认值:1

# 使用建议

nstream 互斥,只能设置一个。

建议使用 stopmax_tokens 来限制生成的文本长度或持续时间,并在其中任何一个条件满足时停止生成文本。

# 应答:echo

# 评估参数

# 对数似然估计:logprobs

logprobs 参数用于计算和评估生成文本的质量。

默认值null, 免费的接口,最多设成 5,API 将返回5 个 log 概率值最高的 token 和它的概率值。

使用 logprobs 参数可能会导致响应时间延长和 API 调用次数限制增加,因为每个 token 的概率值都需要进行计算和返回。