模型自己宣告注意力范围:不用训练、不用额外打分器,长文本推理的 KV 读取量直接砍掉一半
上周读了一篇让我眼前一亮的论文。切入的角度很刁钻——大家都在想怎么"猜"模型该看哪些 token,这篇论文反其道而行:为什么不直接问模型自己?
核心摘要:长上下文解码最大的成本不是算力,是带宽——每生成一个 token,都要把整个 KV cache 从显存里搬一遍。现有稀疏注意力方案靠一个轻量打分器去"猜"哪些 token 重要,但每步仍然是 O(N) 的扫描。KAIST AI 和 Google DeepMind 的这篇论文提出 Declarative Attention(DA,声明式注意力):让模型在思维链里用 <global>、<focus>、<local> 三种标签自己宣告"我接下来要看哪里",推理引擎像解析 tool call 一样解析这些声明,动态改写注意力掩码,跳过大部分 KV 读取。零样本、不改权重、不动 kernel,在 Gemma-4-31B 上解码期注意力 token 总量降了 52.0 个点,精度只掉 1.27pp;模型越大差距越小。这不是一个刷分的工作,而是给稀疏注意力开了一条新轴——选择策略由模型自己用自然语言说出来,可读、可审计、还能用 RL 去优化。
📖 论文信息
- 标题:Language Models Can Control Their Own Attention
- 作者:Namgyu Ho、Huzama Ahmad、Woosung Koh、Se-Young Yun(KAIST AI);Tal Schuster、Cicero Nogueira dos Santos(Google DeepMind)
- 链接:https://arxiv.org/abs/2609.02737
- 发表日期:2026 年 9 月 2 日(arXiv ID: 2609.02737)
🎯 问题:每生成一个字,都要把一百万 token 的 KV cache 搬一遍
先说一个我印象很深的数字。
论文里提到,Qwen-3.5-397B-A17B 这种模型处理 1M token 上下文时,每解码一步要加载约 15GB 的 KV cache——这个带宽需求和加载 17B 激活参数本身差不多一个量级。你想想看,用户问一句"我们之前聊的那个细节是什么",模型为了回这一句话,每个输出 token 都要把整本"对话历史"翻一遍。
但经验研究早就发现,注意力权重其实高度集中在一小部分上下文 token 上。问题在哪?真实的注意力分数只有算完完整注意力矩阵之后才知道——这是个先有鸡还是先有蛋的死结。
现有方案分成两派:
| 路线 | 代表方法 | 做法 | 死穴 |
|---|---|---|---|
| 静态启发式 | StreamingLLM 等 | 按 recency、历史注意力幅度保留 token | 猜不到未来 query 需要什么,长文本性能掉 |
| 动态轻量扫描 | Quest、DeepSeek NSA 等 | 每步用代理分数扫一遍 KV cache 选 top-k | 省的是常数项,每步复杂度仍是 O(N) |
这两派有个共同点:选择逻辑都是外在的(extrinsic)——由一个和模型本体分离的机制去推断模型的需求。
这篇论文问了一个朴素的问题:模型自己难道不知道上下文哪部分相关吗?
说实话,这个问题不是没人想过。Jin et al. 2024 的 Self-Selected Attention Span 就试过训练模型选择注意力 span,但那是逐任务微调、手工设计分区语法,而且只在 2K token 上下文里验证。这篇论文的增量在于:现代开箱模型已经能在一个固定的、任务无关的 prompt 下零样本完成这件事,而且上下文拉到了 10 万 token 量级。
🧠 方法核心:让模型把"注意力计划"写进思维链
一句话讲清 DA 的核心 idea:把 CoT 从"想什么"扩展到"看哪里"——模型在推理过程中用标签宣告自己的注意力范围,推理引擎照着宣告构建掩码。

