← 第5课 · 模型权重 首页 / 算法与AI / AI 基础入门 / 第6课 · KV Cache
AI 基础入门 · 第6课

KV Cache:大模型说话为什么能一个字一个字蹦出来

你跟豆包聊天,它是一个字一个字往外蹦的,不是一次性写完再吐出来。这背后靠的就是 KV Cache——一个把"前面算过的中间结果"存起来复用的缓存机制。没有它,大模型每写一个字都要把你整段话从头算一遍,速度慢 100 倍都不止。这一课把注意力机制、K/V 向量、缓存的取舍、PagedAttention 一次讲清。

① 小白第一课怎么学(4 步走,约 60 分钟)

这一课是"推理优化"的入门核心,后面讲 vLLM、长上下文都会反复回到它。

1先懂注意力直觉(15 分钟)
读②③:模型读每个字时会"回头看"前面所有字。
2搞懂 K/V 是啥(15 分钟)
读④:每个字有一对 K/V 向量,一个被查、一个给内容。
3算清缓存的账(15 分钟)
读⑤:O(n²) vs O(n),省在哪、代价是什么。
4刷题自测(15 分钟)
做⑦⑩,错题回⑥看易错点。
本课小目标学完你要能:① 用自己的话说清注意力机制在干嘛;② 解释 K 和 V 各是什么角色;③ 说明为什么不缓存会是 O(n²)、缓存后是 O(n);④ 知道 KV Cache 为什么会吃显存、PagedAttention 在解决什么。

② 一图看懂:KV Cache 工作流程

已读入的 token 序列 我 今 天 去 超 市 … 每个字算出一对 (K, V) Key=被查询 / Value=提供内容 KV Cache(显存里) [K₁,V₁] [K₂,V₂] [K₃,V₃] … 新字进来只算它自己的 K,V 前面 N-1 个直接查表,不重算 注意力:用新 Q 去查所有 K 加权求和 V → 预测下一个 token 吐出下一个字 → 把它的 K,V 也存进 Cache 代价:吃显存 上下文越长,Cache 越大 长上下文是显存杀手 → 引出 PagedAttention
读法:读一句话时,每个字都会被算成一对 (Key, Value) 存进显存。生成下一个字时,新字只算它自己的 K/V,然后拿它的 Query 去"问"前面所有存好的 K,按相关度加权把 V 加起来——这样就不用把前面整段重算一遍。

③ 本质直觉:注意力机制就是"回头看一眼"

先想一个人怎么读句子。读到"它"这个字时,你会自动回头找:前面说的是猫还是狗?这就是注意力——当前这个词要"参考"前面哪些词、参考多少。

Transformer 把这件事数学化了。每个字都会被投影成三个向量:Query(查询)、Key(键)、Value(值)。你可以把它想成一个图书馆:

· Key 是每本书的"书名标签"——用来被检索;
· Value 是书里的"实际内容"——被命中后拿出来用;
· Query 是你现在脑子里的"搜索关键词"。

新字进来时,拿它的 Query 去和前面所有字的 Key 算相似度,相似度高的就多借一点它的 Value,加起来就得到"这个字该参考前面哪些内容"。

这就是 KV Cache 的根。前面每个字的 Key 和 Value 一旦算出来就不会变了(因为它们只依赖那个字本身和之前的上下文),那为什么不存起来、下次直接用?

新字 Q:"它"是指谁? Q 去和前面每个 K 比相似度 ↓ 猫(K₁ 很像) 跑(K₂ 不太像) → 多拿 V₁(猫的内容),少拿 V₂ "它" = 那只猫 注意力权重决定"听谁的"
一句话记住Query 是"我想问什么",Key 是"我能被怎么搜到",Value 是"我真的有什么内容"。三个向量都从同一个字投影出来,只是用了不同的权重矩阵。

④ 完整体系:为什么缓存能把 O(n²) 变成 O(n)

不缓存 vs 有缓存,差多少

场景每生成一个新字要做的事生成 N 个字总算量
不缓存(朴素)把前面全部 N-1 个字 + 新字一起重新过一遍网络,重算所有 K/V约 O(n²):第 n 步算 n,累加 n 次 ≈ n²/2
有 KV Cache只算新字自己的 K/V,前面 N-1 个直接从显存读约 O(n):每步只算 1 个新字
直观数字 假设一句话 1000 个 token:
不缓存 ≈ 1000×1000/2 = 50 万次"字级"计算
有缓存 ≈ 1000 次计算 (差 500 倍)

KV Cache 占多少显存

缓存的是每一层、每个注意力头、每个 token 的 K 和 V 两张表。粗算一下:一个 7B 模型、40 层、5120 隐藏维,FP16 下每多一个 token,KV Cache 大约多占 几十 KB。上下文拉到 128K,光 KV Cache 就能吃掉十几 GB 显存——这就是为什么"长上下文"贵。

显存是双份的权重本身要占一份(7B FP16≈14GB),KV Cache 再占一份。上下文越长、并发用户越多,第二份涨得越凶。推理服务优化的大头就在这里。

