深度解析:为什么有 KV Cache 而没有 Q Cache?揭秘缓存机制
KV Cache 在 LLM 推理系统中已成为必不可少的优化技术。其核心思想是通过缓存中间结果来避免重复计算,但在实际应用中,关于缓存的具体内容(为何只有 K 和 V)往往令人困惑。
要彻底理解 KV Cache,需要厘清以下三个问题:
- 缓存的是什么?
- 为什么是 KV Cache,而不是 QKV Cache?
- KV Cache 对模型的输出有任何影响吗?
如果我们从矩阵乘法的角度观察 Attention 运算的过程,这些问题的答案将变得清晰。
01 自回归模型的特点
LLM 的推理过程被称为自回归(Autoregressive),即模型上一步的输出会被当作下一步的输入。例如,用户输入的 prompt 是 "recite the first law",模型产生的第一个 token 是 "A",然后输出的 "A" 会添加到用户的 prompt 后面,再次输入到模型中,模型输出 "robot" 这个 token。如此反复,直到模型输出结束词。
我们把运行一次模型称为一个 step,每一个 step 生成一个新的 token。这种机制决定了随着生成的进行,输入序列的长度不断增加。
02 KV Cache 的探索过程
下面,我们从最朴素的推理方法出发,逐步推导出 KV Cache 的优化方法。假设我们的模型有两个 attention 层。
不考虑任何 Cache 的推理
Step 0
我们先不考虑任何 Cache,观察推理情况。以'你好'作为 prompt 输入到模型中。

模型的 embedding 层会将 token 转化为对应的 embedding,得到一个 2x4 的矩阵 embedding1,其中第一行是'你'的 embedding 表示,第二行是'好'的 embedding 表示。
之后,我们进入到第一个 attention 层。embedding1 会与 attention 层中的三个权重矩阵相乘,分别得到 Q、K 和 V 矩阵。

在 attention layer 中,根据计算公式对 Q、K 和 V 矩阵进行计算。首先,Q 和 K 矩阵相乘,得到一个 attention 矩阵,其中包括了每两个词之间的注意力值。需要注意的是,'你'这个 token 对'好'这个 token 的注意力值被 mask 了,即每一个 token 只计算与之前的 token 的注意力值,而不计算之后的 token 的注意力值。
然后,attention 矩阵与 V 矩阵相乘,再把相乘结果输入到 FFN 层中,就得到了新的 embedding2。第二个 attention 层也是如此类推,并输出 embedding3。
最后,embedding3 的最后一行,也就是'好'这个 token 对应的 embedding 被输入到一个分类器中,预测下一个 token。得到的预测结果是'啊'。到此,我们就生成了第一个 token,即完成了 step0。
Step 1
在预测了 token'啊'之后,我们将'你好啊'再次输入到模型中。






