一句话定义:解码指模型算完一次前向传播、得到“下一个 token 的概率分布”之后,按照某种规则从中挑出一个 token,把它接回输入末尾,再算下一次,如此循环,直到生成结束符或达到长度上限。
为什么需要“解码”这一步
语言模型每次计算只做一件事:看一眼现有的全部文字,输出一张词表上的概率表,例如“下一个词是‘因为’的概率为 0.3,‘所以’的概率为 0.2……”。这张表就是 logits 经过 softmax 后的结果。模型本身不会把整段答案预先写好再打印出来,它一次只负责一个 token。所以“怎么从这张表里挑”就成了独立的一环,这就是解码,也叫采样策略(sampling strategy)。
打个比方:玩文字接龙时,你每说一个词,就把整句话重新念给下一位听,他只想下一个词。没有人先在脑子里写好整段。也正因为如此,前面挑得偏了一点,后面就一路跟着偏;“一步错,步步歪”在这里是字面意思。
和几个容易混淆的概念的区别
- 训练 vs 解码:训练是在调参数,解码是用已经调好的参数生成。训练一次要跑很久,解码则每个 token 跑一次。
- 编码 vs 解码:编码(encoding)是把输入变成内部表示,对应读题;解码(decoding)是一步步往外吐字,对应答题。现在主流模型只有一套网络,“prefill 读 prompt + decode 逐 token 输出”是同一套网络的一种分工,不是两个模块。
- 概率表 vs 解码策略:前者是模型给的原料,后者是你选的挑法。换个挑法,同一个模型能写出完全不同的文字。
常见挑法对比
| 策略 | 怎么挑 | 特点 |
|---|---|---|
| 贪心(greedy) | 每次取概率最高的那个 | 稳定,但容易重复、句子死板 |
| 束搜索(beam search) | 同时保留若干条候选路径,最后选整体得分最高的 | 翻译等任务常用,开放对话里常显得平庸 |
| 温度采样(temperature) | 按概率随机抽,温度调低会让分布更集中,调高会更平坦 | 低温度保守可用,高温度发散有创意 |
| Top-k / AI 词典:Top-p">Top-p(nucleus) | 只在概率最高的一小撮候选里抽,砍掉长尾 | 兼顾多样性与不胡说,最常用的组合 |
对实际工作的意义
对工程师来说,解码直接决定产品手感:要稳定输出就调低温度,要创意就调高;要固定格式的 JSON,就得用约束解码(constrained decoding)把不符合语法的 token 概率压到零。线上服务里,prefill 阶段吃算力、decode 阶段吃显存带宽,所以“首 token 延迟”和“每 token 延迟”是两个要分开优化的指标,批量并发、KV cache 这些手段主要是在省 decode 阶段的重复计算。
对普通使用者来说,理解解码能解释两件事:为什么同一个问题问两遍答案不一样,以及为什么模型会“开头很对、中间跑偏”。让它分步思考、先给例子,本质上是在帮它每一步的概率分布收得更紧,少走岔路。具体参数和接口行为各家不同,以官方页面为准。
