@_avichawla: 为什么 KV 缓存只存储 K 和 V 向量而不存储 Q?(一个流行的 LLM 技术面试问题)大语言模型是自回归的……
摘要
本文解释了在自回归大语言模型中,为什么 KV 缓存只存储键和值向量而不存储查询向量,并详细介绍了优化令牌生成的推理过程。
查看缓存全文
缓存时间: 2026/08/31 02:24
为什么KV缓存只存储K和V向量而不存储Q?(大模型热门技术面试题)
LLM是自回归模型,每个token的生成都依赖于它前面的所有token。这种自回归特性在模型内部有直接影响:对token序列的前向计算会产生隐藏状态,但只有最后一个隐藏状态会被投影为logits并用于生成下一个token。
要理解为什么KV缓存只存储K和V向量,我们需要回溯最后一个隐藏状态的完整生成过程。我们用一个包含10个token的提示词来说明:
1) 预填充阶段 由于整个提示词已知,10个token会通过因果掩码并行完成一次前向计算。在每一层中,10个位置分别生成query、key和value向量,每个位置的注意力计算都会覆盖之前所有位置。这个过程计算密集,也是首token生成耗时明显更长的原因(TTFT主要消耗在预填充阶段)。
2) 生成第一个输出token 生成第11个token时,只需要第10个token的隐藏状态。该状态从隐藏维度投影到词表维度生成logits,再经softmax和采样得到第11个token。
3) 回溯隐藏状态 最终隐藏状态来自前馈网络最后一行的输出。由于前馈网络按位置独立计算,这一行实际来自注意力层的对应输出行。因此我们需要分析注意力最后一行的计算过程。
4) 注意力矩阵分析 对于10个token的提示词,QKᵀ会生成10×10的矩阵。第10行是Q10与所有key(K1到K10)的点积结果。注意这里只出现Q10,而Q1到Q9仅存在于各自的1-9行,这些行的隐藏状态已被丢弃(因为不需要)。注意力最后一行经softmax处理后与所有value向量(V1到V10)相加权,得到最终输出。因此最终隐藏状态仅依赖于三要素:Q10、所有key和所有value。
5) 生成第12个token 添加token11后,我们需要第11个位置的隐藏状态来生成token12。数学上,注意力计算变为Q11与K1到K11的点积,再与V1到V11加权求和。由于因果掩码的特性,token的key和value仅依赖自身及之前token,因此添加token11不会改变之前位置的计算结果。
6) 缓存机制 上述分析表明:每个解码步骤只需保留所有位置的key和value,新位置的Q/K/V可实时计算。每个解码步骤产生的query向量仅使用一次,因此无需缓存。
需要补充说明的是,KV缓存只是LLM系统中的四种独立缓存机制之一。另外三种包括:服务器端的前缀缓存、服务商的提示缓存,以及跳过模型直接返回结果的语义缓存。关于这四种缓存技术的完整解析,我已在《AI工程师必知的LLM服务缓存机制》中详细说明,并附有完整代码实现,欢迎阅读。
相似文章
@TheTuringPost: 为什么 KV cache 是 LLM 速度快的主要原因之一?KV cache 将注意力机制与生成阶段连接起来……
KV cache 在自回归生成过程中存储先前计算的键向量和值向量,使模型能够避免在每一步重新计算整个序列,从而显著加速推理,但代价是内存使用增加。
@pallavishekhar_: 大语言模型中的 KV Cache,阅读链接:https://outcomeschool.com/blog/kv-cache-in-llms…
本文解释了大语言模型中 KV Cache 的概念,详细阐述了其通过存储和复用键值对以避免推理过程中的冗余计算,从而优化文本生成的原理。
@akshay_pachaar: 你在Anthropic参加机器学习工程师面试。面试官问:"我们的模型在42秒内生成100个token。H…
解释了KV缓存如何通过消除注意力键和值的冗余重计算来加速LLM推理,在速度与内存之间进行权衡,并介绍了生产级缓存管理挑战。
KV缓存正成为推理的内存层级结构
文章讨论了KV缓存如何演变为LLM推理的内存层级结构,优化解码过程中的内存管理。
@Hi_Mrinal: 这是关于KV缓存的最佳阅读,直观上非常好读 https://medium.com/@saad.ahmed1926q/kv-…
对语言模型中KV缓存的直观解释,涵盖token、嵌入、注意力机制,以及为什么KV缓存能提高推理效率。适合没有机器学习背景的读者。