SeKV:把 KV 缓存做成"可变分辨率"地图,长上下文推理终于能两条腿走路

你有没有这种感觉:同一个 128K 的长 prompt,给同一个模型跑两次,一次答得头头是道,一次直接 hallucination。问题出在哪?不是模型能力不够,是 KV 缓存被压缩得太狠,原本应该被精确检索的那一句话,已经在 prefill 阶段被当作"不重要 token"扔掉了。

这篇来自 UBC 和 Microsoft Research 的 SeKV(论文 arXiv ID 2606.31145),就是冲这个问题来的。


核心摘要

SeKV 把 KV 缓存从"扁平 token 列表"重构成一张分层语义地图:以 token 熵(surprisal)作为零成本切分信号,把上下文切成一个个语义 span,每个 span 同时保留两份表示——GPU 上一个轻量 summary 向量用于快速路由,CPU 上一份低秩 SVD 基底用于按需还原 token 级细节。一个训练出来的 zoom-in 机制在每一步解码时决定把哪些 span 临时"放大"到全分辨率。整个 base LLM 冻住不动,额外可训练参数不到 0.05%。

在 4 个长上下文基准、5 个 backbone 上,SeKV 在 10% KV 预算下比最强的语义压缩基线 SentenceKV 平均高 5.9 个点,比 FullKV 在 128K 时少用 53.3% 的 GPU 显存,同时延迟还更快。一句话评价:它不是另一种 token 淘汰方案,而是把 KV 缓存从"垃圾桶"升级成了"可变焦镜头"。


论文信息

  • 标题:SeKV: Resolution-Adaptive KV Cache with Hierarchical Semantic Memory for Long-Context LLM Inference
  • 作者:Amirhossein Abaskohi、Giuseppe Carenini、Peter West(UBC);Yuhang He(Microsoft Research)
  • 链接:https://arxiv.org/abs/2606.31145
  • 提交日期:2026 年 6 月 30 日
  • 代码:https://github.com/AmirAbaskohi/SeKV

问题:现有压缩方法都在 prefill 阶段"做死决定"

现在的 KV 缓存压缩基本分两派:

第一派:token 淘汰。 典型代表 StreamingLLM、H2O、SnapKV、PyramidKV。它们在 prefill 阶段根据 attention 分数挑出"重要 token",把剩下的永久丢掉。问题是:哪些 token 重要,取决于 query 啊朋友。prefill 阶段 query 还没进来,模型凭什么知道后面哪句话会被问到?结果就是图 1(a) 那种尴尬——关键事实埋在文档中段,prefill 阶段被认为"不重要"被 evict 掉,最后 attention 全跑到文档边界去了,模型 hallucination 给出 23% 这种离谱答案。

图 1:左侧 token 淘汰方法把关键 token 直接丢掉,attention 在文档两端鼓起来,中间答案区被掏空;右侧 SeKV 用语义 span 保住所有信息,命中时局部放大

图 1:(a) 现有 token 淘汰方法把关键 token 永久丢弃,attention 在文档边界鼓包而答案区接近为零,导致幻觉;(b) SeKV 把上下文组织成语义 span,在 GPU/CPU 内存层级上保留所有信息,训练出的 zoom-in 机制动态把最相关的 span 展开到 token 级分辨率。

第二派:语义分组。 典型代表 ChunkKV、SemantiCache、SentenceKV。它们把上下文切成块或句子再压缩,比纯 token 淘汰好一些,但压缩策略还是在 prefill 阶段定死的,生成时只能从已经决定的"保留池"里挑,挑不到的就再也找不回来了

SeKV 的判断很直接:长上下文 KV 缓存需要的不是更狠的压缩,而是一种可变焦的内存组织——平时存低分辨率的"地图",query 真问到这里时再把局部"放大"到全分辨率。


方法:熵切 span + 双分辨率 + 训练式 zoom-in

SeKV 整个方法分三块:怎么切 span、每个 span 怎么存、什么时候放大。

3.1 熵引导的 span 切分

切分信号用的是 prefill 阶段 LLM 自己算出来的 token surprisal(也就是 \(-\log p_\theta(x_t \mid x_{<t})\))——这个东西不需要额外模型,prefill 一次前向就有了,零成本。

