① 小白第一课怎么学(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 在解决什么。
⑥ 高频错误诊断(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 主要解决什么问题?
⑨ 应用输出:朋友问"为什么我开个 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 的写入、回滚、分支管理变成关键工程问题,是现代推理引擎的标配能力。