KV Cache 是什么?

KV Cache:让AI对话不卡顿的秘密武器
你有没有这种感觉:用ChatGPT写长一点的prompt,刚开始的回复还挺流畅,越往后模型响应越慢,到最后等半天才能出结果。
这不是网络问题,也不是服务器压力。这背后有个关键技术叫 KV Cache。今天我们就来聊聊它是怎么工作的,以及为什么它能让模型跑得更快。
你和AI对话时,模型到底在想什么?
模型生成回复时,它是怎么"看"你说的话的?
答案藏在 Transformer 的注意力机制里。这个机制用三个向量来处理每个词:Q、K、V。
Q 是 Query,"我需要找什么信息"。K 是 Key,"我有什么信息"。V 是 Value,"信息的具体内容"。
我之前看到一个很形象的比喻:把模型想象成图书馆管理员。当你想找答案时,管理员先理解你的问题(Q),再去找书架上匹配的书(K),最后把书里的内容给你(V)。
词和词之间怎么做匹配?靠 Q 和 K 的点积。两个向量越"对齐",注意力分数越高。

理解了 Q、K、V,你就迈出了理解 KV Cache 的第一步。
为什么长对话会让模型变慢?
好,现在你知道了模型是怎么处理每个词的。
问题来了:模型回复你的时候,需要参考你说的每一句话。
第一轮对话,模型只需要处理你的问题。第二轮对话,模型要处理你的问题加上它自己的回复。第三轮、第四轮、第五十轮……
越来越长,对吧?
但这里有个更要命的问题:每生成一个新词,模型都要重新算一遍所有词的注意力。
具体来说:生成第1个词时,计算1次注意力。生成第2个词时,重新算2次。生成第3个词时,再重新算3次。
以此类推,生成第 N 个词需要算 1+2+3+...+N 次。
算下来,这是 O(N²) 的时间复杂度。
短 prompt 秒回,长 prompt 等半天,本质上就是这个问题:模型在重复计算,而且越算越多。

有没有办法解决?
KV Cache:空间换时间的智慧
答案是:有。
我们仔细看 Q、K、V 这三个向量,会发现一个关键事实:
历史词的 K 和 V,计算一次后就不再变化了。
你第一轮对话输入的每个词,它们的 K 和 V 在整个对话过程中都是固定的。后面生成的词只需要参考这些历史信息,不需要反复重新计算。
发现了没?这就是优化的突破口。
我们可以把历史词的 K 和 V 缓存起来。下次需要计算注意力时,直接拿来用,不用再算一遍。
这就是 KV Cache。
用一块显存空间,换取大量计算时间。
就像图书馆给每本书做索引卡片。第一次整理费时费力,但之后每次找书只需要翻索引,不用一页一页翻了。
首次计算成本高,但之后的每次计算成本都降到了 O(1)。
总体时间复杂度从 O(N²) 降到了 O(N)。
这个优化带来了几十倍的推理速度提升。

两个阶段:预填充与增量生成
KV Cache 的工作分为两个阶段,理解了它们你就完全掌握了这项技术。
第一阶段:预填充(Prefilling)
当你发送一条消息时,模型一次性处理你所有的输入词,同时计算它们的 K 和 V 向量,然后存进缓存。
这个过程叫预填充,因为它提前把"准备工作"做完了。
第二阶段:增量生成(Token Generation)
生成回复时,模型只需要计算新词的 Q 向量。然后拿着这个 Q,去缓存里找对应的 K 和 V,做注意力计算。
新词生成后,它的 K 和 V 再追加到缓存里,供后面的词使用。
整个过程就是这样循环往复的。
可以把它理解成考试:老师发卷子是一次性完成的(预填充),学生答题是一题一题进行的(增量生成)。
发卷子虽然要花点时间,但之后的答题就顺畅多了。

显存换速度:值得吗?
说了这么多好处,但 KV Cache 不是免费的午餐。
缓存 K 和 V 向量需要占用显存。序列越长,缓存越大,显存压力也越大。
拿 Qwen2 7B 模型举例。在 4K 序列长度下,KV Cache 要占用约 1.6GB 显存。
听起来不多?但这只是 7B 参数的模型。
更大的模型、更长的上下文,显存占用会成倍增长。
所以这里有个经典的工程权衡:用显存换速度。
就像给电脑加内存条。内存大了,程序跑得更快,但钱包也瘦得更快。
值不值得?看场景。
短对话场景,KV Cache 收益有限,可能还增加开销。长对话、多轮推理场景,KV Cache 就是必需品了。
vLLM 等推理引擎花大量精力优化 KV Cache 的原因就在这——显存就那么多,怎么用是个技术活。

下一步的问题
KV Cache 解决了重复计算的问题。但它也带来了新问题:
序列越来越长,缓存越来越大,显存不够用怎么办?
这就是下一期要聊的:上下文长度。
为什么长文本推理更慢、更贵?模型是怎么处理越来越长的上下文的?
这些问题,比 KV Cache 更复杂,也更有意思。
