大模型的解码,是推理的第二个阶段:模型基于已经读懂的输入,一个字一个字地把答案写出来。这个写的过程叫自回归,每一步都把自己的输出当作下一步的输入,循环往复,直到写出结束标志或触及长度上限,屏幕上的逐字出现正是这个循环的外在表现。
进来什么:上一步的结果与已缓存的 KV
解码每一步的输入很窄:上一步刚生成的那个字,加上预填充阶段存下来的 KV 缓存。历史信息不需要重新计算,直接从缓存里取,这是解码能持续进行的前提。
这正是解码快的秘诀,也是它省不了的原因:每一步只新增一个位置的计算,但要为一个字等待一整个前向过程,单步省不了,只能靠批处理和缓存摊薄。
发生什么:每步只算一个位置的下一步
每一步计算只做一件事:根据当前已有的全部内容,算出下一个字该是谁。模型输出一个概率分布,按采样策略挑出一个字,接在序列末尾,成为下一步输入的一部分。
挑字的方式直接影响结果:偏向保守会得到更稳的回答,偏向随机会得到更多样的发挥。温度、top-p 这些参数控制的正是这一步,它们不改变模型能力,只改变挑字的手感。
参数之间还会互相牵动。温度调高时,低概率的字被选中的机会变大,回答更有变化但也更容易跑偏;调低时输出趋同,多次提问结果几乎一致。想要稳定的批量产出,把采样调保守再固定随机种子,是常见的组合做法。顺带一提,同为采样参数的 top-p 与温度功能相近,一般只调其中一个,两个都动反而难定位手感。
三个旋钮各自管什么、调高调低差在哪,一并列开。
| 旋钮与方向 | 输出表现 | 何时这么调 |
|---|---|---|
| 温度调高 | 低概率的字被选中的机会变大,回答更有变化,也更容易跑偏 | 想要更多样的发挥 |
| 温度调低 | 输出趋同,多次提问结果几乎一致 | 要稳定的批量产出 |
| top-p 与温度只调其一 | 两者功能相近,两个都动反而难定位手感 | 调参时二选一 |
| 固定随机种子 | 配合保守采样,是稳定批量产出的常见组合做法 | 同一问题要反复复现 |
出去什么:一个字加一个字地往外冒
每一步的产出就是一个新字,它立刻追加到序列末尾,并成为下一步的输入。屏幕上文字持续出现的打字机效果,就是这个循环被实时透传的结果。
流式输出正是在这个循环上加了个旁路:每生成一个字就往外发一个字,不必等整段写完。发送节奏由服务端的分片策略决定,与解码本身互不干扰。观察打字机效果的节奏,还能间接读出服务状态:节奏稳定说明算力充足,忽快忽慢多半是批次调度在重新编排。
循环什么时候停:结束符或长度上限
循环的出口有两个。一个是模型主动写出结束标志,表示它认为话说完了;另一个是碰到长度参数划定的上限,被强制收尾。后者常常表现为半句话停下,答案不完整。
这两个出口也解释了指定输出长度参数的实际作用:它不改变模型想写多长,只决定最多让它写多长。在 DeepSeek、豆包等产品的推理服务里,这两个出口的触发频率直接影响用户的完整体验。看到半句收尾先别急着怪模型,先查长度上限是不是给小了,再确认是不是触发了平台的安全收尾,两种出口的处理方式不同。排查时把上限调大一档重试一次,多数情况立刻见分晓。想了解相关机制,可以读预填充的计算、KV 缓存的复用和连续批处理调度。
速查表:
- 进来什么?上一步生成的字与 KV 缓存
- 发生什么?算一步概率分布,挑下一个字
- 出去什么?一个新字,追加进序列继续循环
- 怎么停?结束符或长度上限,二选一或同时兜底
关于解码的三个常问问题
- 为什么生成比读入慢?:解码一步只算一个位置,算力用不满,而预填充可以并行处理整段输入,两阶段的计算效率完全不同。
- 同一个问题每次回答不同?:采样环节的随机性使然,温度等参数越低,波动越小,想要稳定输出就把采样调保守。
- 解码阶段能用缓存加速吗?:能,KV 缓存复用正是为这一步设计的,历史信息不必重算,省下的大量计算都发生在这里。


