KV Cache 的核心原理在 Transformer 模型中注意力机制Attention需要计算 Query (Q)、Key (K) 和 Value (V)。在自回归生成生成下一个词的过程中模型是逐个 Token 生成的。假设我们要生成 N个词生成第 1 个词时我们需要前文所有 Token 的 K 和 V。生成第 2 个词时依然需要这 N 个 Token 的 K 和 V。如果不缓存每次都要重新计算之前所有 Token 的 K 和 V这会带来巨大的冗余计算且时间复杂度会随长度增加呈平方增长。KV Cache 的作用在计算第 t 个词时我们直接复用前 t-1个词已经计算好的 K 和 V 矩阵只计算当前新词的 Q、K、V。这能将计算复杂度从 O(N^2) 降低到 O(N)极大提升了推理速度。为什么需要 KV Cache想象你正在把一本 100 页的书抄写下来每分钟写一行没有 Cache 的情况每抄一个新字你都要把前面 100 页重新读一遍查到那个位置然后再写下一个字。这会让你越抄越慢。有 KV Cache 的情况你准备了一个“临时笔记本”每抄完一行就把这行的核心信息记在笔记本上。写下一行时你直接看笔记本就行不用再从第一页翻起。结论KV Cache 就是那个“笔记本”它存下了之前生成的 Token 的信息避免了重复阅读。模型层面的缓解方案针对缓存瓶颈随着上下文窗口Context Window的拉长KV Cache 会占用大量显存显存墙问题甚至导致显存溢出。模型层面主要有以下几种缓解方案1. GQA (Grouped Query Attention) —— “共享记号笔”原理作家有 32 支笔Query每一支笔在记录时都需要一张对应的“说明书”KV。原本是 1 支笔配 1 张说明书桌子上堆了 32 张纸。做法GQA强制规定每 8 支笔合用 1 张说明书。通俗理解减少了重复的纸张。虽然说明书少了但作家依然能清楚知道该写什么。效果桌面一下子空旷了很多能放下更多文件但作家的写作能力模型效果几乎不受影响。2. PagedAttention —— “文件夹分类法”原理原本桌上的草稿纸KV Cache必须一张连一张地摆放中间不能有空隙。一旦中间空了那块地方就废了这就是“碎片化”。做法PagedAttention不再要求连在一起而是把草稿纸剪成一个个小方块放入一个个“文件夹”Block。只要有空的文件夹就往里塞。通俗理解就像电脑的“虚拟内存”。桌子不够大把草稿纸收进文件夹存好需要的时候再拿出来桌面上永远不会因为摆放不整齐而浪费空间。效果极大地提高了桌面的利用率你能同时接待更多客人支持更多用户并发访问。3. KV Cache 量化 —— “压缩笔记”原理作家记笔记KV Cache时写得非常详细FP16高精度字迹又大又占地方。做法量化给作家一支更细的笔让他写得紧凑一点INT8/INT4低精度。通俗理解就像照片从 4K 压缩成高清虽然细节稍微模糊了一点点但空间节省了 2 倍甚至 4 倍。效果同样大小的本子显存原来只能记 1000 个字现在能记 4000 个字了上下文窗口变大记性更好了。4. Window Attention —— “只记重点”原理有时候说明书太长记下每一个字的 KV 实在太占地方。做法Window只保留最关键的“第一页”和“最后几页”中间的部分读完就扔掉。通俗理解这就像你背单词你只记得“单词怎么写”和“最近学的 5 个词”中间早期的那些词忘就忘了反正不影响你现在表达。效果无论说明书有多少页桌上永远只占那固定的几张纸再也不会把桌子挤爆。用人话说就是:假设你的模型是一个正在进行高强度创作的“作家”而它的显存就是它的“办公桌面”,那么模型层面的缓解方案就是用同样大小的显存下,能存更多的KV Cache.前缀缓存 (Prefix Caching) 与 KV Cache 的关系很多人容易混淆这两者其实它们是“存储”与“复用策略”的关系。1. 什么是前缀缓存 (Prefix Caching)前缀缓存是指在多个不同的请求中复用相同的提示词Prompt所生成的 KV Cache。场景假设你要在 1000 个不同的问题中查询同一本 PDF 文档。做法这一整本 PDF 的 Prompt 在第一次计算后其 KV Cache 被永久保存在显存中或缓存系统中。后续的 999 次请求直接从缓存加载这份 KV Cache无需再次对 PDF 内容进行计算。2. 它们的关系KV Cache 是“零件”它存储的是计算过的 Token 特征是底层的存储单位。前缀缓存是“管理策略”它是一种更高级的缓存调度策略。它通过识别请求中的公共前缀跨请求地共享这些“零件”。简单举例现在图书馆里有 100 个学生都要读同一本《人工智能导论》这就是 Prompt/背景素材没有前缀缓存每个学生来的时候都要自己把书读一遍整理出一份属于自己的笔记KV Cache。100 个学生就要重复读 100 次图书馆显存里塞满了 100 份一模一样的笔记。有前缀缓存图书馆管理员在书架旁边贴了一份“公共精读笔记”。第 1 个学生读完后把笔记留在那第 2 到 100 个学生直接拿这份笔记用。结论前缀缓存就是“复用公共笔记”。只要大家的 Prompt 开头是一样的模型就不用重算这部分的 KV Cache直接复用。KVCache 和前缀缓存的区别特性KV CachePrefix Caching层级底层数据结构推理调度策略目标避免单个序列生成时的重复计算避免不同序列间的重复计算复用范围单个请求内Token 间多个请求之间Prompt 间核心价值降低计算量 (O(N^2) \rightarrow O(N))极大提升系统吞吐量和长文本处理响应速度一句话总结KV Cache 是为了让模型“记得住刚才说了什么”而前缀缓存是为了让模型“对于大家都看过的书可以直接跳过阅读过程直接进入问答环节”。在实际的生产环境中通常是两者结合使用利用PagedAttention管理 KV Cache 内存利用Prefix Caching缓存公共指令或大段背景素材从而达到极致的性能表现。