一、先明确两个核心概念:prefill 与 decoding 的本质区别

大语言模型的文本生成分为两个阶段,其设计目标是平衡 “上下文完整性” 和 “计算效率”

  • Prefill 阶段:处理完整的用户 prompt(比如 “今天天气很好”),所有 prompt token 的计算是并行的(同时计算每个 token 的 Q/K/V、注意力权重、上下文表示)。这一阶段的核心是 “一次性消化全部 prompt 信息”,为后续生成打下基础。
  • Decoding 阶段:从第一个输出 token 开始,逐 token 生成(第二个、第三个…… 第 N 个)。这一阶段的核心是 “复用历史计算结果”,避免重复计算已处理过的 token,从而大幅提升效率 —— 这就是 KV 缓存机制的作用

二. Prefill 阶段的核心流程(可参考https://zhuanlan.zhihu.com/p/1899866293408096306

Prefill 阶段的目标是处理用户输入的完整 prompt,并生成首个输出 token。这一过程分为以下步骤:

  • 并行计算 QKV 矩阵:模型对 prompt 中的每个 token 独立计算查询(Q)、键(K)、值(V)向量(词向量化后与WQ,WK,WV相乘)。由于不同 token 的计算是并行的,这一阶段效率较高。
  • 注意力机制生成上下文表示:通过缩放点积注意力计算每个 token 与其他所有 token 的相关性,然后经过softmax得到注意力权重。这些权重与值向量(V)加权求和,生成每个 token 的上下文表示(Output 矩阵)(这里是并行计算同时得到了所有token的上下文表示,对于多层大模型而言,最后一层实际上在进入FFN的时候只需要最后一个token的上下文表示,但是前面的层需要所有token的上下文表示进入FFN,那是因为最后的矩阵输出要作为下一层的输入)
  • 前馈神经网络处理:注意力机制的输出(前面几层是全部的Ouput矩阵,最后一层是Output 矩阵的最后一行,对应于最后一个token的上下文表示向量)被输入到 FFN 中。FFN 通过两层线性变换和非线性激活函数(如 ReLU)对上下文表示进行进一步特征提取。
  • 生成首个 token:最后一层的FFN 的输出(对应于最后一个token)经过解码层(如线性层和 Softmax)转换为 token 概率分布,最终选择概率最高的 token 作为首个输出。

三.  Decoding 阶段的核心流程

生成第二个 token 时,模型实际利用的是 “完整 prompt + 第一个输出 token” 的全量历史信息(通过第一个输出token的Q和全量的KV相乘体现),但通过 KV 缓存优化了计算步骤,让它看起来像是 “只处理上一个 token”。具体流程如下:

1. 第一步:历史信息的 “缓存复用”

在 prefill 阶段,模型已经并行计算了所有 prompt token 的 K(键向量)和 V(值向量) ,并将这些 K/V 存入「KV 缓存」中(相当于保存了 prompt 的核心语义信息),而且这里是分层存放各层中所有prompt的KV
当生成第一个输出 token(比如 “适合”)后,模型会立即计算这个第一个输出 token 的 K 和 V,并也存入 KV 缓存。此时,KV 缓存中已经包含了 “prompt 所有 token + 第一个输出 token” 的全部 K/V 信息 —— 这是后续生成的 “全量历史信息基础”。

2. 第二步:仅增量计算 “新 token 的 Q(查询向量)”

生成第二个 token 时,模型不需要像 prefill 阶段那样,重新计算所有历史 token(prompt + 第一个输出 token)的 Q/K/V—— 因为 K/V 已经存在缓存里了。
模型只需要针对 “当前要处理的新 token 的输入”(这里的 “输入” 是 “第一个输出 token”,但它的作用是 “触发对历史上下文的查询”),单独计算它的 Q 向量(查询向量)。

这里的关键是:“计算新 token 的 Q”≠“只利用新 token 的信息”。Q 的作用是 “查询历史上下文”—— 它需要和缓存中所有历史 token 的 K 向量计算相关性,才能拿到全量上下文信息。

3. 第三步:用新 Q 匹配所有历史 KV,拿到蕴含全量上下文信息的当前token上下文表示向量

生成第二个 token 的注意力计算,遵循「因果注意力」规则(只能看历史 token,不能看未来 token),具体是:

  • 用 “第一个输出 token 的 Q”,与 KV 缓存中所有历史 token 的 K(包括 prompt 的每个 token、第一个输出 token 的 K)计算注意力权重(相关性分数);
  • 用这些权重对 “所有历史 token 的 V” 进行加权求和,最终得到的是包含 “完整 prompt + 第一个输出 token” 全量上下文信息

举个例子:
如果 prompt 是 “今天天气很好”,第一个输出 token 是 “适合”,那么生成第二个 token 时,注意力权重会计算 “适合” 与 “今”“天”“天”“气”“很”“好”“适”“合”(所有历史 token)的相关性,比如 “适合” 与 “天气很好” 的相关性权重更高,最终的上下文表示会重点融合 “天气好” 和 “适合” 的语义,为生成 “出游”“散步” 等第二个 token 提供依据。

4. 第四步:FFN 与 token 生成(和第一个 token 逻辑一致)

得到 “蕴含全量历史上下文信息的当前token的上下文表示向量” 后,再输入前馈神经网络(FFN)进行特征优化,最后通过 Softmax 输出 token 概率分布,选择概率最高的 token 作为第二个输出 —— 这一步和 prefill 阶段生成第一个 token 的逻辑完全一致。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