Figure 1:DA 让一个 25,466 token 的 prompt 被拆成 12 个 "magic chunk"。模型回复里 R1 是 global 模式(关注全部,0% 缩减),R2 是 focus 模式只盯 B1 这一段(3,435 token,86.5% 缩减),R3 是 local 模式只看自己已生成的内容(1,124 token,95.6% 缩减)。底部的掩码矩阵里,脚手架部分(A 系统指令、C 问题、D 指令)在所有模式下都保持可见,被屏蔽的上下文段用虚线表示。
三种模式,一次导航-取证-计算的分工
DA 把生成过程切成三种注意力模式:
<global>:看全部上下文。用于导航——扫一遍全文,定位下一段该细看哪里。<focus magic_chunks="K">:只看被点名的那一段。用于取证——从指定 chunk 里逐字摘录需要的值。<local>:一个上下文段都不看。用于计算——综合已摘录的信息做收尾推理。
一个具体的例子,问"Acme Corp 成立多久后上市",模型的回复长这样:
<global>我需要成立年份和上市年份。公司历史在 Magic Chunk 2。</global>
<focus magic_chunks="2">"Acme Corp 2003 年成立于圣何塞。"</focus>
<global>上市年份还缺。Magic Chunk 7 讲了它的财务里程碑。</global>
<focus magic_chunks="7">"Acme Corp 2011 年在纽交所上市。"</focus>
<local>2011 - 2003 = 8 年。</local>
<answer>8 年</answer>
这个设计有几个我觉得挺漂亮的细节。
Magic chunk 的伪装术。上下文被切成约 2K token 的段,但不是裸贴给模型,而是包装成一个"模拟工具调用 transcript"——每段假装是模型之前调用 get_magic_chunk 工具返回的结果。为什么多此一举?因为模型在后训练里见惯了 user/assistant/tool 的消息边界,让这些段边界落在模型熟悉的 special token 上,比让模型自己数 token 位置靠谱得多。这是个很会借力打力的工程决策。
状态机 + block 对齐掩码。一个 DA 状态机挂在推理引擎旁边,盯着输出流里的标签切换做状态转移。掩码不是按 token 粒度,而是按 vLLM 的 KV block(16-32 token)粒度向外取整——因为 kernel 是整块读的,掩掉零散的 token 省不了任何时间。这个设计让 FlashAttention 这类 kernel 完全不用改,只改写 block table,读起来就少了一块。
只动全局注意力层。现代混合架构里 SWA、GDN 这类高效层的每步成本是定值,跟上下文长度无关,掩了也白掩,DA 直接不碰。
📊 实验:省一半 KV 读取,精度只掉一两个点
实验设置
6 个模型、两个家族:Gemma-4-{31B, 12B, E4B} 和 Qwen-3.6-27B、Qwen-3.5-{9B, 4B}。15 个长上下文任务,取自 RULER、LongBench v1/v2、LooGLE、ZeroSCROLLS,分单 span 检索推理和多 span 推理两类,最长的 code_repo 任务平均上下文超过 100 万 token。评分用 LLM judge(Gemini-3-Flash 生成打分 rubric,Qwen-3.5-4B 执行,与 Gemini-3.1-Pro 的 Pearson 相关 0.99)。
两个 baseline 设计得很讲究:Vanilla 是裸上下文 + 全注意力;DA-no-mask(DA-nm) 用完整的 DA prompt 模板但不加掩码。两者的差隔离了"分块 prompt 格式"的影响,DA-nm 和 DA 的差隔离了"掩码本身"的影响。
主结果
| 指标 | Gemma-4-31B Vanilla → DA | Qwen-3.6-27B Vanilla → DA |
|---|---|---|
| 平均准确率 | 87.01% → 85.74%(降 1.27pp) | 85.31% → 82.56%(降 2.75pp) |
| 解码期注意力 token 总量 | 13.43M → 6.45M(降 52.0%) | 22.54M → 15.52M(降 31.1%) |
15 个任务里,DA 在 Gemma 上 7 个任务追平或反超 vanilla。损失集中在多 span 推理任务(Gemma 掉 2.28pp vs 单 span 的 0.78pp),这个模式很合理——多 span 任务要在多个区域间反复横跳,掩码的误伤面更大。