直觉是:surprisal 高的位置往往是话题切换、实体引入、逻辑转折的地方,正好是 span 边界。论文把 surprisal 大于 \(\mu + \sigma\alpha\) 的位置作为锚点(anchor),锚点之间的 token 就是一个语义 span。\(\alpha\) 控制切分粒度。

相比 ChunkKV 的固定大小切块、SemantiCache 的聚类切分,这种"内容自适应"切法的优势是:信息密集的地方切出更短 span、更多锚点,保留更细粒度;平淡的地方合并成长 span,总锚点数自然变少。这其实也是 surprisal 用作分块信号最早被研究时的核心发现。

3.2 双分辨率表示 + GPU/CPU 内存分层

这是 SeKV 最关键的设计。每个 span 同时存两份:

层级 存什么 用途 大小
GPU summary 向量 \(\bar{k}_{S}\) 粗粒度路由("这个 span 相关吗") 极小,每头每层一个 \(d_r\) 维向量
GPU 锚点 token 的 full KV 始终在线的"高保真种子" 跟锚点数量成正比
CPU 低秩 SVD 基底 \(U, \Sigma, V^T\) 选中时还原成 token 级 KV 跟保留秩 \(r\) 成正比,$r \ll

Summary 向量怎么算? 不是简单平均,而是 surprisal 加权投影到 head-specific 的路由空间:

\[\bar{k}_S^{(l,h)} = W^{(l,h)} \cdot \frac{\sum_{t \in S} \tilde{w}_t \, k_t^{(l,h)}}{\sum_{t \in S} \tilde{w}_t}\]

其中 \(W^{(l,h)}\) 是 per-head per-layer 的可学习投影——为什么必须每头每层一个?因为不同头不同层的 attention 模式天差地别(这本来就是多头注意力的设计初衷),用同一个路由空间肯定表达力不够。

路由打分用 sigmoid 不是 softmax。 这里有个细节我很喜欢:因为"哪些 span 重要"是独立多标签问题,不是"在 K 个里面挑一个"的竞争问题,所以用 sigmoid gate + 单调长度先验,避免长 span 被系统性地低估。

低秩 SVD 基底怎么用? 对每个 span 的 key 矩阵做截断 SVD 得到 \(K_S \approx U \Sigma V^T\),但不是固定截到 rank \(r\),而是用一个轻量预测器给每个奇异分量一个软门控 \(g_i\)

\[K_S \approx \sum_i g_i \, \sigma_i \, u_i v_i^T\]

预测器只用奇异谱 \(\Sigma\) 和 span summary 算开销,得到每分量保留概率。信息量大的 span 自然保留更多分量,平淡 span 自动瘦身。Value 矩阵做同样处理。

这里的关键设计是:SVD 本身是 prefill 阶段用随机化截断 SVD 算一次,后续不解它——梯度只流过 soft gate,避免了 SVD 反向传播在奇异值退化附近的数值不稳定(这点论文也明确说了)。

3.3 训练式 zoom-in 机制

这是最灵魂的部分。每一步解码时,SeKV 对每个 span 算一个"展开概率" \(\alpha_S^{(l,h)}\),跟 per-head per-layer 阈值 \(\tau^{(l,h)}\) 比较,超过就展开成 token 级:

\[\text{expand}(S) \iff \alpha_S^{(l,h)} \geq \tau^{(l,h)}\]

为什么必须per-head per-layer?因为 attention head 分工不同:retrieval head 经常需要展开远距离 span,streaming head 几乎从不展开。论文后面 Figure 5 的热图就证实了这点——zoom-in 集中在中后层的少数 head 上,大多数 head 几乎不展开。共用一个全局阈值,要么过度展开要么欠展开。

混合分辨率注意力怎么算? 这一步实现很优雅:所有 span 都参与同一个 softmax,被展开的 span 用还原出的 token-level KV 算精细 attention,没展开的 span 用 summary + 修正项算一个"等效"贡献。没有任何 span 被丢掉——被压缩的只是"目前不重要的那部分",需要时可以再放大。

