一篇读懂采样参数:temperature 与 top-p 是怎么给模型「调性格」的

调用大模型 API 时,temperature 和 top_p 大概是被随手乱填最多的两个参数。很多人隐约知道「调高更有创意、调低更严谨」,但说不清它们到底改了什么——事实上,这两个参数一个字都没有改模型本身:模型权重原封不动,每次前向计算出的概率分布也完全相同,被改变的是「从这个分布里怎么挑出下一个词」的规则。理解这条规则,比背「创意调高、严谨调低」重要得多。本文从解码时真正发生的事讲起,把温度缩放与三代截断策略的数学一次讲透。

从概率到词:解码时到底发生什么

模型每一步的原始产出不是词,而是词表上每个 token 的 logits(未归一化分数),经 softmax 变成概率分布。要得到下一个 token,最直接的两个选择是:取概率最大的那个(贪心解码,greedy),或者按概率随机抽取(纯采样)。

直觉上贪心应该最好,但 2019 年一篇被引用 5700 余次的论文发现了反例。华盛顿大学与 AI2 的 Holtzman 等人在《The Curious Case of Neural Text Degeneration》(ICLR 2020,arXiv:1904.09751)里系统测量了各种解码策略:贪心与束搜索(beam search)生成的文本会陷入重复循环与平淡套话——「我很开心。我很开心。我很开心。」式退化,而完全按原始分布采样又会偶尔蹦出荒谬的词。人类评估里,束搜索的表现甚至接近垫底。

为什么「挑概率最大的」反而会退化?因为人类写的文本从来不是模型分布里概率最高的那句话——恰恰相反,概率最高的序列往往是模型见过无数遍的平庸套路;而真实写作在大量分叉点上是「随机」走了一条并非最优的路。束搜索最大化似然,找到的是模型眼中最典型的句子,也正是最没有信息量的句子。这暴露了一个关键事实:模型给出的分布本身并不适合被「照单全收」或「一律取最大」——下一个 token 的分布在确定处极尖、在分叉处很平,而人类文本的分布恰恰也是这种「该确定时确定、该分叉时分叉」的形状。理想的解码策略要在两者之间找到动态平衡,于是有了两代方案:先修分布(温度),再截尾部(top-k、top-p、min-p)。

temperature:把分布拉尖或压平

温度作用于 softmax 之前:把每个 logit 除以 T 再做 softmax。T 趋向 0 时,最大 logit 与其余的差距被指数级放大,分布收缩成「事实上的贪心」;T 大于 1 时差距被压缩,长尾 token 获得更多出场机会。用四行 Python 就能看到全部效果:

import math

def softmax_with_temperature(logits, temperature):
    """温度缩放后的 softmax:T 越小分布越尖,T 越大越平。"""
    scaled = [l / temperature for l in logits]
    m = max(scaled)
    exps = [math.exp(s - m) for s in scaled]   # 减去最大值防止数值溢出
    total = sum(exps)
    return [e / total for e in exps]

logits = [4.0, 2.0, 1.0, 0.5]                  # 候选:「猫」「狗」「鸟」「鱼」
for t in (0.5, 1.0, 2.0):
    probs = softmax_with_temperature(logits, t)
    print(f"T={t}: " + ", ".join(f"{p:.3f}" for p in probs))

同一组 logits,输出是三条性格迥异的分布:

  • T=0.5:0.979, 0.018, 0.002, 0.001——「猫」几乎一统天下;
  • T=1.0:0.823, 0.111, 0.041, 0.025——标准分布;
  • T=2.0:0.567, 0.209, 0.127, 0.098——四个候选都有戏份。

注意温度改变的只是「相对差距」:排序不变,「猫」永远是第一名,变的是第二到第四名被抽中的概率。这就是温度比「随机种子」更本质的原因——它调整的是模型不确定性的表达强度,而不是引入额外的随机性来源。

top-k 与 top-p:两种截断哲学

光调温度还不够:温度压平分布后,万分之一概率的怪词也可能被抽中,需要把长尾砍掉。第一代方案 top-k 简单粗暴——只保留概率前 k 名。它有效,但有个结构缺陷:k 是固定的,而分布的形状是变化的。举两个极端:下一个词几乎确定时(「床前明月」之后),前 40 名里 39 个都是凑数的垃圾候选,白挨了 40 次抽签的风险;下一个词高度开放时(「我最喜欢的食物是」之后),合理候选(面条、饺子、披萨……)可能远超 40 个,截断反而把好的答案挡在门外。固定 k 意味着在两种场景里同时犯错。

