什么是 KV Cache?让大语言模型推理突然快起来的"偷懒术"

本文基于 Amit Shekhar(@amitiitbhu)的《What is KV Cache in LLMs?》整理,英文原文和中文译文链接见文末。

很多人第一次用 ChatGPT 时,都会有一个疑问:它为什么能像打字一样,一个词接一个词地往外蹦?

答案其实很简单。大语言模型(LLM)并不是一口气把整段话想完,而是像接龙一样,一次只预测一个 token。

假设你输入:

I love

模型会猜,下一个词可能是 teaching

于是句子变成:

I love teaching

接着,它再看完整个句子,预测下一个词:

AI。

然后继续往下,一个 token、一个 token 地生成,直到结束。

但问题也随之出现。

每生成一个新词,模型都必须回头看看前面所有内容。为了判断哪些信息重要,它会在内部启动一种叫做"注意力机制(Attention)"的计算。

你可以把它想象成一个刚走进教室的新同学。

他提出一个问题:"谁能帮我理解这个主题?"——这就是 Query(Q)

教室里每个人胸前都挂着一块名牌,写着自己擅长什么——这就是 Key(K)

真正有价值的,则是他们手里的笔记本——也就是 Value(V)

新同学先拿着自己的 Query 去匹配所有人的 Key,找到最相关的人,再从他们手中的 Value 里提取真正需要的信息。

问题在于:模型实在太勤奋了。

第一次生成时,它计算 "I" 和 "love" 的 Key、Value 和 Query;第二次生成时,又把 "I" 和 "love" 重新算一遍;第三次生成,又再算一次……

如果生成 100 个 token,前面的内容就会被反复计算上千次。

这就像开会时,每来一个新人,所有已经发过言的人都必须把刚才的话从头再说一遍。没人会这样开会,但模型过去就是这么工作的。

于是,KV Cache 诞生了。

它的想法朴素得近乎无聊:

算过一次的东西,就别再算第二次。

模型会把每个 token 对应的 Key 和 Value 存进一块"缓存"里。下一次生成时,旧 token 的 Key 和 Value 直接拿来用,只为那个新出现的 token 重新计算。

就像你在会议上做笔记。后来有人发言时,你不会要求所有人重新复述,而是翻开笔记,只专心听新的内容。

有趣的是,模型只缓存 Key 和 Value,而不缓存 Query。

因为 Query 像一个临时问题,只服务于当前这一刻;问题回答完,它就失去价值。而过去所有 token 的 Key 和 Value,却会在未来一次又一次被用到。

这种看似不起眼的优化,却带来了惊人的提升。

如果生成 100 个 token,不使用 KV Cache,累计需要完成约 5,049 次相关计算;而使用 KV Cache 后,只需要约 101 次

换句话说:

模型没有变得更聪明,它只是终于学会了别把同一份作业做五十遍。

当然,天下没有免费的午餐。

KV Cache 用速度换来了内存占用。生成的内容越长,需要保存的 Key 和 Value 就越多。对于动辄数万 token 的长上下文,这块缓存会迅速膨胀,成为新的瓶颈。

因此,KV Cache 本质上是一场工程上的取舍:

用更多内存,换取更少计算;用"记住过去",换来"更快思考"。

也正因为如此,它成为今天几乎所有大语言模型推理加速的基础设施。

下次当你看着 ChatGPT 流畅地吐出一长串文字时,不妨想起那个坐在教室里的新同学。

真正让他变快的,不是天赋异禀,而是终于学会了翻笔记。

原文:https://x.com/amitiitbhu/status/2037413998279491927 | 译文:https://kn.dingzhihao.org/view/raw/agents-series/kv-cache-in-llms