训练目标有 4 个 loss 加起来

\[L = L_{\text{distill}} + L_{\text{zoom}} + L_{\text{recon}} + L_{\text{budget}}\]
  • 蒸馏 loss:让 SeKV 输出的 attention 分布逼近 FullKV 教师
  • Zoom 监督 loss:直接监督路由概率,让它预测教师 attention mass 在哪些 span 上集中(关键是这里监督的是概率而不是决策,所以 threshold 不会自己定义自己的监督信号,训练稳)
  • 重建 loss:监督每分量的软门控,让保留的秩能有效降低逼近误差
  • 预算 loss:惩罚展开 span 数量和总保留秩,避免模型偷懒全展开

反传用 straight-through estimator(STE)处理二值决策。整 base LLM 完全冻住,可训练部分只有路由投影 + 阈值 + 秩门预测器,在 Llama-3-8B 上总共约 4M 参数,不到模型 0.05%。

图 2:SeKV 总览图,左边 prefilling 切 span、算 summary 和 SVD,右边 decoding 两阶段——Stage 1 路由打分,Stage 2 选中 span 异步取 SVD 基底还原 token 级 KV

图 2:SeKV 总览。输入被切成熵引导的 span。锚点和 summary 留在 GPU 做粗路由,SVD 基底放 CPU。每步解码:Stage 1 路由找出相关 span,异步把它们的 SVD 基底搬到 GPU;Stage 2 还原 token 级 KV 算精细 attention,最后两阶段输出合并。


实验:四个基准、五个模型、四个角度

主实验:4 个基准、5 个 backbone、20/20 全胜

主表(Table 1)用 10% KV 预算跑 4 个基准 × 5 个 backbone = 20 个组合,SeKV 全部拿下最强压缩结果。下表挑出关键部分(Llama-3.1-8B-Instruct + Qwen2.5-14B-Instruct 表现):

基准 / 模型 FullKV SnapKV PyramidKV ChunkKV SentenceKV SeKV
LongBench / Llama-3.1-8B 51.18 47.11 48.02 49.14 49.93 51.02
LongBench / Qwen2.5-14B 55.47 49.34 50.17 51.42 52.31 54.71
RULER / Llama-3.1-8B 88.35 74.31 76.23 78.41 80.37 84.17
RULER / Qwen2.5-14B 90.74 77.48 79.33 81.17 83.41 87.34
InfiniteBench / Llama-3.1-8B 28.88 22.47 23.62 24.71 26.07 27.94
InfiniteBench / Qwen2.5-14B 36.51 28.14 29.37 30.84 32.17 34.83
NIAH / Llama-3.1-8B 91.52 73.42 75.83 79.23 82.13 87.42
NIAH / Qwen2.5-14B 95.28 76.83 78.41 81.72 84.83 91.17

几个我看完后觉得"嗯,确实"的点:

  • SeKV 与 FullKV 差距很小——在 LongBench 上平均只差 0.80 个点,InfiniteBench 上差 1.23 个点。也就是说用 10% 预算基本拿到了完整缓存的效果。
  • 检索型基准上提升最猛——NIAH 上比 SentenceKV 高 +5.68,RULER 上高 +3.63。说明"按需放大"对"找一句话"这种场景最有效。
  • 越强的模型越受益——Qwen2.5-14B 比 SentenceKV 的提升幅度(+2.94 到 +3.83)比 Llama-3.2-3B 更大,说明更强模型能更好利用被还原的精细信息。
  • 20/20 全部最佳——这个胜率在我印象里很少见。一般论文会有 1-2 个组合是 baseline 更好。

NIAH 热图:SeKV 哪里强

图 3:NIAH 热图,6 个方法的 needle 检索成功率。SeKV 87.4% 最高,StreamingLLM 54.2% 最低,SeKV 在长 context 深层 needle 位置最稳定

图 3:Llama-3.1-8B 的 Needle-in-a-Haystack 检索热图(KV 缓存大小 128,上下文 8K)。绿色越深表示该 needle 位置/深度下检索成功率越高。SeKV 整体最稳定,StreamingLLM 长 context 几乎全失败。

