灵策全能AI助手

温度与采样:为什么每次答案不一样

温度、Top-p 这些参数在调什么,什么时候该调高或调低。

同一句「帮我给咖啡店起个名字」,问两次,得到两批完全不同的名字;同一道数学题,有时算对,有时算错。这不是 AI「心情」不一样,而是它每写一个字,背后都有一个「抽签」的步骤。

搞懂这个抽签,你就明白温度、Top-p 这些参数到底在调什么,也知道什么时候该让 AI「放开想」,什么时候该让它「别乱来」。

模型每一步给出的,其实是一张「概率表」

在入门课里我们说过,大模型的核心是「根据前文预测下一个词」。更准确地说,模型每一步并不是直接吐出一个词,而是给词表里每一个候选 token 打一个分,再把分数换算成概率。词表里的候选通常有几万到二十多万个。

比如前文是「今天天气真___」,模型给出的概率表可能是这样(示意数字,只列 5 个):

候选词好不错热冷香蕉
概率57.3%21.1%12.8%7.8%1.0%

接下来怎么选,有两种基本思路:

  • 永远选最高的(叫「贪心」):每次都选「好」。结果稳定,但千篇一律;写长文时还容易陷入「我觉得很好,我觉得很好……」这样的重复循环。
  • 按概率抽签(叫「采样」):57.3% 的机会抽到「好」,21.1% 的机会抽到「不错」……也有 1% 的机会抽到「香蕉」。

为什么不干脆永远选最高的?想想人是怎么说话的:我们并不会每个词都挑「最常见」的那个,否则文章会平淡得像说明书。研究者也发现,只挑最可能的词生成的长文,往往乏味又爱重复;适度的随机,反而让文字更像人写的。

所以,日常的 AI 对话大多用的是采样。而且文字是一个词一个词生成的,前面某一步抽到了不同的词,后面的整段内容都会跟着改变,就像蝴蝶效应。这就是同一个问题每次答案不一样的根本原因。

温度:把概率表「拉尖」或「压扁」

温度(temperature)调的是这张概率表的「形状」。具体做法是:把分数换算成概率之前,先把每个候选的分数都除以温度。用一句话公式表示(∝ 读作「正比于」):

概率 ∝ e 的(分数 ÷ 温度)次方

不用记公式,只要记住它的效果:温度小于 1,候选之间的差距被放大,第一名更加突出;温度大于 1,差距被缩小,冷门词的机会变多。

还是「今天天气真___」,同一组分数在不同温度下会变成这样:

候选词温度 0.5温度 1.0温度 2.0
好83.1%57.3%38.7%
不错11.2%21.1%23.5%
热4.1%12.8%18.3%
冷1.5%7.8%14.2%
香蕉不到 0.1%1.0%5.2%

可以把温度理解成「冒险程度」。温度降到 0.2,「好」的概率会超过 99%,几乎每次都选它;温度为 0 时,通常就等同于「永远选最高的」。反过来,温度 2.0 时,「香蕉」有了 5.2% 的机会。

5% 看起来不多,但要注意:一篇回答有几百上千个词,每一步都有一点出怪词的机会,累积起来几乎必然出事。一旦某一步抽到了离谱的词,后面的内容会顺着它继续编下去,最后变成语无伦次。这就是温度太高时 AI 会「胡言乱语」的原因。

小贴士:「温度」这个名字借自物理学。温度低时,分子安分地待在最稳定的位置;温度高时,分子到处乱窜。

Top-k 与 Top-p:先圈定候选名单,再抽签

除了改变概率表的形状,还可以直接把不靠谱的候选踢出名单。

Top-k:只保留概率最高的 k 个词,在它们之间重新分配概率再抽签。比如 k = 3,就只在「好、不错、热」里抽。