⑤ 应用场景:PagedAttention 与现代推理引擎

问题:KV Cache 像"一排排连续租出去的房间"
早期实现给每条请求预分配一大块连续显存存 KV,但用户对话长短不一,经常内部碎片很严重。
就像你给每个客人预留一整层楼,结果他只住了一间,其他全空着——显存被浪费了,实际能并发的请求数上不去。
vLLM 的 PagedAttention:像操作系统管虚拟内存
把 KV Cache 切成固定大小的"块"(block),逻辑上连续,物理上散落。
这跟操作系统的分页虚拟内存一个思路:每个请求的 KV 不需要一整块连续显存,用到哪块申请哪块,用完回收。碎片大幅减少,同样的 GPU 能多跑好几倍并发请求。
为什么 KV Cache 是推理优化的核心
大模型推理的瓶颈不是算力,是显存带宽。
每吐一个字,都要把几百 GB 的权重从显存读一遍;KV Cache 是除了权重之外最大的一块显存开销。谁能把 KV 管得更省、复用得更好,谁就能用同一张卡服务更多用户、跑更长上下文。

和 KV Cache 相关的其他名词

名词一句话
Multi-Query Attention (MQA)所有注意力头共用一份 K/V,Cache 直接缩小好几倍,但质量略降
GQAMHA 和 MQA 的折中,几组头共用一份 K/V,主流模型(Llama/Qwen)都用
Sliding Window只缓存最近 N 个 token 的 K/V,老的丢掉,进一步省显存
Prefix Cache相同系统提示词的 KV 多请求共享,进一步省重复计算

⑥ 高频错误诊断(5 条)

错误 1:以为 K/V 是"两个参数矩阵"不是。K/V 是每个 token 经过网络后产生的中间张量,随输入变;权重里那两套投影矩阵(Wq/Wk/Wv)才是参数。
错误 2:以为有了 KV Cache 就不用算权重乘法了权重该乘还得乘(每吐一个字都要读一遍权重做矩阵乘法)。KV Cache 省的是前面 token 的 K/V 重算,不是省掉权重计算。
错误 3:觉得 KV Cache 只占一点点显存短对话是小意思,但上下文拉到几万、十几万 token,KV Cache 能反超权重本身,成为显存大头。
错误 4:把 PagedAttention 当成新算法它不是新的注意力数学,而是显存管理——把 KV 分页存,减少碎片。注意力公式本身没变。
错误 5:以为换了对话 Cache 还在KV Cache 是单次请求内的缓存。你新开一个对话窗口,前面那段的 K/V 就被丢掉了,下次提问要重新算一遍 prompt。

⑦ 考点真题演练(4 题)

考点分布

考法出题形式应对
K/V/Q 角色问 Key 干嘛用Key 被查询,Value 提供内容
复杂度对比问缓存前后O(n²)→O(n)
代价问副作用占显存,长上下文尤其明显
PagedAttention问它解决什么KV 显存碎片、提升并发

真题基础1. 在自注意力里,Key(K)和 Value(V)分别承担什么角色?

真题中档2. 大模型逐 token 生成时,KV Cache 把计算复杂度大约从多少降到多少?

真题中档3. KV Cache 带来的主要副作用是什么?

真题拔高4. vLLM 用的 PagedAttention 主要解决什么问题?

⑧ 必背知识点卡

注意力:当前字回头看前面所有字,按相关度加权 像人读书时"它"指谁
Query:我现在想问什么 搜索关键词
Key:我能被怎么搜到 书名标签
Value:我实际有什么内容 书里的内容
缓存收益:O(n²) → O(n),快几十到几百倍 新字只算自己 K/V
缓存代价:占显存,上下文越长越凶 长上下文=显存黑洞
PagedAttention:KV 分页管理,像 OS 虚拟内存 vLLM 核心,提并发

⑨ 应用输出:朋友问"为什么我开个 128K 上下文这么贵"

实战场景:朋友吐槽"你们 API 长上下文怎么比短上下文贵那么多?"
① 先讲原理:大模型每吐一个字,都要拿它的 Q 去看你前面所有字的 K/V。前面那些 K/V 不能每次重算,得存在显存里——这就是 KV Cache。
② 再讲代价:你塞 128K 上下文,系统就得为这 128K 个 token 每人存一份 K/V 表。权重才 14GB,KV Cache 可能再涨十几 GB,一张卡能服务的用户立刻变少。
③ 解释优化:所以工业界搞了 PagedAttention(vLLM 那套),把 KV 像操作系统内存一样分页管理,碎片少了,同一张卡能多接几倍请求。
④ 给建议:能短就短,别一股脑塞长文档;把系统提示词抽出来做 Prefix Cache,重复请求能省一大半 KV 计算。
口述全链路"注意力就是新字回头看前面,每个字有 Q/K/V 三个向量。K 用来被搜、V 是内容。把前面算过的 K/V 存下来就是 KV Cache,让复杂度从 O(n²) 降到 O(n)。代价是吃显存,所以 vLLM 用 PagedAttention 像管内存一样分页管理 KV,提升并发。"

