做产品 PMaker 首页
搜索
跟随系统
颜色主题
空格的键盘
同一个候选分布,温度只改变它的形状——每一根柱子是一个候选 token低温把分布拉尖,只在最有把握的几个候选里选输出保守、重复、安全,几乎每次一样高温把分布压平,长尾候选被抬起来说法更新鲜,但胡说的概率同步上升创造力和可靠性是同一个旋钮的两端,没有两全

温度不产生新的候选,它只是把已有的分布压平或者拉尖。越平,冷门候选越有机会被抽中。

温度与随机性

随机性是设计出来的,不是故障。什么时候该把它关掉。

随机性是设计出来的,不是故障。什么时候该把它关掉。 它不是心情不定,是每一步都在按概率抽签。这个抽签动作是被设计出来的,而且你可以关掉。 你会遇到的现象:

  • 同一个提示跑两次,一次格式完美,一次多了一句废话
  • demo 的时候好好的,演示给老板看就翻车
  • 你在做批量处理,一千条里有三十条格式不对,找不出规律

随机性从哪一步来

模型每生成一个 token,都会先算出一整张候选表:词表里每个 token 各有多大概率。到这一步为止,一切都是确定的——同样的输入,算出来的分布就是同一张。gpt3-paper

随机性出现在下一步:**从这张表里抽一个。**不是取最大值,是抽。概率 62% 的那个 token 大概率被抽中,概率 18% 的那个也有它的机会。一旦抽中的不是最常见那个,后面整句话都会顺着这个新方向长下去。

所以偏差是会放大的。一次生成几百个 token,就是几百次抽签,只要有一次抽出了不一样的,后面的分布就全变了。这也解释了为什么越长的输出越不稳定

顺带说清楚一件事:即使把随机性完全关掉,同一个提示也不保证百分百逐字相同。批处理的并发情况、浮点计算的顺序、服务端的版本更新,都会带来微小差异。**调到 0 是「几乎一致」,不是「加密级的一致」。**要真正的一致,得由你自己缓存结果。

两个旋钮

  • **温度是「敢不敢用冷门词」。**调低,它只在最有把握的几个候选里选,输出保守、重复、安全。调高,长尾候选被抬起来,说法更新鲜,但胡说的概率同步上升。创造力和可靠性在这里是同一个旋钮的两端,没有两全。
  • **top-p 是「先划一条线」。**它把候选按概率从高到低排,累加到设定的比例就停,后面的全不要。好处是无论分布多平,都不会抽到那些明显不该出现的选项。做产品时,它比温度更适合当安全阀。
  • **不是所有接口都给你这些旋钮。**一些新的推理型模型不接受温度参数,或者接受了也不起作用。选型的时候要确认一下,别把方案建在一个调不动的参数上。OpenAI 的文本生成文档对这两个参数都有明确的定义和取值建议。openai-textgen

什么时候调到 0

判断标准只有一条:**这个任务有没有唯一正确答案。**有,就调到 0;没有,才留一点随机。按场景分级很好记:

场景 建议 原因
抽取字段、分类打标 0 答案唯一,任何波动都是错误
输出结构化 JSON 0 格式必须每次都一样
代码生成、SQL 生成 0 – 0.2 能跑通比写得漂亮重要
翻译、改写、摘要 0.3 – 0.5 要准,但允许一点措辞自由
写文案、起标题 0.7 – 1.0 要的就是不一样的几个版本
头脑风暴、发散想点子 1.0 以上 离谱的那几个反而有用

一个产品里往往同时有好几类调用,不该共用一套参数。把「抽字段」和「起标题」用同一个温度跑,两边都不会好。

还有两条实操上的提醒。**第一,先别急着调温度。**大多数「输出不稳定」其实是提示写得太松:没给格式、没给例子、没说不许做什么。把这些补上,稳定性的提升远大于把温度从 0.7 调到 0.3。

**第二,稳定性最终还是要靠校验兜底。**温度 0 只是让它更可能给出同一个答案,不代表那个答案一定对、一定合法。凡是要进下游系统的输出,都要做一次格式校验,不合格就重试或降级。把随机性当成一个必然存在的事实来设计,而不是当成一个可以调没的 bug。

参考资料

  1. Text generation — OpenAI
  2. Language Models are Few-Shot Learners — arXiv