Figure 2(a/c):归一化到各自 vanilla 的对比。准确率上 DA 保持在 97-99%;注意力 token 上,Gemma-4-31B 降到 48%,Qwen-3.6-27B 降到 69%。注意看 DA no-mask 的柱子——166% 和 129%,比 vanilla 还高。
消融:省钱的功劳全在掩码,不在 prompt
这个消融做得相当干净,也是我觉得全文最有说服力的一段。
DA-nm 用同样的分块 prompt、同样的三模式指令,但不加掩码。结果:prompt 格式本身几乎无损——Gemma 上 DA-nm 和 vanilla 都是 87.01%,Qwen 上只差 0.69pp。但 DA-nm 的注意力 token 反而比 vanilla 高 66.2%(Gemma)和 28.8%(Qwen),因为 DA 协议会诱导模型多生成 15-35% 的 token。
掩码把这个开销变成了净收益:相对 DA-nm,掩码砍掉 71.1%(Gemma)和 46.5%(Qwen)的 token。
等等,这里有个值得皱眉的点。DA 的精度损失也几乎全来自掩码——相对 DA-nm 掉 1.27pp 和 2.06pp。这说明协议的 prompt 工程做得很好,真正的 trade-off 就是掩码本身。零样本下模型宣告的注意力范围不总是对的,该看的时候没看够,精度就掉了。
规模定律:模型越大,DA 越赚

Figure 3(a):相对 vanilla 的准确率随参数量单调爬升。Gemma 家族从 E4B 的 29% 一路到 31B 的 99%;Qwen 家族从 4B 的 64% 到 27B 的 97%。
这组数据我来回看了两遍。Gemma-4-E4B 只保留了 vanilla 29% 的准确率——这不是推理能力不行,是协议都跟不下来:它的 focus 标签解析成功率只有 58%,而大模型是 99%。DA 对基座能力有个隐形门槛,小模型连"按格式说话"都做不到,后面免谈。
好消息是 token 节省率基本与规模无关——六个模型里五个的每步注意力比率都在 0.5 附近。精度差距在收敛,成本节省不打折,这意味着 DA 会随着基座模型变强自动变好,不需要改协议本身。
上下文越长,省得越多

Figure 4(b):横轴是上下文长度分桶,纵轴是相对 vanilla 的绝对 token 差值。短上下文只省约 1M token,64-256K 桶直接省约 21M;而 DA no-mask 的曲线是反着涨的。
精度在 32K 以内跟 vanilla 差不到 1pp,最长桶降到相对 96% 左右。因为每步掩码节省的比例大致恒定(约 50%),绝对节省量随上下文长度线性放大——DA 的收益正好落在长上下文解码最贵的区间。
模式效率:focus 和 local 是省钱主力

Figure 5(b):每 token 注意力节省率随上下文长度的变化。local 模式从 88% 涨到 99%,focus 从 76% 涨到 98%。global 模式按定义节省为 0。
Gemma-4-31B 上 global 模式只占生成 token 的 27%,focus + local 合计 73%——模型大部分时间在"便宜模式"里。但也有隐忧:global 模式的占比随上下文变长涨到 45%,贡献了 DA 总注意力消耗的 80% 以上。作者在讨论里提了个很自然的解法:导航其实不需要看全文,给每段生成一个简短描述当"上下文内索引",global 模式扫索引就行——这个方向的压缩空间是数量级的。
墙钟时间估算:decode 成本降到 0.71 倍
论文把 token 节省换算成 roofline 墙钟时间(B200、bf16、MFU 40%、MBU 70% 的大 batch 优化部署):
| 模型 | Vanilla 总耗时 | DA 总耗时 | 比例 |
|---|---|---|---|
| Gemma-4-31B | 269.1 ms | 192.3 ms | 0.71× |
| Qwen-3.6-27B | 306.2 ms | 237.3 ms | 0.77× |
有个细节值得注意:vanilla 下全局注意力 KV 读取占解码时间的 73%(Gemma)和 86%(Qwen),是绝对的瓶颈。DA 的 matmul 和本地内存成本反而因为多生成的 step 略有上升,但全局读取的下降把它盖过去了。Gemma 的 SWA 层(60 层里的 50 层)构成一个掩不动的成本下限,所以它的收益被压得比 Qwen 低——架构里全局注意力占比越高,DA 越赚。
🔬 协议遵循度:成败全在"会不会按格式说话"

