LLM 生成与推理

解码与采样:temperature / top-k / top-p 怎么调

生成是「逐步从概率分布里采样」。greedy 贪心、beam search、temperature、top-k、top-p(nucleus) 各自在「确定性 vs 多样性」之间取舍。本文讲清每种何时用、默认值怎么来。

一句话回答

LLM 是自回归的:每生成一个 token,都从 softmax 出的概率分布里「采一个」出来,再喂回去。解码策略决定怎么从这个分布里选——greedy/beam 偏确定、偏保守;temperature/top-k/top-p 控制多样性。代码/事实要低随机,创意要高随机。

自回归生成回顾

模型输出的是「下一个 token 的 logits」,过 softmax 变成概率分布 p。生成第 t 个 token 就是从这个分布里挑一个:

p(token | 前文) = softmax(W · h_t)
每一步:分布里按策略挑一个 → 追加到输入 → 再算下一步 前文 tokens → 模型 → 概率分布 ↑ 按策略挑一个

Greedy(贪心):每步取最大概率

token = argmax(p)
完全确定、可复现;适合「有标准答案」的场景(代码补全、抽取、分类标签)。
缺点:单调、易陷入重复循环("好的好的好的…"),缺乏多样性,开放生成很"无聊"。

Beam Search:保留 top-b 条路径

不只要一条最优,而是每步保留 b 条(beam width)当前累计概率最高的候选序列,最后选整体最优。

翻译、摘要、语音识别等「有唯一较优解」的任务效果好,输出流畅不跑偏。
开放对话/创意里 beam search 反而「太安全」、句式雷同;且 b 越大算力越贵。LLM 对话一般不默认用它。

Temperature:缩放分布"尖锐/平滑"

在 softmax 前把 logits 除以温度 T:

p = softmax(logits / T)
同一 logits 在 T 下的分布形态 T=0.1(尖锐) T=1(原始) T=2(平滑)

Top-k / Top-p(nucleus):截断低概率

不想让极小概率的"胡说"token 被采到,就在采样前先截断:

Top-k
只保留概率最高的 k 个 token,其余置零后再采样。k 小更稳,k 大更多样。但 k 固定,可能对"本来就很确定"的分布也硬塞 k 个。
Top-p(nucleus)
按概率从高到低累加,取到总和 ≥ p 就停(如 p=0.9)。动态决定候选集大小,更自适应,比 top-k 常用。
实战常组合:temperature 调"发散度" + top-p 控"候选范围",两者一起用。top-k 常与 top-p 二选一或叠加。

怎么选 & 默认值

场景策略说明
代码/SQL/JSON/事实问答greedy 或 T≈0 + top-p 小要准确、可复现
翻译/摘要beam search 或低 T有较优解、要流畅
聊天/文案/头脑风暴T 0.7~1.0 + top-p 0.9要多样自然
极度发散/写诗T 1.0+ + top-p 0.95鼓励惊喜
默认值心智模型:OpenAI 系默认 temperature≈0.7~1.0、top-p≈1;但"严谨任务"应调低到 0~0.3。别在要"唯一正确答案"的任务上用高 T。

总结