热图里一眼能看出 StreamingLLM 在 4K+ 长度就崩成一片红黄,因为它只保留 sink + 滑动窗口。SnapKV / PyramidKV 在深 needle 位置有明显的"低带"——这些位置被 attention 选择性忽略了。SeKV 几乎是全绿一片,最分散也最稳定。

效率分析:又快又省

显存扩展性(Figure 4)——这是最打动我的图:

图 4:Qwen2.5-14B 在 batch=1 下的 GPU 显存随上下文长度增长曲线。SeKV 几乎平线,FullKV 128K 时翻倍

图 4:Qwen2.5-14B 在 batch=1 时不同方法的 GPU 显存随上下文长度的变化。FullKV 从 8K 的 36GB 涨到 128K 的 74.8GB,SeKV 几乎平线,从 31.2GB 涨到 34.9GB。

128K 上下文时,FullKV 已经到 74.8GB(基本上一张 A100/H100 都装不下),SeKV 还是 34.9GB。这就是论文摘要里"53.3% GPU 显存节省"的图。SentenceKV 看着省,但 128K 时也到了 43.6GB,而且准确率比 SeKV 低 6 个点。

延迟/吞吐(Table 3)——在 Qwen2.5-14B、batch=1 下:

场景 FullKV 延迟 SeKV 延迟 FullKV 吞吐 SeKV 吞吐
4K 输入 / 1K 输出 43.60s 38.05s 105.92 T/S 120.11 T/S
8K 输入 / 4K 输出 183.42s 166.95s 55.93 T/S 64.21 T/S

比 FullKV 快、还比 FullKV 准。StreamingLLM 更快(8K/4K 150.86s)但准确率崩。

Many-shot 推理:GSM8K 50-shot

50-shot GSM8K 是个挺有意思的测试——它不是"找一句话",而是看模型能不能在 prompt 里保留50 个推理模板的累积结构。Table 2 显示 SeKV 5 个 backbone 平均比 SentenceKV 高 +2.3 个点,跟 FullKV 平均差距只有 2.4 个点。说明这种"按需展开"不仅对单点检索有效,对长 prompt 的整体结构保持也有效。

消融:每块都不能少

Table 5 在 Qwen2.5-14B 上 10% 预算做消融(NIAH 列):

变体 NIAH 相对完整 SeKV 损失
完整 SeKV 91.17
w/o 熵切分(用固定块) 86.42 -4.75
w/o 锚点 87.31 -3.86
w/o surprisal 加权 summary 88.14 -3.03
w/o 训练式 zoom-in 85.96 -5.21
w/o SVD 还原 83.47 下降 7.70 个点
全局阈值(per-head) 87.82 -3.35
均值池化 summary 88.43 -2.74

最大损失来自 SVD 还原(-7.70)和 训练式 zoom-in(-5.21)。这个组合非常说明问题:光是 summary 路由、不做按需还原是不够的;反过来,固定阈值一开就掉 3 个多。这些 ablation 串起来看就是 SeKV 整个设计哲学的实证。

预算敏感性:5% 预算下 SeKV 反而拉开差距

预算 SnapKV ChunkKV SentenceKV SeKV
5% 69.84 74.31 78.62 86.31
10% 76.83 81.72 84.83 91.17
15% 79.24 83.76 86.92 92.08
20% 80.63 85.14 88.21 92.46

预算越紧 SeKV 优势越大。5% 预算时比 SentenceKV 高 +7.69,10% 高 +6.34,到 20% 高 +4.25。这非常合理——预算紧时"按需放大"的杠杆最大,预算松时所有方法都接近 FullKV。

Zoom-in 热图:大部分 head 几乎不展开

图 5:SeKV 在 NIAH 上的 zoom-in 频率热图(Qwen2.5-14B),中后层少数 head 频繁展开,大多数 head 几乎不展开

图 5:SeKV 在 NIAH 任务上各层各 head 的 zoom-in 频率。亮色表示该 head 经常展开 span。可以看到 zoom-in 集中在中后层的少数 head,大多数 head 几乎不展开。