Holtzman 论文提出的核采样(nucleus sampling,top-p)换了个思路:不固定个数,固定累积概率——只保留累积概率达到 p 的最小候选集。p = 0.95 意味着砍掉合计概率不足 5% 的长尾:分布尖的时候候选可能只剩两三个,分布平的时候自动扩到几十个。这与人写文本的行为模式一致,人类评估中 p = 0.95 稳定胜过 top-k = 40。后续研究(ICLR 2024 的《Closing the Curious Case of Neural Text Degeneration》)在大模型规模上复核并细化了这些结论,截断采样自此成为生成任务的标准配置。

min-p:按置信度动态截断的第三代

top-p 仍有一个盲区:它的候选集大小取决于分布形状,但截断阈值不感知模型「当时有多自信」。问题在高温下最明显:温度调高后分布被压平,累积到 95% 的概率质量需要容纳多得多的候选词,截断形同虚设——top-p 在高温下「失效」的机制正在于此。2024 年提出的 min-p(论文《Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs》,Nguyen 等,已进入 vLLM 等主流引擎)补上了这块:设定的是候选概率与最高概率的比值下限。比如 min-p = 0.1 表示「只保留概率不低于头名 10% 的候选」——模型头名概率 0.9 时,阈值是 0.09,候选收得很紧;头名概率只有 0.2 时,阈值降到 0.02,长尾得以保留。论文的核心发现是 min-p 在高温下尤其占优:它始终与模型自信度联动,候选集不会随温度失控膨胀。

这里藏着一个大多数教程不会告诉你的工程细节:截断与温度缩放的先后顺序会改变结果。min-p 论文的作者特意指出,vLLM 先做温度缩放再做截断,Hugging Face 的实现顺序相反——同一组参数在两个后端会给出不同的输出分布。所谓「标准参数」并不存在,只有「某个引擎上的参数」。

实战口径:不同场景怎么配

结合各家官方文档与上述研究,给出一张可以直接抄的配置表(以 2026-10-08 各引擎文档口径为准):

场景 推荐配置 理由
代码生成、数学、数据变换 temperature 0–0.3 答案分支少,低温收尖分布,减少语法漂移
摘要、客服、结构化抽取 temperature 0.3–0.7 需要少量措辞灵活性,但不容跑偏
创意写作、头脑风暴 temperature 0.8–1.2,配合 top-p 0.95 或 min-p 开放分叉多,高温下务必截断长尾
推理模型(如 DeepSeek-R1) 官方建议 temperature 0.6、top-p 0.95,禁用贪心 官方模型卡明确警告:贪心解码会触发思维链重复
通用 API 默认 temperature 1、top-p 1 OpenAI 等文档口径;且建议不要同时调温度与 top-p

两个值得单独强调的官方口径:其一,DeepSeek-R1 的模型卡不仅给了数值,还明确禁止对推理模型用贪心解码——这与很多用户「求稳就设 0」的直觉相反;其二,OpenAI 文档长期建议温度与 top-p 二选一调整,因为两者作用在同一分布上,同时调会互相干扰、难以归因。另外,部分新一代推理模型的 API 干脆不允许改温度,只接受默认值——参数自由正在向「模型说了算」回收。

如果目标是可复现而非确定,正确的工具是随机种子而不是温度:主流 API 提供的 seed 参数(配合固定的 system fingerprint)能让同一输入在服务端复现相同输出,用于回归测试与评测对齐;温度设 0 只能保证「策略上贪心」,保证不了「执行上无扰动」。做离线评测时,把采样参数与种子一并写进实验记录,是成本最低、收益最高的工程习惯。

三个反直觉的坑

最后是三个高频踩坑点。**第一,temperature = 0 不等于确定性输出。**温度趋 0 只是让分布变成事实上的贪心,而工程实现的批处理调度、浮点运算的非结合性都会引入微小扰动,相同输入在不同负载下可能得到不同输出;要严格可复现,应使用固定随机种子与确定模式(若引擎支持),而不是只把温度设为 0。**第二,评测时必须冻结采样参数。**既然参数改变的是分布而非模型,「模型 X 比模型 Y 强」的结论只有在相同采样配置下才成立——复现论文数字时,先核对它用的温度,再谈差距。**第三,参数解决不了分布本身的病。**温度与截断只能修饰模型给出的分布,无法修复「模型真的不知道答案」时的胡编——把 temperature 调到 0 并不能消灭幻觉,只是消灭了幻觉的多样性。

小结

采样参数是一组「不改模型、只改分布」的旋钮:温度调整不确定性的表达强度,top-p 与 min-p 决定长尾的去留,两者的组合决定了同一个模型呈现出的「性格」。理解它们的正确姿势不是背推荐值,而是记住那条主线——人类文本的下一个词分布本来就是「确定处极尖、分叉处很平」的形状,好的采样策略都是在动态逼近这个形状。下次调参时,先想想你的任务处在分布谱系的哪一端:答案唯一,就把分布收尖;故事开放,就把长尾留够——旋钮的意义,从来都是匹配任务的形状。

参考资料

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?