它的问题是名单长度固定,不会看情况。当前文是「床前明月___」时,模型几乎确定下一个字是「光」,k = 3 反而让两个不太合适的词也混进了名单;而在给咖啡店起名字时,合适的选项可能有几十个,k = 3 又太窄了。

Top-p(也叫核采样):把候选词按概率从高到低排好,依次累加,直到累计概率达到 p 为止,只在这些词里抽。以温度 1.0、p = 0.9 为例:

好    ████████████████████████████  57.3%   累计 57.3%
不错  ██████████                    21.1%   累计 78.4%
热    ██████                        12.8%   累计 91.2%  ← 达到 90%,入围到此为止
冷    ████                           7.8%   淘汰
香蕉  ▌                              1.0%   淘汰

Top-p 的聪明之处在于名单长度会自动变化:模型很有把握时(比如「光」占 99%),名单里可能只剩一个词;模型拿不准时,名单会自动变长,保留多种可能。

还有几个常见参数也和采样有关:

  • 频率惩罚 / 存在惩罚:对已经出现过的词降分,减少车轱辘话;
  • 最大输出长度:限制回答最多写多少 token;
  • 随机种子:部分服务支持固定种子,方便复现结果。

一般建议是:温度和 Top-p 只调其中一个,另一个保持默认,否则效果难以预料。不同服务对这些参数的实现顺序和取值范围也不完全一样,温度常见的范围是 0~1 或 0~2,以具体说明为准。

什么时候调高,什么时候调低

任务类型温度建议原因
信息提取、格式转换、分类、写代码低(接近 0)要稳定、可复现,不需要创意
事实问答、总结材料低到中忠于原意,少发挥
日常写作、邮件、文案中(多数服务的默认值附近)自然流畅,又不至于跑偏
头脑风暴、起名、写诗、编故事中到偏高需要新鲜、多样的点子

这里有两个最常见的误解,值得单独说:

误解一:温度调低,答案就更准。 不对。温度控制的是「多样性」,不是「知识水平」。如果模型心里最看好的那个答案本身就是错的,温度 0 只会让它每次都稳定地给出同一个错误答案。准确性靠的是模型能力、清楚的提示和可靠的资料,不是温度。

误解二:温度为 0,每次输出就一字不差。 通常会非常接近,但不一定完全一样。服务端计算的一些细节可能导致微小差异,有的服务还会对某些模型(比如推理模型)固定或不开放这些参数。

没有参数可调?用提示词和「多抽几次」

大多数聊天界面并不开放温度设置。没关系,你仍然可以影响结果:

想要更多样(相当于「调高温度」):
请给我的咖啡店起 12 个名字,分成文艺、幽默、极简三类,每类 4 个,
彼此风格差异要大,不要都用「咖啡」两个字。

想要更稳定(相当于「调低温度」):
请从下面这段合同里提取所有日期,只输出 JSON 数组,
格式为 [{"日期": "YYYY-MM-DD", "事项": "..."}],不要任何解释。

另外两招也很实用:

  • 重新生成。 点「重新生成」本质上就是重新抽一次签。创意类任务可以多抽几次,挑最好的。
  • 多数投票。 遇到难题,让 AI 独立解几遍,看哪个答案出现得最多。研究者把这种做法称为「自洽性」,在数学和推理题上常常能提高正确率。

本节要点

  • 模型每一步输出的是所有候选词的概率表,再从中选一个;按概率抽签,是每次回答不同的根本原因。
  • 温度改变概率表的形状:调低让领先者更突出、输出更稳定,调高让冷门词机会变多、输出更多样也更容易跑偏。
  • Top-k 固定保留前 k 个候选;Top-p 按累计概率圈定名单,名单长短会随模型的把握程度自动变化。
  • 提取、代码、事实类任务用低温度,创意类任务可以适当调高;温度低不等于更准确。
  • 没有参数可调时,可以用提示词明确要求「多样」或「固定格式」,也可以多生成几次再挑选或投票。

「大模型原理」其他课程

灵策全能AI助手