⑩ 分层练习 16 题(基础 6 + 中档 5 + 拔高 5)

▍基础 6 题

基础1自注意力里 Query、Key、Value 分别是什么?
Q=当前字的"查询意图",K=每个字的"被检索标签",V=每个字"真正提供的内容"。三个向量都由输入经过不同权重矩阵投影得到。
基础2KV Cache 缓存的是什么?
缓存前面已处理 token 的 Key 和 Value 中间张量。下一个新字进来时不用重算它们。
基础3有 KV Cache 后,生成第 N 个字时要重算前面 N-1 个字的 K/V 吗?
不用。直接从显存里读出来复用,只算新字自己那一对 K/V。
基础4KV Cache 把生成复杂度大致从什么降到什么?
从 O(n²) 降到约 O(n)。这是大模型能逐字实时生成的关键。
基础5KV Cache 存在哪里?
存在 GPU 显存里,和权重放在一起。所以它和权重抢同一块显存。
基础6新开一个对话,KV Cache 还在吗?
不在。KV Cache 是单次请求内的缓存,换对话/刷新页面就要重新算一遍 prompt。

▍中档 5 题

中档7为什么不缓存会是 O(n²)?
因为生成第 n 个字时,朴素做法要把前面 n-1 个字加新字一起完整过一遍网络,即做 n 的工作量;n 个字累加就是 1+2+…+n ≈ n²/2。
中档8为什么上下文越长,KV Cache 越大?
因为每个 token 都要存一份 K/V 张量,层数 × 头数 × 维度 × 2(K 和 V)。token 数线性增长,KV Cache 也线性涨,长上下文就是线性放大。
中档9MQA / GQA 为什么能减小 KV Cache?
MQA 让所有注意力头共用一份 K/V;GQA 是几组头共用一份。这样要存的 K/V 份数直接减少几倍,Cache 自然变小,代价是质量轻微下降。
中档10PagedAttention 是新的注意力算法吗?
不是。注意力数学公式不变,它改的是KV Cache 的显存分配方式——像操作系统分页虚拟内存一样,把大块切小块、按需分配,减少碎片。
中档11什么是 Prefix Cache?
把相同前缀(比如固定的系统提示词)的 KV Cache 在多请求间共享,避免每个用户都把同一段系统词重算一遍,进一步省算力和显存。

▍拔高 5 题

拔高12为什么说大模型推理瓶颈往往是"显存带宽"而不是算力?
每生成一个 token,都要把全部权重从显存搬到计算单元做一遍矩阵乘。权重动不动十几 GB,搬一遍比算一遍还慢。所以优化方向是少搬(量化、KV 管理)而不是多算。
拔高13为什么 Sliding Window Attention 能省 KV Cache?
它只让每个 token 关注最近 N 个 token,超出窗口的老 K/V 直接丢弃。Cache 大小从"随总上下文线性涨"变成"封顶在窗口大小",长文本显存可控。
拔高14并发量为什么和 KV Cache 关系这么大?
每张显存固定,每个在线请求都要占一块 KV 空间。KV 管得省(分页、共享前缀、GQA),同样一张卡就能同时服务更多用户;否则一个长对话就把显存吃光。
拔高15KV Cache 为什么不能跨用户共享(除了公共前缀)?
因为注意力是按当前序列路径算的,一个 token 的 K/V 依赖于它之前的内容。两个用户聊的东西不同,哪怕同一个字的 K/V 也不同,不能直接混用,只有完全一致的前缀能共享。
拔高16为什么 Speculative Decoding 这类加速也要和 KV Cache 打交道?
投机解码先用小模型草拟几个 token,再让大模型一次性并行验证。这要求大模型在一次前向里同时处理多个候选 token,KV Cache 的写入、回滚、分支管理变成关键工程问题,是现代推理引擎的标配能力。

⑪ 记忆口诀 + 7 天复习计划

三句口诀 ① Q 是想问什么,K 是标签,V 是内容;新字拿 Q 去查前面的 K。
② KV Cache 把 O(n²) 压成 O(n),代价是吃显存。
③ PagedAttention 像操作系统分页管 KV,省碎片、提并发。
天任务自检
第 1 天读②③,画 Q/K/V 图书馆比喻说清三者角色
第 2 天背知识点卡 + 基础 1-6复杂度不错
第 3 天读⑤,做中档 7-11讲清 PagedAttention
第 4 天做拔高 12-16理解显存带宽瓶颈
第 5 天做⑦真题 4 题限时每题 2 分钟
第 6-7 天合上书口述 Q/K/V、O(n²)→O(n)、PagedAttention不看资料全说对

📌 知识链路

前置知识(先学) · 第8课 · 上下文窗口:窗口里每个 token 的 K/V 都会被缓存,先懂窗口再懂缓存。
本节位置 推理为什么快:因为历史 token 的 Key/Value 不用重算,缓存下来直接复用。这是"边聊边记"的秘密。
下一步(学完去) · 第9课 · 显存与内存:KV Cache 本身也要吃内存,下一课算这笔账。
← 第5课 · 模型权重 算法与AI总览