> For the complete documentation index, see [llms.txt](https://yeasy.gitbook.io/llm_internals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yeasy.gitbook.io/llm_internals/di-san-bu-fen-tui-li-yu-bu-shu-pian/10_inference_optimization/10.6_speculative_decoding.md).

# 10.6 投机解码：为什么“先猜后验”能加速

**投机解码**（Speculative Decoding）打破了自回归解码“每步只生成一个词元”的限制。它使用一个小的**草稿模型**快速猜测多个后续词元，然后用大的**目标模型**并行验证所有猜测。10.4 与 10.5 改的都是模型本身——位宽、参数量，乃至换一个蒸馏出来的小模型；本节的方法不改目标模型的任何一个权重，改的是每次前向传播能产出几个词元。

## 10.6.1 无损性保证

「先猜后验」听起来像是拿准确率换速度，但它不是——关键数学保证是：经典 speculative sampling 的接受/拒绝算法可以做到与目标模型原始自回归采样产生完全相同的分布，即在该设定下是“无损”的加速。Medusa、EAGLE、Lookahead 等变体是否保持严格同分布，取决于各自的验证和采样算法。

## 10.6.2 为什么有效

大语言模型中大量的词元实际上是“容易预测”的（如常见词组、语法词、标点等）。对于这些位置，小模型的猜测通常与大模型一致，因此可以一次性通过多个词元的验证。

只有在小模型猜错的位置，才需要回退并使用大模型的预测。对经典的“小草稿模型”形态，统计上一次投机解码步骤通常能接受 1-3 个词元，将吞吐量提升 1.5-2.5 倍（最优场景下可达 2-3 倍，取决于草稿模型质量和任务类型）。需要说明的是，这个区间描述的是**经典形态**，并非投机解码的能力上限——10.6.3 会看到，改变草稿的产出方式之后，这两个数字都还有提升空间。

## 10.6.3 实际部署

投机解码已成为主流推理框架中的常见可选优化。vLLM、TensorRT-LLM 和 SGLang 等框架提供了不同形态的支持，但生产收益高度依赖草稿模型质量、批量大小、采样温度和请求分布；是否启用以及如何自适应控制，需要用目标业务流量实测。

除了“小草稿模型 + 大目标模型”的经典形态，近年的系统还发展出几类变体：**Medusa** 在目标模型上增加多个解码头，用树状注意力一次提出多条候选；**EAGLE** 在倒数第二层特征空间预测草稿，再由原模型验证；**Lookahead Decoding** 则尝试用并行的 n-gram 候选和验证打破逐词串行瓶颈。这些方法的共同目标都是提高每次目标模型前向传播可接受的词元数。

其中**经典小草稿模型与 EAGLE 系列**还共享一个前提：草稿本身是**自回归、逐词产出**的（Medusa 的多解码头与 Lookahead 的并行 n-gram 已经各自部分绕开了这一点）。在这个前提下，草稿开销随草稿长度 $$\gamma$$ 近似线性增长，为了把这部分延迟压住，草稿模型只能做得很浅——EAGLE-3 的草稿器在标准配置下就只有一层 Transformer。2026 年出现的 **DFlash**（[Block Diffusion for Flash Speculative Decoding](https://arxiv.org/abs/2602.06036)，ICML 2026）换掉了这个前提：它用**块扩散**的方式让草稿器在**一次前向传播中并行产出整块草稿词元**，草稿开销因而不再随草稿长度线性增长（论文的表述有两处限定——“在中等 block 规模下”“对 $$\gamma$$ 基本不敏感”，不宜读成与长度完全无关）。

这带来一个反直觉的结果：**草稿器可以做得更深**。论文报告，一个五层的 DFlash 草稿器生成 16 个词元，在延迟和接受长度两项上同时优于只生成 8 个词元的 EAGLE-3——把“草稿质量 vs 草稿开销”的帕累托前沿整体推了出去。这背后是一条更一般的工程直觉：**当某项开销的瓶颈是串行度而非计算量时，把它改写成能被硬件并行吃下的形式，往往比继续压缩它更有效。**

第二个可复用的设计点是**用目标模型的状态去约束草稿器**。EAGLE 在目标模型的倒数第二层特征空间里做草稿已经体现了这个思路，DFlash 进一步把**目标模型的上下文隐藏状态**取出来，经**草稿器自己的 KV 投影**后写入草稿器每一层的 KV 缓存（论文称 KV injection）——注意区别：EAGLE 的草稿 KV 完全来自草稿器自身的表示，DFlash 换掉的是**被投影的那份表示的来源**，而不是让草稿器直接复用目标模型的 KV。可以把它抽象成一个设计维度：**草稿质量在很大程度上取决于草稿器能看到多少目标模型的上下文**。

## 10.6.4 性能因素与工程约束

投机解码的实际加速效果取决于三个关键因素：

1. **草稿词元成本**：生成草稿词元并非免费——它消耗计算和内存资源。目标模型的优势不在于“验证一个词元天然很便宜”，而在于一次并行前向可以验证多个草稿词元；只有当平均接受长度足以覆盖草稿模型和验证开销时，整体才会加速
2. **草稿序列长度**：每次前向传递生成的草稿词元数量。一旦某个草稿词元被拒绝，其后的所有词元也会被丢弃。对**自回归逐词产出草稿**的方案（小草稿模型、EAGLE/EAGLE-3、MTP 等），草稿开销随长度线性上升，因此应追求短而高命中率的序列；但这条经验规则依赖的正是“草稿是串行产出的”这一前提——对 10.6.3 中的并行块草稿方案，它不再直接适用
3. **词元接受率**：目标模型接受的草稿词元占比。接受率在序列早期较高，随深度递增而下降

工程中需要特别注意以下约束：

* **温度参数的影响**：较高的采样温度导致词元分布更难预测，降低投机解码的有效性。在创意写作等高温度场景下，投机解码的收益可能大幅缩水
* **批量大小的限制**：投机解码在低批量大小时最有效，因为此时 GPU 有空闲计算资源可用于验证。批量为 $$B$$、投机 $$K$$ 个词元时，目标模型每步要验证 $$B \times K$$ 个词元，超过某个点后这笔开销就大于它省下的时间。**但由此得出“高并发下应当禁用投机解码”是过度简化的**：DeepSeek 等生产系统更早的做法其实是退回**更短的静态草稿**（如 MTP-1 的 2 词元草稿），而不是关掉投机。真正随负载恶化的是**静态的多词元草稿**，不是投机本身。2026 年的 DSpark（[arXiv:2607.05147](https://arxiv.org/abs/2607.05147)，DeepSeek）把这个**静态选择**换成了**连续的调节量**：草稿器额外输出一个置信度头，估计每个草稿词元“能通过验证”的条件概率，整块的存活概率是它们的累积乘积；再用一次校准（Sequential Temperature Scaling，一种保序变换，只把概率对齐到真实接受率、不打乱排序）让这个估计可信；最后由调度器把存活概率换算成**每个请求、每一步各自的验证预算**。于是验证长度随负载**平滑下降**，而不是到某个阈值突然关停。注意两点分寸：单个请求的预算下界是 0 而非 1，所以在负载或置信度足够低时，它确实可以退化到不验证；而在批量为 1 时裁剪几乎没有收益——这是个**高并发才兑现**的优化
* **内容领域的差异**：草稿模型在不同主题上的预测准确度不同——如果草稿模型在数学领域比历史领域更擅长，那么数学相关生成的接受率会更高

实践中，找到正确的投机解码配置需要耐心的实验。据报道，推理工程师有时需要尝试数十种不同的配置组合，才能找到最优方案。技术之间也存在相互影响：量化 KV 缓存可以缓解分离式架构中的瓶颈，但增大批量大小会减少可用于投机验证的空闲计算资源。