这是 SeKV 内部行为最直观的图。最亮的两条带是层 19-31 的 head 23 和 head 19,这俩是 retrieval head,几乎每步都展开;其他大部分 head 整个推理过程都不怎么展开。这就是为什么 per-head per-layer 阈值比全局阈值好——少数头包揽了大部分"展开"工作。


我的判断

它解决了真问题。 "Token 淘汰"这条路径在长上下文上已经基本走死了。核心矛盾就是 prefill 阶段不可能预知哪些 token 重要。SeKV 的"GPU summary + CPU 低秩 + 按需还原"是绕过这个矛盾的一种思路——不预先决定丢谁,让 query 来了再决定

它不是堆叠组件。 三个核心组件(熵切分、双分辨率、训练式 zoom-in)每个都对应着一个具体的失败模式:固定切块伤语义边界 → 熵切;token 淘汰丢信息 → CPU 留 SVD;静态压缩不能动态响应 → 训练式 zoom-in。每个组件都有 ablation 支撑。

它能落地。 Base LLM 完全冻住,可训练参数 < 0.05%,训练数据用 RedPajama 普通长文档就行,训一个 backbone 在单卡 A100 80G 上 5-10 小时。这是真的能跑的东西,不是只在 paper 上成立的玩具。

它有什么问题?

第一,依赖 surprisal 的质量。Surprisal 在普通自然语言上稳定,但在代码、表格、碎片化 discourse 上可能切分不准(论文 Limitations 也明说了)。这个我比较担心——长上下文应用里表格、代码、QA 模板是常态。

第二,CPU↔GPU 带宽依赖。SeKV 节省了 GPU 显存但增加了 CPU→GPU 数据搬运,CPU-GPU 带宽差的部署环境(比如某些云上 PCIe 拓扑)可能反而被这个开销拖慢。论文延迟是 A100 80G 上测的,PCIe Gen4 x16 = 32GB/s。换到带宽更紧的设备,数据会变。

第三,SVD 算一次但存的是 basis。Span 越长,左奇异向量 \(U\) 就越长,这部分没压缩。论文说"短 span 全保留"来缓解,但如果是超长文档里出现一个超长 span(比如小说里大段描述),SVD 因子本身的开销并不小。

第四,没跟最新的 retrieval-based 方法正面比。RetroInfer(2025)、DesireKV(2026)这些也是 CPU 离线的方案,SeKV 跟他们怎么比、优势在哪,论文里没看到 head-to-head。

整体来说:这是一篇方法设计扎实、实验完整、性能确实涨了 5+ 个点的 paper。它不是那种"换个 loss 涨 0.5 个点硬吹"的论文。从工程角度看,"可变焦 KV 缓存"这个范式本身值得跟进——尤其是当 budget 紧、需要长上下文、又能接受额外 CPU 资源的时候。


一句话总结

SeKV 把 KV 缓存从"扁平 token 列表"变成"可变焦的语义地图":GPU 存粗粒度 summary,CPU 存低秩备份,训练式 zoom-in 决定展开谁。比 FullKV 省 53% 显存、还更快;比最强 baseline 高 5.9 个点。Base LLM 冻住不动,参数开销 < 0.05%。这是一个真能落地的设计。


关键图表速查

内容 看点
图 1 现有方法 vs SeKV 注意力分布对比 一图讲清楚"为什么需要按需展开"
图 2 SeKV 整体架构(prefill + 两阶段 decoding) 理解双分辨率、GPU/CPU 分层、异步 prefetch
图 3 NIAH 热图(6 个方法) 验证 SeKV 在长 context + 深 needle 位置最稳
图 4 GPU 显存随 context 增长 SeKV 平线、FullKV 翻倍
图 5 Zoom-in 频率热图 证明 per-head per-layer 阈值的合理性
图 6 三个模型 × 三个基准的 zoom-in 热图 验证这种行为在不同 backbone 一致

论文基本信息

  • arXiv ID:2606.31145
  • 链接:https://arxiv.org/abs/2606.31145
  • 机构:University of British Columbia + Microsoft Research
  • 作者:Amirhossein Abaskohi、Giuseppe Carenini、Peter West、Yuhang He
  • 代码:https://github.com/AmirAbaskohi/SeKV

觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我。