Skip to content

Temperature、Top-p 与 Top-k

一、它们解决什么问题

大模型生成文本是逐 Token 自回归的:每生成一个 Token,模型先输出一个覆盖整个词表(vocab)的对数几率(logits),经过 Softmax 变成每个候选 Token 的概率分布,再从分布里"抽"出一个 Token 作为输出。

模型输出 logits ──▶ Softmax ──▶ 概率分布 ──▶ 【采样策略】──▶ 选中一个 Token

TemperatureTop-pTop-k 都属于解码(decoding)阶段的采样参数,作用是:在最终"抽哪个 Token"这一步,怎么去调整那个概率分布、限制候选范围、控制随机性

关键点:这三个参数不改模型的权重,也不改变模型"知道什么",只影响"在已知的概率分布上怎么挑下一个字"。调它们 = 调生成的随机度与多样性。


二、Temperature(温度)

原理

Temperature 在 Softmax 之前对 logits 做缩放:

p_i = exp(z_i / T) / Σ exp(z_j / T)
  • z_i:第 i 个 Token 的 logit
  • T:温度值

直观效果

T 取值分布形状生成表现
T → 0(趋近 0)分布被"压"成只有一个尖峰趋近贪心解码(Greedy):永远选概率最高的词,几乎确定、重复、保守
T = 1原分布不变忠实反映模型原始判断
T > 1(如 1.5~2)分布被"摊平",高低概率差距缩小更随机、更多样、更有创意,但容易胡说、跑题
T < 1(如 0.2~0.7)分布更"尖锐"更聚焦、更严谨、更确定
T 小(聚焦)              T 大(发散)
  ▲                         ▲
  │   ██                    │     ▆▆
  │  ████                   │    ▆▆▆▆
  │ ██████                  │   ▆▆▆▆▆▆
  │████████                 │  ▆▆▆▆▆▆▆▆
  └──────────▶             └──────────▶  候选 Token

记忆:温度越低越"轴"(认死理、保守),温度越高越"飘"(发散、创意但易跑偏)。


三、Top-k(按数量截断)

原理

不做任何缩放,而是只保留概率最高的 k 个 Token,把其余所有 Token 的概率置 0(或 -∞),重新归一化后再采样。

原始分布(词表很大)

   │  只保留前 k 个 ──▶ [top1, top2, ..., topk]  ──▶ 重新归一化 ──▶ 采样
   │  其余全部剔除
  • k = 1:等价于贪心解码(永远选第一名)。
  • k 很小(如 10~40):候选极少,输出稳定、可控,但可能缺乏变化。
  • k 很大(如 100+):退化成"几乎不截断",多样性上升但可能把低质量词也放进来。

局限

Top-k 是固定数量截断,不灵活:

  • 当分布很"尖"(某个词概率极高)时,第 k 名可能已经是莫名其妙的次要词,却被强行纳入。
  • 当分布很"平"(多个词概率接近)时,只取 k 个又可能漏掉一批同样合理的候选。

于是有了更聪明的 Top-p


四、Top-p(核采样 / Nucleus Sampling)

原理

按概率从高到低排序,取累计概率刚好达到 p 的最小 Token 集合(这个集合叫"核 / nucleus"),把集合之外的 Token 全部剔除,再归一化采样。

按概率降序排列:
  tokA 0.4 │
  tokB 0.25│
  tokC 0.15│
  tokD 0.10│
  tokE 0.05│
  ... 其余很小

设 p = 0.9:
  累计:0.4 → 0.65 → 0.80 → 0.90 ✅ 到此停止
  ⇒ 核 = {tokA, tokB, tokC, tokD},其余全部剔除后归一化采样
  • p = 1.0:不截断,等于在所有 Token 上采样。
  • p 越小(如 0.7~0.9):核越小,越聚焦高概率词。
  • p 越大(接近 1):候选越多,越发散。

相比 Top-k 的优势

Top-p 是按分布形状动态截断

  • 分布尖时,核自动很小(只留真正高概率的几个词)。
  • 分布平时,核自动更大(把一批旗鼓相当的候选都纳入)。

所以 Top-p 比 Top-k 更"自适应",是现在的主流默认(很多 API 用 top_p 而非 top_k)。


五、三者如何组合(典型解码流水线)

实际推理时,这三个参数往往串联起作用,标准顺序是:

logits

  ├─ 1. ÷ Temperature  (缩放分布形状)

  Softmax 概率分布

  ├─ 2. Top-k 截断     (先按数量砍掉太靠后的候选,作为安全上限)

  ├─ 3. Top-p 截断     (再按累计概率砍,保留"核")

  └─ 4. 从最终候选里随机采样 ──▶ 输出一个 Token
  • Temperature 决定"分布是尖还是平"(整体随机基调)。
  • Top-k 是一道"硬性数量护栏"(防止极端情况下把一堆垃圾词放进来)。
  • Top-p 是"柔性动态护栏"(按分布自适应保留核心候选)。

工程实践:多数框架先 temperature,再 top_k(可选),再 top_p。也有说法建议 temperature 和 top_p 二选一调,不要同时大幅改动,否则随机性叠加难预期。常见稳妥组合:temperature=0.7~1.0 + top_p=0.9 + top_k=40~50


六、参数怎么选(场景速查)

场景推荐设置理由
代码生成、事实问答、SQL/JSON 等确定性输出temperature 低(0~0.3),top_p 低(0.1~0.5)要准确、可复现,少创意
通用对话、摘要temperature 0.7 左右,top_p 0.8~0.95平衡准确与流畅
创意写作、头脑风暴、诗歌temperature 0.8~1.2,top_p 0.9~1.0鼓励多样与新颖
需要完全可复现(评测/调试)temperature=0(贪心)或固定随机种子消除随机性
翻译temperature 低(0~0.3)翻译要忠实,不宜发挥

七、常见误区

误区 1:Temperature 越高模型越"聪明" 错。温度只调随机性,不增加知识。温度过高只会让它更爱胡编(幻觉更多),不会更聪明。

误区 2:Top-k 比 Top-p 更先进,应该只用 Top-k 恰恰相反。Top-p(核采样)因自适应截断,通常是更优的默认;Top-k 多作为"数量护栏"配合 Top-p 使用。

误区 3:temperature 和 top_p 同时拉满能得到"又准又活"的效果 随机性会叠加,结果往往不可控。建议二选一主调,另一个保持默认或不动。

误区 4:调这些参数能改变模型"懂不懂" 不能。它们只影响"在已知分布上怎么挑下一个字"。模型不会的内容,调再高温度也编不出来(只会编得更花)。


八、一句话总结

  • Temperature:把概率分布"压尖"或"摊平",控制整体随机基调。
  • Top-k:只在前 k 个最高概率词里选,固定数量护栏。
  • Top-p(核采样):只在累计概率达 p 的最小集合里选,自适应动态护栏。
  • 三者串联:先温度缩放 → 再 Top-k 截断 → 再 Top-p 截断 → 采样

口诀:温度定基调,k 限数量,p 圈核心;低温求稳、高温求变,核采样自适应最靠谱。

最近更新