不懂算法,如何理解KV cache
很多人觉得 AI 就装在那个大模型里——几千几万亿个训练好的参数。但去看一座 AI 数据中心里真正被填满、而且会被无止境填下去的东西,会发现它不是这些参数。把存储一点点吃光的是另一样东西,它更像 AI 在不同时刻的思绪,这就是 KV cache。
大脑里有两样性质不同的东西。一个是突触的连接强度,也就是神经元之间那张布线图,它是你多年学习慢慢沉淀下来的,相对稳定、长期保留,决定了“你会什么”。例如,刷题就是强化突触连接的方式,会带来真实的物理变化。另一个是神经元此刻的放电模式:哪些细胞正在一起激活、以什么节奏激活,这是个瞬时的活动状态,决定了“你正在想什么”。学习是在改写布线,思考是在已有线路上放电,两件事是分开的——你不会每动一个念头就重新接一次线,只是把现成的回路按当下的语境点亮。
把这套结构搬到大语言模型上。模型权重就是那张固化下来的布线图,对应突触强度,是它学过、记住的一切。而 KV cache 对应的是神经元此刻的放电模式:模型在处理眼前这段内容时,每一层、每个已读 token 算出来的中间状态被临时存下来,省得逐字生成时反复重算前文。
举几个例子会更直观。你在心里算一道长除法,那些中间的商和余数不是关于“算术”的新知识,而是这一次计算的临时状态,算完就扔,只留一个答案。你读小说,语言能力和常识是固定的权重,而脑子里“现在读到哪、谁是谁、刚发生了什么”那个实时剧情模型就是 KV cache——它完全由文本经过你那套阅读能力推出来,不含文本之外的新东西;合上书放一年,这份细节就淡了,你顶多记得一个大概。而那个被记住的大概,才更接近写进了长期记忆。
所以KV cache 不是模型新学到的认知,它是工作记忆,是一次思考的活动状态,依附于当下这件事,事情一结束通常就丢掉了。
但人脑的工作记忆和 KV cache 之间有一个很关键的不同。人的工作记忆很小,而且有损:同时放在脑子里的东西就那么几样,多了就忘、就乱;你会不断遗忘、压缩、把一堆细节打包成一个笼统印象,腾地方给新的。正是这种主动遗忘,让大脑用很低的能耗装下了一辈子。
KV cache 正相反:它是完美记忆,没有容量上限。前文读过的每一个字都以全精度原样留着,随时能被精确调用,一个 token 都不肯忘。机器默认不会遗忘,这既是它的本事,也是它吃存储的根源。有意思的是,工程上几乎所有的努力,说到底都是在教机器学会像大脑那样有选择地忘掉一些。
理解了这一点,存储需求来自一个不对称——权重是有限的,思考的状态是无限的。
先看有限的一侧。权重是个封闭的工件,训练好就是一个确定的字节数,训练是一次性的,参数冻结后能力也就定了。而且光把权重堆大,收益是递减的。
再看无限的一侧,这是重点。思考的状态没有上限,而且它沿着好几个方向同时变大,关键是这些方向相乘、不是相加,而且每一个都是大家主动想要更多的。
一是长度:我们越来越希望 AI 一口气读完整个代码库、整本书、整套卷宗,单次任务要端着的状态就随长度变大;逐字生成时,KV cache 本身也在一个 token 一个 token 地往上长,因为每生成一个新词,都要回看前面所有词。二是深度:模型正从”张口就答”转向”先想后答”,给结论前先生成一长串内部推理,这串推理本身就是被生成、被缓存的 token。一个为了答得更好而想得更久的模型,机理上就是端着更大 KV cache 的模型,推理越深、状态越大,省不掉。三是广度:每个同时在线的用户、每段并发会话都有自己一份 KV cache。权重是所有人共享的,一份拷贝服务所有请求;KV cache 没法共享,一段会话一份。所以用户越多,权重那侧成本基本不动,KV cache 那侧却随“此刻有多少场对话在进行”成比例上涨。四是时长:AI 正从“回答一个问题”走向“连续干几个小时活”,一个 agent 执行多步任务,状态会贯穿整个过程累加,跑得越久存着的越多。五是持久化,这一条最关键:以前工作记忆在会话结束时就丢了,像小说细节一年后淡去,现在的前沿是干脆不丢——让 AI 对你、对过往的工作、对积累下来的语境保有连续记忆。这是性质上的变化,它把一笔本来转瞬即逝的成本变成了长期、还不断累积的成本。六是数量:一群 agent 各自带着语境协同时,广度和时长又被乘一遍。
把这些放在一起:在一段足够长的对话里,KV cache 能涨到跟整个模型的权重一个数量级;而一旦同时服务几十个用户,它就反超权重好几倍——因为权重大家分摊,KV cache 却人手一份。所以真正决定一台机器能同时照看多少人、回话多快的,往往不是算力,而是装不装得下、流不流得动这些 KV cache。
这几个因子,行业和用户都在拼命往上推,因为每推一点 AI 就更有用一点,没人嫌自己的 AI 记得太多、想得太深、能照看的事太多。对“语境”的需求基本没有尽头。当 AI 从一件你随手查询的工具,变成一个带着记忆、长期待在你身边的东西,重心就从那个固定的模型,挪到了那份不断累积的语境上,而经验不像能力,没有封顶。
落到现实里,这股压力的直接表现是把存储层级一层层拉长。最热的、正在放电的那部分 KV cache 住在离计算最近、最快也最贵的内存里;装不下、或者要持久保留时就往下溢——溢到慢一些的系统内存,再往下溢到更慢更便宜的闪存 ,越往下越是拿速度换容量。
这套增长逻辑确实有个出口:教机器遗忘。一类做法是压缩,让 KV cache 在不太损效果的前提下变小,现在已经能砍掉八九成 ;更彻底的一类是改用“状态恒定大小”的架构,让记忆随时间被有损地压进一个固定容器,不再随长度增长。但明显都无法解决问题,或者这个问题无需解决,只是会永远缺存储。