解码不是”调参”,是在似然最大化、多样性、正确性约束三者之间做显式的取舍。大多数线上事故,源于把这三者的优先级搞反了。
导语
语言模型的训练目标只有一个:最大化 log p(y|x)。但从这个分布到最终输出的一段文本,中间隔着一个决策过程——每一步从 5 万维的词表里选一个 token,重复几百次。
这个决策过程就是解码。它决定了同一组权重能产出完全不同性质的系统:同一个模型,贪心解码会复读,高温采样会胡说,束搜索会输出”最安全但最无聊”的答案。
工程上普遍存在的三个误解:
- “temperature 是创造力旋钮” —— 它只能重塑已有分布,不能创造新模态。模型不知道的事,调温度也变不出来。
- “top-p 和 top-k 都设上更稳” —— 两者串联时的实际行为与直觉相反,多数情况下是一个在无效化另一个。
- “greedy 是最保守的选择” —— 贪心在开放生成上恰恰最容易产生退化的重复循环。
本文按”从基础到受控”的顺序拆九种策略,给出每种策略的数学形式、失效模式,然后在组合顺序这一节说明真实的 pipeline 行为(这是最多人踩坑的地方),最后给 RAG / Agent / 推理 / 创意四类场景的选型与具体参数。
0. 先建立坐标系:解码到底在解什么
0.1 自回归分解与”两步错位”
模型给的是条件分布:
1 | p(y | x) = Π_{t=1}^{T} p(y_t | y_{<t}, x) |
每一步,模型输出 logits z ∈ R^V,经过 softmax 得到 p_t ∈ Δ^{V-1}(概率单纯形)。解码算法要做的,就是在这个单纯形上定义一个选择规则,然后迭代。
这里有一个关键的”两步错位”,它解释了大量问题:
训练时,模型见的是人类文本,优化的是每一步的条件似然。
推理时,我们要的是一个”好的完整序列”,这是一个全局目标。
局部最优(每步取 argmax)不等于全局最优;而全局最优(序列级 MAP)在自回归模型上不可解。所有解码算法的差异,本质上就是”如何用可接受的成本逼近某个全局目标”。
0.2 三类目标,三种哲学
| 目标 | 数学形式 | 追求 | 代表算法 | 典型场景 |
|---|---|---|---|---|
| MAP / 似然最大化 | argmax_y p(y|x) |
最可能的序列 | 贪心、Beam Search | 翻译、摘要、结构化抽取 |
| 分布采样 | y ~ p(·|x) |
从真实分布抽样,保持多样性 | 纯采样、Top-k、Top-p、min-p、温度 | 创意写作、对话、数据合成 |
| 受控生成 | argmax / sample s.t. y ∈ L |
输出必须满足硬约束 | 约束解码、对比解码、自洽解码 | JSON 输出、代码、数学推理 |
第三类严格来说不是”另一种采样器”,而是在采样器外面套一层修正。这个区分很重要:约束解码和自洽解码可以叠加在任意采样器上,而 top-p 和 top-k 是同一层的竞争关系。
0.3 一个必须先破除的迷思:更高概率 ≠ 更好文本
这是理解全部解码策略的前提。
Holtzman et al. (2020) 的核心观察是:人类文本的困惑度并不低。真实人类写作的 token 序列,其模型似然往往显著低于模型自己生成的高概率文本。原因有两点:
- 自然语言本身有高熵(同一个意思有无数种说法),最可能的续写反而是陈词滥调;
- 自回归模型在”重复”上有正反馈——
p("的" | "...的的的")会异常高,因为这种上下文在训练数据里罕见但模型对它的估计是”局部一致”的。
所以:任何纯粹最大化似然的解码器(贪心、束搜索),在开放生成上都会趋向退化。这不是 bug,是目标函数选错了。这也是 top-p 这类截断采样能被提出的根本动机。
1. 概率采样:一切的地基
1.1 定义
最朴素的解码:每步直接从模型分布抽样。
1 | y_t ~ p(· | y_{<t}, x) = softmax(z / T)|_{T=1} |
1.2 为什么它是”地基”而不是”一个选项”
所有截断采样(top-k、top-p、min-p)都是”先修改分布,再做这个采样“。所以理解纯采样的性质,就理解了全部采样器的一半。
纯采样的三个性质:
| 性质 | 含义 | 工程后果 |
|---|---|---|
| 无偏 | 采样分布 = 模型分布 | 想评估模型真实能力(如 pass@k),必须用它 |
| 高方差 | 同一个 prompt 每次输出不同 | 线上不可复现,评测必须多次采样 |
| 长尾暴露 | 必定会抽到低概率 token | 5 万词表里,p=1e-5 的 token 在 500 步里被抽中的概率约 0.5%——足够让一个回答崩掉 |
第三点是最致命的。词表 5 万,即使每个 token 概率都极低,累积起来的长尾质量也不可忽略。一次采样踩到一个”坏 token”,后续所有 token 都在错误的上下文上生成,错误会自我强化。
这就是为什么纯采样在实践中几乎不会裸用——它必须配截断。
1.3 什么时候确实该用纯采样
- pass@k 评测:想估计”模型有能力生成正确解”,必须无偏采样;
- 合成数据生成:需要覆盖分布,多样性优先于单条质量;
- best-of-N 的第一阶段:先多样采样,再用 verifier 筛选。
其余场景,纯采样都是错的。
2. 贪心解码:简单,但目标错了
2.1 定义
1 | y_t = argmax_v p(v | y_{<t}, x) |
每步取概率最高的 token,无随机性。
2.2 它优化的是什么
贪心优化的是每一步的局部最优,而不是序列的全局最优。这两者不等价,反例很经典:
1 | Step 1: p(A)=0.6, p(B)=0.4 |
贪心选了 A,但 B 开头的序列总体概率高 60 倍。局部贪心在多步决策上是短视的。
2.3 优点(真实存在的)
| 优点 | 说明 |
|---|---|
| 完全确定性 | 同样的输入 → 同样的输出。这是可复现性、审计、回归测试的前提 |
| 零额外开销 | 一次前向,无需维护多个候选 |
| 对”唯一正确答案”任务有效 | 抽取式 QA、分类、格式转换、代码补全的确定性部分 |
| 不易产生”事实漂移” | 相比采样,不会突然抽到罕见 token 导致跑偏 |
2.4 缺点(同样真实)
| 缺点 | 机制 | 表现 |
|---|---|---|
| 退化重复 | 高概率 token 自我强化 | “这款产品非常非常非常非常…” |
| 零多样性 | 无随机性 | pass@k 评测中 k>1 无意义;同质化严重 |
| 对 prompt 敏感 | 微小改动导致输出剧变 | 换个标点,答案结构完全不同 |
| 过早锁定错误前提 | 一旦早期选错,后面无法回头 | 推理链第一步错,后面全错 |
2.5 一个常见误用:把贪心当”最安全”
很多人认为”贪心 = 最保守 = 最不会胡说”。这个直觉在抽取任务上成立,在生成任务上不成立。
原因:贪心最大化的是”每步最可能”,而模型最可能的续写在开放域上常常是最泛泛、最模板化的表达——它不会胡说,但会输出”正确的废话”。同时,一旦进入重复循环,贪心无法自行逃出(因为重复的上下文让重复 token 的概率更高)。
真正的”保守”是低温度 + 窄截断的采样,而不是贪心。 前者保留了逃离退化循环的可能性。
2.6 温度与贪心的关系
T → 0 时 softmax(z/T) 趋于 one-hot,采样退化为 argmax。所以**”温度设成 0”和”贪心”在数学上等价**。但工程上要注意:
- 大多数框架里
temperature=0会走特判分支(避免除零),行为等同于do_sample=False; - 部分框架里
temperature=0会直接报错或产生 NaN; do_sample=False时,temperature/top_p/top_k通常被忽略——这是最常见的”我明明调了参数但没生效”的原因。
3. MAP 解码与 Beam Search
3.1 严格区分:MAP ≠ 贪心
这是必须说清的一点,因为很多文章混用。
| 定义 | 可解性 | |
|---|---|---|
| MAP(最大后验) | ŷ = argmax_y p(y | x),在整个序列空间上取最大 |
不可解(精确求解是 NP-hard,序列空间 V^T) |
| 贪心 | ŷ_t = argmax p(y_t | y_{<t}),逐步取最大 |
可解,但不是 MAP |
| Beam Search | 保留 k 条候选,近似搜索 | 可解,是 MAP 的近似 |
三者只有在极特殊情况下重合(比如每步分布都是 one-hot)。
3.2 Beam Search 的机制
维护 k 条候选序列(beam width),每步:
- 对每条候选,计算词表上所有 token 的概率;
- 把所有
k × V个扩展按累计对数概率排序; - 保留前
k条,丢弃其余; - 重复直到所有候选遇到 EOS 或达到最大长度。
得分:
1 | score(y) = Σ_t log p(y_t | y_{<t}, x) |
用 log 是因为:避免连乘下溢,且把”概率相乘”变成”对数相加”(可增量更新)。
3.3 长度惩罚:不是可选优化,是必需修正
上面的得分有个致命问题:**log p < 0 恒成立,所以序列越长,得分越低**。Beam Search 会系统性地偏好短序列——输出几个词就 EOS。
修正(Wu et al., 2016 GNMT):
1 | score(y) = (1 / |y|^α) · Σ_t log p(y_t | ...) |
α = 0:无惩罚(偏好短句)α = 1:纯平均(偏好长句,可能啰嗦)α ≈ 0.6–0.7:常用折中
这个超参对输出长度的影响非常大,且没有跨任务的通用最优值。 换数据集必须重调,否则会得到”全部输出 3 个词”或”全部撞到 max_length”的极端结果。
3.4 Beam Search 的三个结构性缺陷
缺陷一:Beam Search Curse(束搜索诅咒)
现象:增大 k 在机器翻译上单调提升 BLEU,但在开放生成上先升后降,且降得很厉害。
机制:k 越大,搜索越接近”全局最可能的序列”,而全局最可能的序列往往是最通用、最平淡的(”我不知道该怎么回答这个问题。”这类句子的概率极高)。
Holtzman et al. (2020) 的实验直接对比了 human text / pure sampling / beam search 的似然与多样性,结论是:beam search 的文本在似然上最高,但在与人类文本的分布距离上最远。
缺陷二:k 条候选不是 k 种可能
Beam 里的 k 条序列通常高度相似(只差一两个 token)。它们不构成对分布的多模态覆盖,只是搜索过程中的”近邻”。所以:
- 不能用 beam 的 k 条做”多样性集成”;
- 想做多样性,要用 Diverse Beam Search(在 beam 间加惩罚项)或直接采样。
缺陷三:计算成本 × k,且无法批处理友好
每步要算 k × V 个概率(虽然共享前向,但打分和排序是额外的),显存占用随 k 线性增长。k=10 时吞吐可能掉 5–8 倍。
3.5 Beam Search 仍然不可替代的场景
| 场景 | 为什么 |
|---|---|
| 机器翻译 | 输出空间相对受限,BLEU 与似然相关性高,长度惩罚可调 |
| 语音识别 / OCR 后处理 | 需要”最可能”的转录,且候选可用声学模型重打分 |
| 结构化抽取(表格→文本) | 格式固定,最优解唯一 |
| 需要”最稳”答案且可接受平淡 | 客服 FAQ、模板化回复 |
| 配合外部重打分器(reranker) | beam 提供候选池,reranker 用更强的模型/规则重排 |
判断标准很简单:如果这个任务有”标准答案”,beam search 可能有用;如果这个任务”有很多好答案”,beam search 会让输出变差。
4. 温度缩放:被误解最深的参数
4.1 数学形式
1 | p_i(T) = exp(z_i / T) / Σ_j exp(z_j / T) |
| T | 效果 | 分布形态 |
|---|---|---|
T → 0 |
趋于 one-hot | 极小熵(= 贪心) |
T = 1 |
原始分布 | 模型训练时的分布 |
T > 1 |
拉平 | 熵增大,长尾概率上升 |
T → ∞ |
趋于均匀 | 最大熵(= 随机) |
注意 T 是在对数域除以,所以是指数级地改变概率比:
1 | p_i / p_j = exp((z_i - z_j) / T) |
T=0.5 时,原本 z 差 2 的两个 token,概率比从 e²≈7.4 变成 e⁴≈55。温度对概率比的影响是高度非线性的,这是”为什么 0.7 和 0.8 差别很大”的原因。
4.2 熵的变化不是线性的
一个被忽略的事实:温度对熵的影响不是线性的,且依赖分布本身的形状。
| 原始分布 | T=0.5 | T=1.0 | T=1.5 |
|---|---|---|---|
极尖锐(p_max=0.99) |
几乎不变(仍 0.99+) | 0.99 | 略降 |
中等(p_max=0.4,20 个候选) |
显著变尖(~0.75) | 0.4 | 变平 |
已很平(p_max=0.05,100 候选) |
明显变尖 | 0.05 | 趋于均匀 |
这意味着:同一个温度值,在不同的上下文下效果差异极大。 在模型”很确定”的位置(语法、常见词),温度几乎不影响;在模型”不确定”的位置(实体名、专业术语),温度会剧烈改变候选集。
这也是为什么”温度调参”很难有通用配方——它不是全局旋钮,是局部敏感的重参数化。
4.3 三个调参误区
误区一:把温度当”创造力”旋钮
温度只能让已有的低概率 token 更容易被选中。如果模型压根不知道某个概念(对应 token 概率 1e-8),T=1.5 也基本抽不到。
真正的”创造力”来自:模型的知识覆盖、prompt 的开放性、以及采样器对多模态的覆盖能力。温度只是最后的调节阀。
误区二:混淆”采样温度”和”校准温度”
这是两个同形不同义的东西:
| 采样温度 | 校准温度(Temperature Scaling, Guo et al. 2017) | |
|---|---|---|
| 目的 | 控制输出多样性 | 修正模型置信度校准 |
| 取值 | 0.0–2.0,人工调 | 在验证集上优化 NLL 得到,通常 < 1 |
| 应用位置 | 解码时 | 训练后处理 / 推理时对 logits 缩放 |
| 关注指标 | 多样性、连贯性 | ECE(期望校准误差) |
把一个在验证集上学到的校准温度(比如 0.85)直接当采样温度用,是常见错误——它会让输出过度确定,失去多样性。
误区三:用高温度”防止重复”
重复的根因是局部概率正反馈,不是分布太尖。把 T 调高,确实能打散重复,但同时引入了大量低质量 token,结果是”不复读但开始胡说”。
正确做法:低温度 + 窄截断(top-p 0.9)+ repetition penalty,而不是单纯加温度。
4.4 温度与截断的强耦合
这是本文最重要的一条工程结论:
温度的调整会改变整个分布,从而改变 top-p 选出的候选集。
具体地:
T高 → 分布变平 → 累积概率需要更多 token 才达到p→ 核变大 → 候选更多、更容易抽到垃圾;T低 → 分布变尖 → 核变小 → 候选很少 → 接近贪心。
所以 T=1.2, top_p=0.95 和 T=0.8, top_p=0.95 是两个完全不同的采样器,尽管 top_p 一样。
推论:调参时不能固定 top_p 单独扫温度。必须联合调,或改用对分布形状不敏感的截断方法(见 6.4 min-p)。
5. Top-k 采样:固定预算的截断
5.1 定义
保留概率最高的 k 个 token,重新归一化后采样:
1 | V_k = topk(p, k) |
k=1 等价于贪心;k=V 等价于纯采样。
5.2 它解决什么
把”必定会抽到长尾”的问题,变成”只在头部 k 个里抽”。这直接消除了 1.2 节说的长尾风险。
5.3 它的核心缺陷:k 是绝对数,而分布的”陡峭程度”是变化的
考虑两个位置:
| 位置 | 分布 | k=50 的效果 |
|---|---|---|
模型很确定(如 "2+2=" 后面) |
p("4")=0.99,其余分摊 0.01 |
后 49 个 token 的分母极小,但**归一化后它们共占 1%**——引入了不必要的噪声 |
| 模型很不确定(如句子开头) | 前 50 个 token 各占 1%–2%,第 51 个占 0.9% | 截断在合法候选中间,损失了有效质量 |
同一个 k 在两种情况下都不对:该窄的时候太宽,该宽的时候太窄。
这就是 top-p 被提出的直接动机。
6. 核采样(Top-p):按概率质量截断
6.1 定义
取累积概率达到 p 的最小 token 集合,重归一化后采样:
1 | V_p = argmin_{V' ⊆ V} { |V'| : Σ_{i∈V'} p_i ≥ p } (V' 按概率降序取前若干) |
关键差别:候选集大小是动态的。
- 分布尖锐 → 一两个 token 就够
p→ 核很小 → 接近贪心; - 分布平坦 → 需要很多 token → 核很大 → 更自由。
这个”自适应”是 top-p 相对 top-k 的唯一但决定性的优势。
6.2 数值示例
假设 p = 0.9:
| 情况 | 分布(降序) | top-50 | top-p=0.9 |
|---|---|---|---|
| A:极尖锐 | [0.95, 0.02, 0.01, ...] |
50 个(引入 5% 噪声) | 1 个(0.95 ≥ 0.9) |
| B:中等 | [0.3, 0.25, 0.15, 0.1, 0.08, 0.05, ...] |
50 个(远超需要) | 5 个(累计 0.88,加第 6 个到 0.93) |
| C:平坦 | 1000 个 token 各 0.001 | 50 个(只占 5% 质量) | 900 个(需要 900 个才到 0.9) |
情况 C 暴露了 top-p 的隐患:核可以是 900 个 token,几乎等于不截断。
6.3 Top-p 的四个坑
坑一:p 接近 1 时等于不截断top_p=1.0 保留全部词表,退化为纯采样。有些人以为 p=1.0 是”最保守”,恰恰相反。
坑二:高温 + 高 p = 双重放开T=1.3, top_p=0.98 几乎等于纯采样——分布被拉平,0.98 又几乎不截断。这是”模型胡说”最常见的参数组合。
坑三:低温 + 高 p 的伪安全感T=0.3, top_p=0.95:温度让分布极尖,核自动收缩到 1–3 个 token。看起来是”top_p 0.95 很宽松”,实际行为接近贪心。你以为在用核采样,其实在用贪心。
坑四:p 太小导致多样性归零top_p=0.1 在多数位置只会留下 1 个 token。表面上”还在采样”,实际完全确定。如果评测显示”多次采样结果完全一致”,先查这里,而不是怀疑随机种子。
6.4 min-p:对分布形状更鲁棒的替代
Top-p 的问题在于”绝对概率质量”这个量在分布形状变化时不稳定。min-p(Nguyen et al., 2024,Turning Up the Heat,arXiv:2407.01082)换了个基准:
1 | 保留 p_i ≥ p_min · max_j p_j 的 token |
即:相对最大概率的比值,而不是累积质量。
| 特性 | top-p | min-p |
|---|---|---|
| 阈值依据 | 累积概率质量 | 相对最高概率的比值 |
| 尖端分布 | 核 → 1(接近贪心,可能过度确定) | 按比值截断,仍保留若干候选 |
| 平坦分布 | 核 → 巨大(几乎不截断) | 按比值截断,自动收紧 |
| 高温下的行为 | 核膨胀,容易引入垃圾 | 衰减慢,高温下仍能保持连贯 |
| 与温度解耦 | 强耦合(温度变了核就变) | 弱耦合(比值对温度更鲁棒) |
min-p 的论文主张是:它允许在更高温度下采样而不崩,因为截断基准随峰值高度自动缩放。这对创意生成(想要高温但不想胡说)价值明显。
实践建议:如果你的场景需要 T > 1.0 的多样性,优先试 min_p=0.05–0.1 而不是继续放大 top_p。
6.5 其他截断方法(了解即可)
| 方法 | 判据 | 特点 |
|---|---|---|
| Typical Sampling(Meister et al., 2022) | 保留信息量 -log p 接近期望熵的 token |
同时排除”太可预测”和”太离谱”,理论上更优雅;工程上不如 top-p 常用 |
| η-sampling | 基于熵的绝对阈值 | 少见 |
| Mirostat | 动态控制困惑度 | 适合长文本一致性,实现复杂 |
7. 对比解码:用”减法”去掉平庸
7.1 需要先澄清:三个不同的东西
“对比解码”在文献里指至少三种机制,混用会得出错误结论。
| 名称 | 出处 | 机制 | 解决的问题 |
|---|---|---|---|
| Contrastive Search | Su et al., 2022 | 单模型。打分 = (1-α)·p(v|ctx) - α·max_sim(v, ctx) |
退化重复(用”与上下文的相似度”做惩罚) |
| Contrastive Decoding (CD) | Li et al., 2023 | 双模型。logits = (1+α)log p_exp - α log p_ama |
去掉通用/高频 token,放大专家模型的独特知识 |
| DOLA | O’Brien & Lewis, 2023 | 单模型、跨层。logits = log p_final - α·log p_early |
低成本版 CD,改善推理与事实性 |
| VCD | Leng et al., 2023 | 多模态版 CD。对比”原图”与”失真图”的 logits | 多模态幻觉 |
其中只有 CD / DOLA / VCD 是真正的”对比两个分布”,Contrastive Search 本质是一个抗重复的打分函数。 本文后续的”对比解码”指 CD 家族。
7.2 CD 的直觉
把两个模型的分布相减:
1 | log p_CD(v) = (1 + α) · log p_expert(v) - α · log p_amateur(v) |
展开看:
1 | = log p_expert(v) + α · [log p_expert(v) - log p_amateur(v)] |
即:**在专家模型的分布上,额外奖励”专家比业余模型更偏好的 token”**。
直觉:业余模型(小模型 / 早期层)捕捉的是”通用的、高频的、语法性的”规律。专家模型比它多出来的部分,才是真正的知识。相减相当于:
- 抑制”the / of / is”这类两个模型都觉得该出现的 token;
- 放大”专家认为该出现但业余不认为”的专业术语。
这与”用更大模型”不是一回事——它是用两个模型的差异做信号增强,成本接近单模型(DOLA 甚至完全免费)。
7.3 参数 α 的行为
α = 0:退化为专家模型的普通解码;α增大:对比增强,专业性上升,但流畅度和多样性下降;α过大:分布可能被推到”专家认为可能但业余认为不可能”的极端 token 上 → 出现罕见词、拼写错误、语法崩坏。
**必须加一个”合理性约束”**(Li et al. 2023 的做法):只保留满足 p_expert(v) ≥ β · max_w p_expert(w) 的 token,再做 CD。否则会出现”为了对比而对比”的崩坏。
7.4 优点与代价
| 优点 | 代价 |
|---|---|
| 事实性/推理能力提升(不需微调) | 双模型 → 显存 ×2、计算 ×2(DOLA 除外) |
| 抑制”安全但空洞”的通用回答 | α 敏感,需按任务调 |
| 可与任意采样器叠加 | 两个模型必须同 tokenizer,否则 logits 无法对齐 |
| DOLA 版本几乎零额外成本 | 对比会放大 artifacts(生僻词、格式错误) |
| 流畅度/多样性下降,长文本易疲劳 |
7.5 什么时候值得用
值得:
- 知识密集型 QA(需要模型”说出专业细节”而不是”说套话”);
- 需要减少”我不知道”式的回避;
- 有现成的小模型可作 amateur(同一家族的不同规模最佳);
- 多模态幻觉抑制(VCD)。
不值得:
- 创意写作(CD 会压制多样性,与目标冲突);
- 低延迟场景(双模型翻倍);
- 模型本身已经很强(CD 的增益随基座能力上升而递减)。
7.6 一个常被忽略的风险:逐字复现
Contrastive Search 尤其容易逐字复现训练数据。原因是它的惩罚项只惩罚”与上下文的相似”,一旦上下文本身就是训练语料里的片段,模型会被推向”继续复制”。
如果涉及版权敏感的内容生成,不要用 Contrastive Search(或用 n-gram 遮挡做后处理)。
8. 约束解码:把”不许说”变成”不可能说”
8.1 核心机制:在 logits 上做掩码
约束解码不是一种采样器,而是在采样前修改 logits:
1 | z'_i = z_i if token i 在当前状态下合法 |
关键在于”当前状态下合法”的判定。三种实现层级:
| 层级 | 机制 | 表达力 | 代表 |
|---|---|---|---|
| 词表级掩码(ban list / allow list) | 静态黑白名单 | 最弱 | 各类 bad_words_ids |
| 正则 / FSM | 编译成正则自动机,按前缀推进状态 | 中(正则语言) | Outlines(Willard & Louf, 2023) |
| CFG / 语法 | 上下文无关文法,维护解析栈 | 最强(含嵌套、递归) | XGrammar、Guidance、LMQL、llama.cpp GBNF |
8.2 FSM 方案的工作方式
以 JSON 为例,正则描述”当前应该输出 { 或 " 或数字”:
- 预编译:把正则转成 DFA,对每个状态预计算”哪些 token 可从该状态出发”(用 token 的前缀树匹配);
- 运行:每步根据当前 DFA 状态,得到合法 token 集合,掩码 logits;
- 推进:选中 token 后,按 token 的字符序列推进 DFA 状态。
难点在第 1 步的预计算:词表 5 万 × DFA 状态数,可能到百万级组合。Outlines 的做法是构建 token 的 trie,与 DFA 做交,只存可达组合。大语法(如完整 JSON Schema + 长枚举)的预编译可能耗时数十秒,需要缓存。
8.3 五个真实的坑
坑一:Tokenization 边界跨字符
一个 token 可能对应多个字符(如 "name" 可能是一个 token)。DFA 按字符推进,但 token 是原子的。必须做”token 前缀是否与 DFA 路径一致”的匹配,而不是简单按首个字符判断。这是自研实现最常见的 bug。
坑二:Grammar Tax(语法税)
Geng et al. (2023) 的发现:强制语法约束会降低语义质量。原因有二:
- 掩码后模型被迫从”它本来不想选”的 token 里选,分布被扭曲;
- 模型在训练时从未见过”被掩码的分布”,这是分布外推。
表现为:JSON 格式完美,但字段内容变得空洞或错位。约束越强(如复杂 CFG),tax 越重。
坑三:掩码导致”全 -inf”
如果前缀已经走到一个不可接受的状态(比如生成了非法字符),后续所有 token 都可能被掩码 → softmax 全零 → NaN。
应对:状态必须可回溯(在某些实现里叫 “token healing” 或 rewind),或者允许”逃生 token”(少量 token 始终合法,用于跳出死局)。
坑四:与 repetition penalty 打架
repetition penalty 会修改 logits(把出现过的 token 概率除以惩罚系数)。如果这个操作发生在掩码之后,可能把概率质量推到已被掩码的 token 上(-inf 除以任何数还是 -inf,但归一化时其余 token 的分母变了);如果发生在之前,可能让一个合法但重复的 token 被过度压制,导致输出怪异。
正确顺序:先做所有 logit 变换(penalty、temperature、CD),最后做约束掩码,然后 softmax。 掩码必须是最靠近 softmax 的一步。
坑五:语法正确 ≠ 语义正确
JSON Schema 能保证”age 是整数”,不能保证”age 是这个人真实的年龄”。约束解码只解决 syntax,不解决 semantics。 很多团队在接入约束解码后,误以为幻觉问题解决了——其实只是从”格式错”变成了”格式对的错”。
8.4 什么时候必须用
| 场景 | 约束形式 | 备注 |
|---|---|---|
| Function calling / 工具调用 | JSON Schema | Agent 的硬需求,否则解析失败 |
| 结构化抽取 | JSON / 固定字段 | 保证下游可解析 |
| 代码生成 | CFG(目标语言语法) | 保证可编译,但不保证正确 |
| SQL 生成 | 目标方言的 CFG | 同上 |
| 分类 / 枚举输出 | 枚举白名单 | 最简单也最有效 |
| 格式严格的报告 | 模板 / 正则 | 如日期、编号 |
判断标准:如果下游程序要 json.loads() 它,就必须用约束解码。如果输出是给人看的,用 prompt 约束 + 后处理校验更划算(避免 grammar tax)。
9. 自洽解码:用采样换正确率
9.1 机制
不是”改进单次解码”,而是”多次采样 + 聚合“:
- 用非零温度采样
N条推理路径(T通常 0.5–1.0,top_p0.9–1.0); - 从每条路径中抽取最终答案(正则/解析器);
- 对答案做多数投票(majority vote);
- 输出票数最高的答案。
Wang et al. (2023) 的原始结果:PaLM-540B 在 GSM8K 上,贪心 CoT 约 56.5%,自洽(N=40)达到约 74.4%(论文自报,不同复现略有差异)。
注意增益的来源:不是”投票选出对的”,而是”错误是分散的,正确是集中的“。如果模型对某类题有系统性误解,40 条路径会一致地错,投票无效。
9.2 四个前提条件(缺一不可)
| 前提 | 说明 | 缺了会怎样 |
|---|---|---|
| 答案可抽取且可比较 | 数字、选项、短实体 | 自由文本无法投票 |
| 模型有基础能力 | 单次准确率 > 随机 | 全错的时候投票还是错 |
| 采样有真实多样性 | T > 0,核足够宽 |
40 条全一样,等于贪心 |
| 错误分布分散 | 错在不同地方 | 系统性偏差,投票放大错误 |
第三条是最容易失效的:很多人设了 T=0.7 但 top_p=0.5,实际核只有 1–2 个 token,40 条采样高度同质,收益接近零,成本 ×40。
9.3 成本结构
| 项 | 成本 |
|---|---|
| 计算 | N × 生成 token 数(可并行,墙钟时间增加有限) |
| 显存 | N × KV cache(若并行) |
| 工程 | 答案抽取器、投票逻辑、平票处理 |
N 的边际收益递减很快:多数任务上 N=5 拿到约 70% 的收益,N=40 才拿满。N=5–10 是性价比区间,N>20 只在离线/高价值场景合理。
9.4 三个易踩的坑
坑一:答案没归一化
“¥1,200”、”1200”、”1.2k” 会被当成三个不同答案。必须先做单位/格式归一化,否则投票是噪声。
坑二:把”一致性”当”正确性”
模型可以自信地一致犯错。自洽的输出只是”模型内部共识”,不是”事实”。在高风险场景必须配外部 verifier(执行代码、查数据库、检索核对)。
坑三:用在开放生成上
“写一段产品文案”没有可投票的答案。这类任务应该用 best-of-N + 奖励模型/verifier 打分,而不是投票。
9.5 自洽的泛化形态(2025–2026 的主流)
自洽的本质是”用多次采样 + 选择机制提升可靠性“,这个框架已经泛化出多个变体:
| 变体 | 选择机制 | 适用 |
|---|---|---|
| Majority Vote | 答案票数 | 有离散答案的推理 |
| Best-of-N + Verifier | 奖励模型/ORM 打分 | 无标准答案但有质量信号 |
| Best-of-N + 执行验证 | 跑单测/跑代码 | 代码生成 |
| Tree Search / MCTS | 搜索 + 价值估计 | 复杂推理(o1/R1 类的内部机制) |
| Self-Refine / Critic | 自我批评后重写 | 长文生成 |
2024 年之后的一个重要变化:推理模型(o1/R1 系列)把”搜索”内化到了模型里(生成更长的思维链、内部多路径探索)。对外部解码策略的影响是:
- 外部采样参数的重要性下降(模型自己会探索,不需要你用高温逼它);
- best-of-N 仍有效,但 N 可以更小;
- 自洽的收益变小(因为单次已经接近”多次采样后的结果”)。
10. 汇总对比表
10.1 策略总表(九种核心 + min-p 扩展)
| 策略 | 核心公式 / 机制 | 随机性 | 额外成本 | 最适合 | 主要风险 |
|---|---|---|---|---|---|
| 纯采样 | y_t ~ p(·) |
高 | 1× | pass@k 评测、数据合成、best-of-N 前置 | 长尾 token 导致崩坏 |
| 贪心 | argmax p(·) |
无 | 1× | 抽取、分类、格式化、可复现场景 | 退化重复、零多样性 |
| Beam Search | 保留 k 条,Σ log p + 长度惩罚 |
无 | k× | 翻译、ASR、有唯一答案的生成 | beam curse、k 条高度相似 |
| 温度缩放 | softmax(z/T) |
调节器 | 1× | 配合任意采样器 | 与截断强耦合、易误调 |
| Top-k | 保留前 k,重归一化 | 中 | 1× | 简单可控的对话 | k 是绝对数,不适应分布形状 |
| Top-p(核) | 累积质量 ≥ p 的最小集 | 中 | 1× | 通用默认 | p→1 等于不截断、与温度强耦合 |
| min-p | p_i ≥ p_min · p_max |
中 | 1× | 高温下的创意生成 | 生态支持较少,需手写 |
| 对比解码 | (1+α)log p_exp - α log p_ama |
中 | 2×(DOLA 1×) | 知识密集 QA、幻觉抑制 | α 敏感、流畅度下降、需同 tokenizer |
| 约束解码 | 非法 token 置 -inf |
取决于底层采样器 | 1× + 预编译 | JSON / 工具调用 / 代码 | grammar tax、跨字符 token、全 -inf |
| 自洽解码 | N 次采样 + 多数投票 | 高(需 N 次) | N× | 数学/逻辑推理 | 答案不可投票、系统性偏差 |
10.2 它们分属不同”层”
这是理解组合关系的关键——**这些策略不在同一层,所以不能简单”选一个”**:
1 | 第 0 层 搜索框架 :贪心 / Beam / 采样(决定"要不要看多个候选") |
同一个系统里,第 1–3 层是叠加的,第 0 层是互斥的,第 4 层是外层的循环。
11. 组合顺序:真实 pipeline 的行为
这一节是本文最”工程”的部分。大多数参数调不明白,是因为不知道框架内部的执行顺序。
11.1 标准执行顺序
1 | logits (V,) |
三条硬规则:
- 温度必须在 top-p 之前——因为 top-p 的阈值定义在概率上,而概率依赖温度;
- 约束掩码必须在最后——否则其他变换会把概率质量推回被禁 token;
- penalty 必须在温度之前——它是 logit 空间的加性/乘性修正,应该先于归一化。
11.2 top-k 和 top-p 一起用,到底发生了什么
这是被问得最多、也误解最深的一点。
串联时的真实行为:
1 | 先 top-k:候选集从 V 缩到 k 个,重归一化 → 概率和为 1 |
所以:
| 参数组合 | 实际效果 |
|---|---|
k=50, p=0.95 |
通常 p 生效(50 个里累积到 0.95 往往只要 5–20 个),k 基本是”安全上限” |
k=10, p=0.99 |
通常 k 生效(10 个的累积可能只有 0.85,永远达不到 0.99,于是全保留) |
k=5, p=0.5 |
两者都生效,实际核 = 在 5 个里累积到 0.5,非常窄 |
k=1000, p=0.9 |
p 生效,k 是无效参数(形同虚设) |
结论:两个都设,实际生效的是”更严格的那个”(取交集)。
这带来两个副作用:
副作用 A:k 会”截断 p 的本意”
top-p 的设计意图是”自适应”——分布平坦时放开到很多 token。但如果 k=40,平坦分布的核被硬性限制在 40 个,自适应能力被破坏。这时 top-p 退化成了”min(40, p 对应的核)”。
副作用 B:p 会让 k 失去可解释性
你设 k=50 以为”最多 50 个候选”,但实际可能只有 6 个。日志里看到的分布行为与参数直觉不符,调参变成盲调。
实践建议:
- 只用一个。通用场景用 top-p(
0.9–0.95);需要严格延迟/内存控制时用 top-k; - 如果框架强制两个都有(如 HF
generate),把不用的那个设为中性值:top_k=0(表示禁用)或top_p=1.0; - 绝不要两个都设成”紧”的值(如
k=10, p=0.5),那实际上是一个极窄的确定性采样器,你以为是”稳”,其实接近贪心且不可预测。
11.3 温度与 top-p 的联合调参
因为 T 改变分布 → 改变核大小,所以必须二维联合,不能一维扫。
一个可操作的做法(以”想要多样性但不胡说”为目标):
| 目标 | T | top_p | 说明 |
|---|---|---|---|
| 几乎确定(抽取) | 0.0–0.2 | 0.9 | 温度主导,核自动很窄 |
| 稳健问答(RAG) | 0.2–0.4 | 0.9 | 事实优先,允许轻微措辞变化 |
| 通用对话 | 0.6–0.8 | 0.9–0.95 | 平衡 |
| 创意写作 | 0.9–1.1 | 0.95–0.98 | 或改用 min-p |
| 高温创意(少胡说) | 1.0–1.3 | — | 改用 min_p=0.05–0.1,不用 top-p |
| 自洽采样 | 0.7–1.0 | 0.95–1.0 | 核要足够宽,否则 N 次采样同质 |
验证方法:固定 prompt,采样 20 次,统计”输出完全一致的比例”和”输出的语义簇数”。如果一致率 > 80%,说明核太窄,采样没起作用。
11.4 一个被忽视的交互:repetition penalty 的副作用
repetition_penalty 的实现(HF 风格)是:对已出现 token,正 logit 除以 r、负 logit 乘以 r(r > 1 时压制)。
三个副作用:
r稍大就破坏语法:r=1.3时,模型可能被迫避开必要的功能词(”的”、”is”),产生不通顺的句子;- 与约束解码冲突:被 penalty 压低的 token 如果是唯一合法候选,掩码后仍然会被选中,但概率被扭曲;
- 长文本累积漂移:出现过的 token 越多,被压制的集合越大,越到后面越”词穷”。
建议:repetition_penalty 保持在 1.0–1.1,不要超过 1.2。如果重复严重,优先检查是不是解码器选错了(贪心 + 长生成),而不是加大惩罚。
12. 踩坑清单
12.1 参数层面
| 坑 | 现象 | 根因 | 修法 |
|---|---|---|---|
temperature 不生效 |
调了参数输出没变 | do_sample=False 时温度被忽略 |
确认 do_sample=True 或直接设 temperature=0 |
top_p=1.0 以为更稳 |
输出莫名发散 | p=1 等于不截断 |
用 0.9–0.95 |
top_k=0 报错 |
部分框架 k=0 非法 |
语义不一致(HF 里 0=禁用) | 查框架文档,或用中性大值 |
| 两个截断都设紧 | 采样”很随机”但结果几乎一致 | 取交集,核极小 | 只留一个 |
| 温度调高仍重复 | 加 T 后不复读但开始胡说 | 重复的根因是概率正反馈,不是分布太尖 | 低 T + 窄核 + 轻 penalty |
| penalty 过大 | 句子不通顺、功能词缺失 | 压制了必要 token | r ≤ 1.1 |
| max_tokens 太小 | 输出被硬截断,JSON 不完整 | 解码预算不足 | 约束解码场景要预留足够预算 |
12.2 语义/质量层面
| 坑 | 说明 |
|---|---|
| 把高似然当高质量 | 束搜索/贪心输出”正确的废话” |
| 把低温度当准确 | 低温度只是更确定,不更正确;模型不知道的仍然不知道 |
| 把自洽当正确 | 一致性 ≠ 事实性,需外部验证 |
| 把语法约束当语义约束 | JSON 合法不代表字段正确 |
| 用温度掩盖能力不足 | 换了三个温度值都不对,说明问题在 prompt 或知识,不在解码 |
12.3 评测层面
| 坑 | 后果 | 修法 |
|---|---|---|
| 单次采样做评测 | 方差极大,结论不可靠 | ≥5 次采样,报均值±标准差 |
| 用贪心做 pass@k 评测 | k>1 无意义(输出相同) | pass@k 必须无偏采样 |
| 不同任务用同一套参数 | 抽取任务发散、创意任务僵硬 | 按场景分参数配置 |
| 忽略生成长度的影响 | 长输出的质量衰减被平均掉 | 分段评估(前 200 / 中 / 尾) |
| 只看最终答案不看过程 | 掩盖推理链的退化 | 同时评估过程指标 |
12.4 工程/部署层面
| 坑 | 说明 |
|---|---|
| 不可复现 | 采样 + 未固定种子 + 浮点非确定性(batch 内不同位置)→ 同输入不同输出。要复现必须 T=0 + 固定 batch |
| 参数分散在多层 | 框架默认值 + 应用配置 + 请求参数,三层覆盖顺序不清 |
| 流式输出与约束冲突 | 约束解码在 token 边界可能”卡住”,流式会看到长时间无输出 |
| best-of-N 的显存 | N 路并行 → KV cache ×N,容易 OOM |
| 自洽的答案抽取失败 | 正则没覆盖某种输出格式 → 大量样本被丢弃 → 有效 N 骤减 |
13. 工程选型
13.1 四类场景的默认配方
| 场景 | 推荐解码 | 参数起点 | 理由 |
|---|---|---|---|
| RAG(问答/摘要) | 贪心 或 低温度采样 + top-p | T=0.1–0.3, top_p=0.9(或 T=0) |
忠于检索内容,抑制”自由发挥”;引用编号不能错 |
| Agent(工具调用) | 约束解码 + 低温度 | T=0–0.2 + JSON Schema 约束 |
输出必须可解析;参数错误 = 任务失败;需要可复现 |
| Agent(规划/分解) | 采样 + 自洽(N=3–5) | T=0.7, top_p=0.95,多方案后验证 |
规划有多解,单次易陷入局部最优;用执行结果或 verifier 选择 |
| 推理(数学/逻辑) | 自洽 或 best-of-N | T=0.7–1.0, top_p=0.95–1.0, N=5–10 |
需要覆盖多条推理路径;错误分散时投票有效 |
| 创意生成(文案/故事) | min-p 或 top-p,较高温度 | T=0.9–1.1, min_p=0.05 或 top_p=0.95–0.98 |
需要多样性;用 min-p 避免高温崩坏 |
| 代码生成 | 低温度 + 约束(语法)+ 执行验证 | T=0.2, top_p=0.95,配合单测 |
需要正确性;语法约束保编译,单测保语义 |
| 结构化抽取 | 约束解码 + 贪心 | T=0 + JSON Schema |
确定性优先,格式必须对 |
| 翻译 | Beam Search(k=4–5, α≈0.6) | beam=4, length_penalty=0.6 |
有标准答案,BLEU 与似然相关 |
| 数据合成 | 纯采样 / 高温度 | T=1.0–1.2, top_p=1.0 |
需要覆盖分布 |
13.2 Agent 场景:为什么”低温度 + 约束解码”是默认
Agent 的解码约束比普通对话严格得多,原因有三个:
- 输出必须机器可解析。工具调用的 JSON 一旦格式错,整条链路断掉。这使**约束解码从”优化”变成”必需”**;
- 参数错误不可恢复。
{"date": "明天"}比{"date": "2026-11-12"}更难处理,而低温度能让模型更倾向输出规范格式; - 需要可复现的调试。Agent 失败时,你要能重放。
T=0是唯一能做到的方式。
但规划阶段是例外:单一规划容易陷入”第一条想到的路”,而这条路可能不可行。这时应该:
1 | 采样 N=3–5 个计划(T=0.7) |
这是”用采样换鲁棒性,用验证替代投票“,比纯自洽更适合 Agent(因为计划没有”票数”,只有”可行/不可行”)。
13.3 RAG 场景:三个具体建议
建议一:T 要低,但不能是 0
T=0 的问题是确定性退化:模型可能陷入模板化表达,或者在长文档摘要时反复复述同一句。T=0.1–0.3 保留一点措辞变化,同时不引入事实漂移。
建议二:引用/编号必须用约束解码或后校验
RAG 最常见的严重错误是”编造引用编号”。两种解法:
- 约束:把引用编号限制在
[1, N]的白名单里(枚举解码); - 后校验:生成后用正则提取所有
[n],检查n ≤ N,超界则重生成或剔除。
建议三:摘要任务要控制生成长度
长摘要的尾部质量衰减明显(模型越写越空)。用 min_tokens + 明确的结构约束(”分三点,每点不超过两句”)比调温度有效。
13.4 推理场景:N 的选择与验证器
| N | 相对收益 | 适用 |
|---|---|---|
| 1(贪心) | 基线 | 简单题、低延迟 |
| 3–5 | 约 60–70% 的增益 | 线上默认 |
| 10–20 | 约 85–90% | 高价值、离线 |
| 40+ | 接近饱和 | 研究/评测 |
**关键不是 N,是”有没有 verifier”**:
- 有可执行验证(代码跑单测、数学能符号验证、答案能查库)→ best-of-N 优于投票,因为验证比投票更准;
- 无可执行验证(开放式推理)→ 投票是唯一可用的聚合方式。
13.5 一个决策清单
如果你只想要一个可执行的判断流程:
1 | 1. 输出需要被程序解析吗? |
14. 前沿:2025–2026 的三个变化
① 解码正在被”内化”到模型里
推理模型(o1/R1 系列)把搜索、反思、多路径探索放进了生成过程。对外部解码的影响:
- 采样参数的重要性下降(模型自己在做 test-time search);
- 自洽的收益变小(单次输出已经等价于”多次采样的聚合”);
- 但约束解码仍然必需(结构化输出不会因为模型变强而消失)。
② 采样器的改进集中在”高温下的稳定性”
min-p(2024)之后,社区的方向从”设计更好的截断规则”转向”让截断对温度更鲁棒”。这对创意生成、数据合成、多样本生成都直接有用。
③ “解码”的边界在扩展到 test-time compute
如果把”解码”理解为”如何用推理算力换质量”,那 best-of-N、verifier 引导的搜索、MCTS、并行思考都属于解码的广义范畴。这个视角下,2026 年的核心问题不是”选哪个采样器”,而是”算力该花在采样上还是花在验证上“。
我的判断:验证的 ROI 高于采样。5 个候选 + 一个可靠 verifier,比 50 个候选 + 投票更有效,也更便宜。
15. 小结
- 解码的三种哲学:最大化似然、从分布采样、受控生成。 选错哲学比选错参数严重得多——用贪心做创意生成、用高温做事实问答,都是根本性错配。
- 更高概率 ≠ 更好文本。 人类文本的模型似然显著低于模型自生成的高概率文本。这是全部截断采样(top-k/top-p/min-p)存在的理由,也是束搜索在开放生成上失效的原因。
- 贪心不是 MAP,束搜索也只是 MAP 的近似。 序列级 MAP 在自回归模型上不可解;贪心是逐步局部最优,短视且容易退化。
- 束搜索的三个硬缺陷:长度偏置(必须加长度惩罚,且 α 需按任务重调)、beam curse(k 越大越平淡)、k 条候选高度相似(不能当多样性用)。它只适合”有唯一答案”的任务。
- 温度是”方差旋钮”,不是”创造力旋钮”。 它只能重塑已有分布;对概率比的影响是指数级的(
p_i/p_j = exp((z_i-z_j)/T)),所以在不同上下文里效果差异极大。 - 温度与 top-p 强耦合,必须二维联合调。 高温让核膨胀、低温让核收缩。这也是”我明明设了 top_p=0.95 但输出像贪心”的原因——
T=0.3时核早就缩到 1–2 个 token 了。 - top-k 和 top-p 一起用,实际生效的是”更严格的那个”(取交集)。
k=50, p=0.95通常 p 生效;k=10, p=0.99通常 k 生效。两个都设紧值 = 一个不可预测的确定性采样器。只留一个,另一个设中性值。 - 对比解码的本质是”用减法去平庸”。
(1+α)log p_exp - α log p_ama等价于”奖励专家比业余更偏好的 token”。DOLA 用同模型的早期层替代业余模型,几乎零成本。但它压制多样性、α 敏感、双模型需同 tokenizer。 - 约束解码把”不许说”变成”不可能说”,但只保语法不保语义。 五个真实的坑:token 跨字符边界、grammar tax、全 -inf 死锁、与 penalty 打架、掩码必须在最后。语法对的错,比格式错更难发现。
- 自洽的收益来自”错误分散、正确集中”,四个前提缺一不可:答案可抽取、模型有基础能力、采样有真实多样性、错误非系统性。最常见的失效是”设了 T=0.7 但 top_p=0.5”,40 次采样同质,成本 ×40 收益 ≈ 0。
- 执行顺序有硬约束:penalty → 对比 → 温度 → top-k → top-p → 约束掩码 → softmax。温度和约束掩码的位置尤其不能错。
- 验证的 ROI 高于采样。 5 个候选 + 一个可靠 verifier > 50 个候选 + 投票。如果只能做一件事,做 verifier,而不是调温度。
如果只留一句:解码是在”模型想说什么”和”你要什么”之间做仲裁——参数只调得动前者,后者得靠约束和验证。
参考来源
核心论文
- Holtzman et al., The Curious Case of Neural Text Degeneration, ICLR 2020(top-p / nucleus sampling;人类文本似然分析;beam search 退化)
- Fan, Lewis, Dauphin, Hierarchical Neural Story Generation, ACL 2018(top-k sampling)
- Wu et al., Google’s Neural Machine Translation System, 2016(beam search + length penalty,α 的原始形式)
- Guo et al., On Calibration of Modern Neural Networks, ICML 2017(temperature scaling 用于置信度校准)
- Meister et al., Locally Typical Sampling, TACL 2022
- Nguyen et al., Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs, arXiv:2407.01082(min-p)
- Su et al., A Contrastive Framework for Neural Text Generation, NeurIPS 2022(Contrastive Search)
- Li et al., Contrastive Decoding: Open-ended Text Generation as Optimization, ACL 2023
- O’Brien & Lewis, Contrastive Decoding Improves Reasoning in Large Language Models(DOLA),2023
- Leng et al., Mitigating Object Hallucinations in Large Vision-Language Models through Visual Contrastive Decoding(VCD), 2023
- Wang et al., Self-Consistency Improves Chain of Thought Reasoning in Language Models, ICLR 2023
- Willard & Louf, Efficient Guided Generation for Large Language Models, 2023(Outlines / FSM)
- Geng et al., Grammar-Constrained Decoding for Structured NLP Tasks without Finetuning, EMNLP 2023(grammar tax)
- Lu et al., An Empirical Study of Constrained Decoding for LLMs, 2024–2025(约束对语义质量的影响)
延伸阅读
- arXiv:2602.18292, Decoding as Optimisation on the Probability Simplex: From Top-K to Top-P (Nucleus) to Best-of-K Samplers, 2026(把 top-k/top-p 统一为单纯形上的优化问题)
- 关于 min-p 的中文解读:腾讯新闻,2025-09-30
说明:文中所有具体数值(如自洽 56.5%→74.4%)均为论文自报,不同复现条件、不同版本的模型会有偏差;采样参数的建议区间来自工程经验,必须在自己的模型与数据上验证——不同厂商的 tokenizer、logit 尺度、默认 system prompt 都会改变最优参数。