Figure 6(a):focus 调用解析到合法 chunk 引用的成功率,Gemma 从 E4B 的 58% 到 31B 的 99%,Qwen 从 4B 的 89% 到 27B 的 99%。每个回复的 focus 尝试次数稳定在 1.4-1.9 次,与规模无关——强模型是"叫得更准",不是"叫得更少"。
🤔 我的判断
先说结论:我觉得这篇论文最值钱的地方不是那 52%,而是它证明了"注意力选择可以是一种语言表达"。
把它放进稀疏注意力的大图景里看。Quest、NSA 这类方法是在系统 1 层面做掩码——从内部激活推断 keep-or-drop,每步都猜,猜错了没处说理。DA 是系统 2 层面的——模型用自然语言把选择说出来,说错了你能看见,策略能用 instruction 直接改,还能用 RL 同时奖励准确率和注意力效率去优化。作者自己也引了 Weston & Sukhbaatar 的 System 2 Attention 作对照,但 S2A 是"重写一遍输入再回答",DA 是让掩码随着推理过程动态展开,颗粒度细得多。
再讲几个我欣赏的点。一是可审计性:驱动 KV 读取的 token 和让人读懂注意力计划的 token 是同一批,这对 agent 系统的 oversight 是真有用的属性。二是和 KV offloading 的天然亲和:DA 只在 span 边界切换注意力集合,而且切换是提前用明文宣告的——这正是 offloading 需要的访问模式,失焦的段可以 spill 到 host memory,被点名时提前预取回来。现有稀疏注意力每步重选 token,根本没法做这种预测性调度。三是和 speculative decoding 互补:DA 降每步成本,投机解码合并步数,两者叠乘。
但问题也很明显,直说。
零样本协议多生成 31-35% 的 step,这是实打实的开销。 在小 batch、低负载场景下,decode 步数就是延迟,DA 省下的每步成本可能被多出的步数吃掉。论文的收益分析明确绑定"大 batch、硬件打满"的部署形态——这是推理服务提供商的视角,不是端侧的视角。
global 模式是真正的成本大头。 占 27% 的生成 token 却吃掉 80% 以上的注意力消耗,而且占比随上下文变长恶化。作者提的"上下文内索引"方案还只是设想,没实验。如果全局导航能压下来,DA 的天花板会高很多;压不下来,长上下文端的收益会触及一个平台期。
所有数字都是零样本的下界。 论文反复声明这一点,很诚实。但反过来说,"用 RL 优化 DA 协议"这个最大的想象空间目前完全没验证——模型可能学会更激进的 focus 策略,也可能学会敷衍宣告。还有 thinking 模式下模型不遵守协议这个限制挺要命的,现在推理模型主力都是 thinking 模式,作者寄希望于把 DA 操作暴露成标准 tool 声明来解决,但这又是一轮后训练的事。
最后一个观察:论文 8.1 节算了一笔账,在 1M token 上下文下,保留 vanilla 全局注意力的 Kimi-K3 注意力占 decode 墙钟的 94%,DeepSeek-V4-Pro、GLM-5.3-Flash、MiniMax-M3 这些 indexer 稀疏设计也在 56-97%——只要全局注意力还是 decode 成本的大头,DA 这条轴就一直有油水。而上下文窗口的历史趋势是越拉越长。
如果你在做长上下文推理服务或者 agent 系统,这个思路值得一试:不改 kernel、不动权重,prompt 加上状态机 hook 就能跑起来,边际成本极低。真正值得跟的后续是有人把 DA 做进后训练——那可能是这套协议从"能用"变成"好用"的拐点。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我