解码策略与采样参数#
一句话答案#
LLM 是自回归逐 token 生成:每一步模型对整个词表输出 logits,经 softmax 得到概率分布,再按解码策略挑一个 token 拼回输入继续下一步。greedy/beam 取最大概率,采样则引入随机性;temperature 调分布的”陡峭度”,top-k/top-p/min-p 截掉长尾,各类 penalty 压重复。参数本质是在确定性/准确性与多样性/创造性之间取舍,场景不同取值不同。
核心要点
1. 自回归生成流程#
输入 token ids → Transformer 前向 → 最后一个位置输出 logits(长度 = 词表大小 V)
→ (可选)约束解码 mask / logit_bias / penalty 修改 logits
→ 除以 temperature → softmax 得概率分布
→ top-k / top-p / min-p 截断后重新归一化
→ 采样(或取 argmax)得到 1 个 token → 追加到序列
→ 重复,直到生成 EOS / 命中 stop sequence / 达到 max_tokensplaintext每一步只生成 1 个 token(见 Tokenizer与分词原理),所以输出越长越慢、越贵;KV Cache 让历史不重算,推测解码用小模型打草稿再让大模型并行验证来加速,这些在 LLM推理优化 里讲。所有采样参数都只作用在”logits → 选 token”这一小段,不改变模型权重、不增加知识。
2. 三类基础策略#
| 策略 | 机制 | 优点 | 问题 |
|---|---|---|---|
| Greedy | 每步取 argmax | 确定、快 | 局部最优、易陷入重复循环(“the the the”) |
| Beam Search | 保留 B 条累计 log 概率最高的候选序列,最后选整体最优 | 翻译/ASR 等”有标准答案”任务效果好 | 开放式生成输出平淡、重复、偏短(需 length penalty);B 倍计算 |
| 随机采样 | 按 softmax 概率抽样 | 多样、自然 | 可能采到长尾低质 token → 需要 temperature/top-k/top-p 约束 |
3. temperature 的数学作用#
p_i = softmax(z_i / T):logits 先除以 T 再 softmax。
- T = 1:模型原始分布
- T → 0:差距被放大,概率全部集中到最大 logit,退化为 greedy(T=0 在多数 API 里即按 greedy 处理)
- T > 1:差距被压平,分布趋于均匀,长尾 token 概率上升 → 更随机,T 过大会开始”胡言乱语”
- T 不改变 token 的排序,只改变概率差距;T 越低越确定、越容易重复,T 越高越多样、越容易跑偏
4. 截断采样与重复控制#
- top-k:只在概率最高的 k 个 token 里采样(k=1 即 greedy,常见 20–50)。缺点是固定个数:分布很尖时 k 里混进垃圾,很平时又砍掉合理选项
- top-p(nucleus):按概率降序累加,取累计概率 ≥ p 的最小集合(常见 0.9–0.95),集合大小随分布自适应——确定的地方只留一两个,开放的地方留几十个
- min-p:保留
p_i ≥ min_p × p_max的 token(常见 0.05–0.1),以最高概率 token 为基准动态定阈值,高 temperature 下比 top-p 更稳,近两年在开源推理框架中流行 - 组合顺序:常见实现先 temperature,再 top-k,再 top-p/min-p,最后归一化采样;不同框架顺序可能略有差异。
top_p=1、top_k=0/-1表示不截断
| 参数 | 机制 | 量级 |
|---|---|---|
| repetition_penalty(HF/vLLM) | 对已出现过的 token:logit>0 则除以 r,<0 则乘以 r,出现一次和十次罚同样重 | 1.0 不罚,常用 1.05–1.3,过大标点/常用词都被压掉 |
| frequency_penalty(OpenAI 风格) | logit -= α × 出现次数,按出现频次线性加罚 | −2 到 2,常用 0–1 |
| presence_penalty(OpenAI 风格) | 只要出现过就 logit -= β,一次性罚,鼓励换新话题而非压高频词 | −2 到 2,常用 0–1;任何 penalty 过重都会压掉标点/语法词,只作微调 |
5. 其他控制参数与可复现性#
- stop sequences:命中指定字符串立即停止(且不输出该串),用于截断”下一轮角色”或”###“;max_tokens 是输出 token 上限,撞上返回
finish_reason=length,JSON 会被截成非法 - logit_bias:按 token id 加减 logits(OpenAI 范围 −100~100,−100 近似禁用该 token),可用来禁词、强制从若干选项里选(分类任务给候选 token +100)。注意作用对象是 token 不是词,带不带前导空格是不同 id
- seed 与可复现性:设 seed + 固定参数能让同一次部署下尽量复现,但不保证:服务端 batching 把不同请求拼在一起,矩阵形状变化导致浮点运算顺序不同(浮点不满足结合律);GPU kernel 的原子加法本身非确定;MoE 模型的专家路由受同 batch 其他请求影响(容量限制);模型/硬件/推理引擎升级也会变。部分 API(如 OpenAI Chat Completions)用
system_fingerprint提示后端配置是否变了(以官方文档为准)。所以 temperature=0 也只是”几乎确定”,不是严格确定 - 约束解码在采样前把不合法 token 的 logits 置 −inf,只是给分布做了 mask,与 temperature/top-p 正交,详见 结构化输出与约束解码
6. 场景推荐#
| 场景 | temperature | top_p | 说明 |
|---|---|---|---|
| 代码生成、信息抽取、分类、工具调用参数 | 0–0.3 | 1(默认) | 要稳定可复现,配合 JSON Schema/约束解码 |
| 通用问答、RAG 回答 | 0.3–0.7 | 0.9–1 | 略带随机减少机械重复,又不跑偏;幻觉敏感场景偏低(见 大模型幻觉与缓解) |
| 创意写作、头脑风暴、多候选 | 0.8–1.2 | 0.9–0.95 | 多样性优先,可配 presence_penalty 鼓励换角度 |
经验法则:temperature 和 top-p 一般只大幅调一个(两个都动不好归因,官方文档也这么建议)。
推理模型与新一代闭源 API 的参数支持在收紧(以各家官方文档为准):
- OpenAI:o 系列与 GPT-5 系列在开启推理时不接受
temperature/top_p等采样参数(报 400 或只允许默认值 1),改用reasoning_effort、verbosity控制;部分 GPT-5.x 模型在reasoning_effort="none"时才重新接受这些参数 - Anthropic:Claude Opus 4.7 及之后的模型把
temperature/top_p/top_k设为非默认值会返回 400,思考深度改由effort控制 - Google:Gemini 3.8 Flash 的迁移清单要求从 generation config 中去掉
temperature/top_p/top_k(已标为 deprecated) - 开源推理模型给推荐值而非禁用:DeepSeek-R1 建议 temperature 0.5–0.7(推荐 0.6);Qwen3/Qwen3.5 思考模式推荐 temperature=0.6、top_p=0.95、top_k=20,并明确不要用 greedy,否则易无限重复
所以本文的采样参数主要在自部署开源模型(vLLM/SGLang/HF)和非推理模式的 API 上仍然有效;调用新一代闭源推理模型时,控制输出的手段转向 effort/推理强度、提示词和结构化输出。
面试回答(2分钟版)
LLM 生成是自回归的,每一步模型对整个词表输出一组 logits,softmax 成概率分布,按某种策略选一个 token 拼回去再算下一个,直到出 EOS、命中 stop 或到 max_tokens。解码策略就是”怎么从分布里选”。最简单是 greedy 取最大,确定但容易陷入重复循环;beam search 保留 B 条累计概率最高的序列,翻译这类封闭任务好用,开放式生成会平淡重复;对话和创作普遍用随机采样加截断。采样参数里最重要的是 temperature,数学上是 logits 除以 T 再 softmax,T 趋近 0 就是 greedy,T 大于 1 把分布压平、长尾概率上升、更随机,它不改 token 排序只改差距。然后是截断:top-k 固定留 k 个,top-p 留累计概率到 p 的最小集合,能随分布自适应,min-p 按最高概率的比例定阈值,高温下更稳。重复控制有 repetition penalty、frequency penalty、presence penalty,前两个压已出现 token,presence 只罚一次鼓励换话题,罚重了会把标点和语法词都压掉。可复现性方面,设 seed 也不能保证完全一样,因为服务端 batching 改变矩阵形状、浮点不满足结合律,MoE 路由还受同 batch 请求影响,temperature=0 也只是近似确定。场景上,代码、抽取、分类用低温 0 到 0.3 配 JSON Schema,创意写作用 0.8 以上,temperature 和 top-p 一般只大幅调一个。另外约束解码是在采样前把非法 token mask 掉,推测解码是在不改分布的前提下加速,都和这些参数正交。
追问与易错
追问方向:
- temperature=0 为什么还会出现不同结果? → 0 在多数实现里退化为 greedy,但服务端 batching 让矩阵形状变化、浮点加法顺序不同,logits 微小差异在两个 token 概率接近时会翻转选择;MoE 的专家路由还受同 batch 请求影响。要尽量复现需固定 seed、参数、模型版本,部分 API 用 system_fingerprint 提示后端是否变化
- top-k 和 top-p 哪个更好? → top-p 自适应:分布尖时集合小、平时集合大,一般优于固定 k;两者常叠加(如 k=40 限定候选上限 + p=0.95)。高 temperature 场景 min-p 更稳,因为阈值跟随最高概率 token 缩放
- 为什么代码/JSON 任务不建议高温? → 高温把长尾 token 概率抬高,容易在语法关键位置采到错误符号(少个引号、错缩进),一错后续全错;低温 + Schema/约束解码最稳。需要多样性时用多次低温采样 + 验证而不是一次高温
- 调推理模型时为什么设 temperature 会报错? → 新一代闭源推理模型(OpenAI o/GPT-5 系列开启推理时、Claude Opus 4.7 及之后)不接受非默认采样参数,厂商用 effort/推理强度替代;开源推理模型则给推荐值(如 0.6)并警告不要 greedy,以模型文档为准
- beam search 为什么在对话模型里很少用? → 它最大化整体似然,对开放式文本会偏向高频、安全、重复的句子(“likelihood trap”),且 B 倍显存和计算,还不好与流式输出配合;采样 + 截断更自然也更便宜
易错点:
- ❌ “temperature 越低越准确” → 低温只是更确定、更像模型的”众数”答案,不等于正确;幻觉在 T=0 下照样出现,且过低易陷入重复循环
- ❌ “设了 seed 就一定可复现” → 只是尽量;batching、浮点非结合律、MoE 路由、硬件与版本变化都会打破
- ❌ “temperature 和 top-p 一起调到最大才够有创意” → 两者叠加会失控且难归因,一般固定一个调另一个
- ❌ “所有 API 都能调 temperature” → OpenAI o/GPT-5 系列推理模式、Claude Opus 4.7 及之后、Gemini 3.8 Flash 等已不接受或弃用采样参数,要改用 effort 类参数