长文本为什么贵:KV 压缩的四代路线之争
先给结论: 模型读长文章要花的钱有两笔——一笔随文章变长一份一份往上加(KV cache),一笔随文章变长成平方地爆炸(注意力计算)。2024 到 2026 年,DeepSeek 的四代方案都在回答同一个问题:这两笔账里,哪一笔现在最贵?能不能只省那一笔?
一、长文本贵在两笔账:一笔线性增长,一笔平方爆炸
四代压缩路线,以及必须分开算的两笔账
上一篇讲过,模型读长文章时会做"读书笔记",正式名字叫 KV cache(key-value cache,键值缓存):把已经算过的内容存下来,下次不用重算。
为什么非存不可?模型是一个字一个字往外写的——写第 100 个字要回看前 99 个字,其中只有 1 个是新算的;每次都重算,等于自己给自己找活干。
麻烦在于厚度:文章有 n 个字,就要存 n 个字的笔记,线性增长——文章长 10 倍,笔记厚 10 倍。
第二笔账更凶:生成每个字时都要回头看前面所有字,n 个字各看 n 次,平方增长——文章长 10 倍,这项工作贵 100 倍。
📌 128K 下全注意力要处理的"字与字配对"是 131072 的平方,即 17,179,869,184 次(约 171 亿次)。
两笔账性质不同:第一笔可以攒(存下来就不重算),第二笔攒不掉——分不清这两笔,后面所有方案都会看不懂。
二、把笔记想成便签:页码越多,要占的桌子越大
想象读一本 1000 页的书,每读一页贴一张便签写要点:读到 10 页桌上 10 张,读到 1000 页桌上 1000 张。桌子大小固定,书越长越摊不开。KV cache 就是这样:它本身不算贵,“随长度一起长大"才贵。
再叠一层:模型有几十层,每层都要做自己的一份笔记,总量大致是"层数 × 每个字的条目数 × 文章长度”。想省只有三个方向:每层少记一点、几个字共用一张、让别层共用一份——四代方案正好把它们依次走了一遍。
⚠️ 先埋个坑:笔记大小有两种量法——元素数(存了几个数字)和字节数(占多少空间)。同一个方案,两种算法会得到两个不同的百分比。
三、MLA(2024):不存原文只存摘要,每层每个字 576 个数字
第一代答案叫 MLA(Multi-head Latent Attention,多头潜在注意力),出现在 2024 年的 DeepSeek-V2 报告里。先看它之前的两条路:
- 老办法(MHA):每个"注意力头"各存一份笔记,头多笔记就多。
- 省钱办法(GQA / MQA):让几个头共用一份。笔记是少了,质量真的掉——7B 规模的选择题测试(MMLU)里,全头各存 45.2 分,8 组共用 41.2 分,全部头共用一个只剩 37.9 分。
MLA 换了个思路:笔记里不存原文,存摘要。它先把每个字的信息压进一个更小的"隐向量",笔记里只留这个隐向量,外加一小段专门记位置的信息(位置没法一起压,必须单独留一条小路)。结果就是那个关键数字:每层、每个字只缓存 576 个数字(512 个压缩摘要 + 64 个位置分量)。
📌 前提:576 是 DeepSeek-V2 这一版的配置,由"摘要宽度取 4 倍头维"推出,不是所有模型通用,也不能跨代套用——V4 就把它整个换掉了。
效果有多大?在 V2-Lite 的具体形状下(16 头、头维 128、27 层)手算:老办法每层每个字 4096 个数字,MLA 只要 576 个,等于 14.06%;论文自己的说法是"相当于只有 2.25 组 GQA"。换成占空间:V2 本尊(128 头、60 层)在 128K 下每请求约 8.44 GiB,对照基座(GQA-8 结构)约 47.5 GiB——5.6 倍。
代价有四条:多出三套投影参数(权重仍占显存,只是不占笔记);摘要是瓶颈,压太狠质量就崩;每个字还得多存 64 个位置数字;训练时这些投影都要跟着一起学。
顺便看个"同一件事、两个数字":DeepSeek 报告过 93.3% 的 KV 减少,那是端到端口径(含部署时把笔记压到平均 6-bit);按"元素数、对 67B 的 GQA-8"算是 82.2%。两个都不假,但不能混用。
四、DSA(2025):不是每个字都要看前面所有字了
MLA 省的是存,可文章继续变长时,那笔平方增长的账还在。2025 年 V3.2 报告的 DSA(DeepSeek Sparse Attention,稀疏注意力)就是冲它去的。
做法很朴素:先花很小的代价挑一挑,再细看。 模型里加一个很便宜的"索引器"(lightning indexer,闪电索引器):只有 64 个头、每头 128 维,可以用低精度(FP8)算,专门给前面每个位置打"该不该看"的分,然后只取分数最高的 2048 个条目做正式注意力。主注意力的工作量于是从"n×n"变成"n×2048":128K 下(131072 个位置)理论比值 64 倍(2048 ÷ 131072 = 1.5625%)。
⚠️ 前提:这 64 倍是纯复杂度比值,不是实测速度。论文没有给出单一的加速倍数,那张端到端成本曲线的数值无法从文本重建——“实测快了 X 倍"的说法缺出处。
代价也有四条:索引器自己仍要对全部前序内容打分(每层扫一遍,文章短时省下的还不够付工钱);逐字挑选是随机访存,不如连续读取讨硬件喜欢;挑错就漏信息;它也不是事后剪枝,而是靠"2.1B 词元热身 + 943.7B 词元稀疏训练"把稀疏模式教进已有权重。
最关键的一点:DSA 和 MLA 不是二选一——MLA 负责”存得少",DSA 负责"读得少",两者叠加在同一模型里。这是这条线上第一次出现明确分工。
五、CSA/HCA(2026):先合并相邻笔记再挑,MLA 在 V4 里被换掉了
2026 年 4 月的 V4 报告做了件更狠的事:把 MLA 换掉了——这篇报告全文 0 次出现"MLA",主线用了两年多的低秩压缩路线在这里正式断代。新思路是"先把相邻位置的笔记合并,再去挑":
| 名字 | 做法 | 那一步用不用挑 |
|---|---|---|
| CSA(Compressed Sparse Attention) | 每 4 个字加权合并成 1 条笔记 | 用 DSA 的老办法挑(512 条或 1024 条) |
| HCA(Heavily Compressed Attention) | 每 128 个字才合并成 1 条,极粗 | 不挑,直接全部看一遍 |
两种层交替布置。为什么值得?还是"哪一笔最贵":DSA 的索引器要对全部内容打分,到 1M 上下文时,这一项被重建估算占 V3.2 单 token 计算量的 93.2%——最贵的环节原来在这儿。先压缩再打分,被打分的东西少到 1/4(每层 17.2 GFLOPs 降到 4.3 GFLOPs)。
官方头条两个数字都有前提:1M 下 V4-Pro 需要 27% 的单 token 计算量(等价值 FP8 口径)和 10% 的 KV 缓存,分母是 DeepSeek 自己的 V3.2(稀疏版,1M 处外推)。那 10% 怎么算的?指南重建为 10.2%,换几种同样合理的记账方式则落在 5.6% 到 15.4%——精确的逐层记账论文没有披露。
代价同样四样:块内细节被合并掉了,所以补了一条 128 个字的"未压缩滑窗"(最近的字保持原样看);补一个"注意力水槽"给没用的笔记一个去处;笔记条目还要同时充当"键"和"值"(MQA 化),放弃 MLA 的低秩红利;注意力类型变成逐层配置,推理系统复杂度跟着涨。
六、跨层复用(2026 V4.1):40 层只留 4 层记笔记,平均每个字约 2.5 条
前三代都在同一件事上使劲:让每个字、每层的笔记变窄或变少。2026 年 9 月的 V4.1-Flash 换了个全新方向——砍"层"。
全模型 40 层里,只有 4 层真正存储主笔记(配置里是第 2、8、14、20 层),其余层用三种固定模式取用别人的成果:Full(自己算一份全新的)、Reindex(拿别人的笔记,用自己的问题重新挑)、Reuse(连挑都不挑,直接用上一位的答案)。笔记条数因此变成:3 个编码器层各贡献半条 + 1 个解码器层贡献 1 条 = 平均每个字约 2.5 条。
📌 前提必须钉死:2.5 条是 V4.1-Flash 自己这一版的配置;对照的 V4-Flash 是 43 层各带各的,平均每个字 5.156 条。
再把每条精度从 FP8 换成 FP4(每条 288 字节 = 512 通道 × 0.5 字节 + 32 字节缩放系数),主笔记一项就从约 2,640 字节/词元降到约 720 字节/词元,3.67 倍。索引也分层:只由少数层产出,深层在固定候选池里挑(池子最多 16,384 个位置,1M 时占 1.6%),打分量降到约 1/61。代价是池外的位置深层永远看不见;第一层挑错了整个组跟着错——论文自己把它列为"待刻画的鲁棒性边界"。
诚实清单:这一版的组件全部没有消融(三模式配比、压缩倍数、挑多少条、精度、有界重放各自贡献多少都没拆分);短于约 3K 词元时几乎没收益(此时局部滑窗的笔记比全局笔记还大)。
七、那四个数字有四个分母,笔记变小也不等于快了几倍
这是本篇最想让你带走的一节。新闻里很可能见过一串说法——“KV 压到 1/4"“持久缓存降到 1/8"“比早期方案省 437 倍”,听起来像同一件事的三种程度。不是的,这是分母完全不同的数字。
| 你听到的说法 | 分子:谁省了 | 分母:跟谁比 | 条件与缺口 |
|---|---|---|---|
| 全局 KV 890 字节/词元,≈ 1/4 | V4.1-Flash 常驻显存的 KV | V4-Flash | 只算主笔记,不含索引器 KV;论文写 890,重建带 900–1,040 字节,落在带内但不对齐端点 |
| 持久缓存 1/8 | V4.1-Flash 的持久缓存 | 它自己的 3.5K(把滑窗移出之前) | 依赖"滑窗笔记移出持久缓存 + 128 词元有界重放"成立 |
| 437 倍 | 某一代方案 | V1(第一代),BF16 精度、GQA-8 结构下的字节 | 指南用 python3 精确重建为 437.2;是字节口径 + 指定精度,不是元素口径 |
| decode 单 token 计算量 近常数 | V4.1-Flash | 它自己(随上下文长度变化) | 靠权重精度 BF16/FP8/FP4 = 1/0.5/0.25 实现;曲线在论文图里,文本无法重建 |
再看一个已经踩过的坑:V4 的"10% KV"和 V4.1 的"1/4”,分母一个是 V3.2(在 1M 处),一个是 V4-Flash——两个数字不能相乘、不能互相印证,更不能说成"从 10% 又降到 1/4”。
三条边界也要讲清楚:
- 笔记只是开销的一部分。 那条 128 字滑窗笔记约 2.6 MB,它与全局笔记的交叉点在约 2.9K 词元——文章短时全局笔记根本不是大头,“1/4"在短文里几乎看不出来。
- 省笔记 ≠ 省显存。 显存里还躺着权重、投影矩阵、索引器自己的缓存(V4.1 连它的存储精度都没披露,所以 890 字节无法逐项重建)。
- 省笔记 ≠ 变快。 吞吐还受计算量、量化、批处理调度影响:DSA 的 64 倍是复杂度比;MLA 的缓存数字也不能直接外推吞吐——93.3% 是端到端结果,不是"纯 MLA 的功劳”。
📌 关于时间跨度:本系列不拿"十年/二十年"当卖点。能回源的时间点只有两个——MQA 出现在 2019 年、GQA 出现在 2023 年(论文引用的既有路线);DeepSeek 自己的四代是 2024 到 2026,只有三年。更早的起点没有回源——连标题里的数字也要问出处。
十年也好三年也好,主题只有一句话:不平均地省——先找到"当前最贵的那一处",只在那里省。 2024 年最贵的是"存",于是存摘要;2025 年是"每个字都要看全部",于是挑着看;2026 年是"索引器要扫描全部内容",于是先合并再打分;到 V4.1 是"每层都重复记同样的笔记",于是大部分层干脆不记。这个套路,也是整个系列的主题。
一句话总结: 长文本的贵来自两笔账——笔记随长度线性变厚、注意力随长度平方爆炸;四代方案(MLA → DSA → CSA/HCA → 跨层复用)各自解决"当前最贵的那一笔",而每个省钱的数字都带着自己专属的分母。
记住这个数字: 576——DeepSeek-V2 的 MLA 每层、每个字只缓存 576 个数字(512 个压缩摘要 + 64 个位置分量),这是"存摘要不存原文"这条路的起点(前提:这是 V2 自己的配置,不是所有模型通用,也不是字节数)。