语言模型能自己决定该看哪里吗?

你有没有想过一件事:一个能读懂百万字小说的AI,回答"男主角小时候养的那只猫叫什么名字"这种问题时,其实是把整本书从头到尾又"扫"了一遍才找到答案的?

这听起来有点荒谬。你自己回忆一件事的时候,绝不会把一辈子的记忆全部倒带一遍再作答,你会直接跳到相关的那个片段。但今天几乎所有的语言模型,在处理长文本时都在做这种"笨功夫"。

这就是这篇论文要解决的问题。KAIST AI和Google DeepMind的研究者们发现,语言模型在生成每一个字的时候,理论上只需要关注上下文里很小的一部分信息,可实际操作中,它却不得不把整个上下文都"读"一遍才能确定该关注哪一部分。这种矛盾造成了巨大的浪费,而更有意思的是,他们提出的解决方案不是造一个更聪明的检测器,而是直接问模型:你不是知道该看哪里吗?那你自己说出来不就行了。

一个反直觉的浪费:模型明明知道答案在哪,却要重新翻遍全书

先说清楚问题有多严重。

以一个真实的例子来说,Qwen-3.5-397B这样的模型处理100万token的上下文时,每生成一个字,都要从显存里读取大约15GB的KV缓存

KV缓存*:模型在处理文本时,会为每个已经"看过"的词生成一组叫做Key和Value的向量,存起来供后续生成时参考。上下文越长,这个缓存就越大,读取它的开销也越大。

这15GB是什么概念?差不多相当于把这个模型170亿激活参数整个重新加载一遍的带宽消耗。而这只是生成一个字的代价,如果回复有几百字,这个开销就要重复几百次。

问题的核心在于,注意力的分布高度集中。已有研究反复证明,模型在处理长文本时,真正被"重点关注"的往往只是上下文里的一小撮token,大部分内容对当前生成的这个字几乎没有影响。

既然如此,为什么还要把全部内容都读一遍?

原因很扎心:没人知道提前该读哪部分。注意力分数是要等模型算完整个注意力矩阵之后才知道的,这是一个先有鸡还是先有蛋的问题。于是学界过去几年发展出了一整套"预测热点区域"的方法,比如根据最近使用过的token优先保留(这被称为"近期性"启发式),或者根据历史注意力权重的大小来判断哪些token更重要。

这些方法有一个共同的软肋:它们都是靠猜的。

近期性、历史权重这些规则本质上是静态的经验法则,没法真正预判未来某个特定问题需要用到上下文里的哪个具体细节。后来的改进方案变得更聪明一些,它们会在每一步生成时,先对KV缓存做一次轻量级的扫描打分,挑出得分最高的一批token去参与真正的计算,这就是所谓的动态稀疏注意力。DeepSeek的V3.2、V4都用了类似思路,通过一个轻量级的"索引器"给每个token打分。

这确实降低了常数级别的开销,但问题的本质没变:这个打分扫描过程,依然要过一遍全部的上下文,复杂度还是O(N),只是系数变小了。

这就好比你为了找家里钥匙放在哪,专门雇了一个助手每次都把全屋翻一遍,只不过这个助手手脚比你快。手脚快是快了,但翻箱倒柜这个动作本身没有被省掉,如果房子越住越大(上下文越来越长),这个助手迟早也要慢下来。

研究者们的思路是反过来问一个问题:模型自己不是知道钥匙在哪儿吗?那为什么不让它直接说出来?

让模型开口说"我要看哪里":声明式注意力协议

这就是这篇论文提出的核心方法,叫做**声明式注意力**(Declarative Attention,简称DA)。

DA*:一种协议,让模型在生成回答的思维链过程中,用特定的标签明确声明"接下来这段推理,我需要关注上下文的哪个部分",推理引擎读取这些声明后直接跳过不相关的KV缓存读取。

这个想法的灵感来源其实并不神秘。已经有研究证明,语言模型的隐藏状态里其实编码了关于未来token的信息,而思维链提示(chain-of-thought)本质上就是把这种潜藏的计算过程用可读的文字表达出来。既然模型可以把"接下来该怎么想"写出来,那让它把"接下来该看哪里"也写出来,逻辑上是完全说得通的延伸。

DA把生成过程切分成了三种模式。

第一种叫global(全局模式),模型在这个状态下能看到全部上下文,用来做导航,判断接下来该去哪个区域找答案。

第二种叫focus(聚焦模式),模型只能看到自己指定的那一小段上下文,专门用来从里面提取具体信息。

第三种叫local(局部模式),模型完全看不到原始上下文,只能基于自己已经生成出来的内容做推理和总结。

论文里给了一个特别直观的例子。假设问题是"Acme公司成立多久后上市的",模型的推理过程可能长这样:先进入global模式,说"我需要找到成立年份和上市年份,第2个片段应该包含公司历史信息";然后切到focus模式,只盯着第2个片段读出"Acme公司2003年在圣何塞成立";再回到global模式找上市信息,定位到第7个片段;再次focus提取出"2011年上市";最后进入local模式,不再看任何原文,只凭前面提取的两个数字做减法算出"8年"。

整个过程读起来跟人类解题的思路几乎一模一样:先扫一眼定位,再精读细节,最后闭着眼睛算答案。

这里有一个特别巧妙的设计细节,值得单独说一说。研究者把长文本切成大约2048 token一段的"魔法片段"

魔法片段(magic chunks)*:论文对上下文分段单元的称呼,之所以叫"魔法"是为了提醒模型,这些分段是任意切出来的检索单位,跟文档本身的章节结构没有关系,避免模型把它们和真正的语义边界混淆。

而这些片段呈现给模型的方式,不是简单地拼接文本,而是伪装成一段"工具调用记录":好像模型之前调用了一个叫get_magic_chunk的工具,一段一段把文档取回来了,虽然这个工具其实压根没被真正执行过,所有内容在生成开始前就已经摆在那里了。

为什么要这么绕一圈?因为模型在预训练和后训练阶段见过大量结构化文本,段落边界、句子边界,尤其是工具调用里user、assistant、tool这几种角色轮次之间的边界,是模型天然就很擅长追踪的东西。如果用一些从没见过的自定义分隔符去标记片段,模型反而可能追踪得磕磕绊绊。这就好比你想让一个新员工快速记住文件柜的分类逻辑,与其发明一套只有你自己懂的编号体系,不如直接沿用公司里每个人都习惯的部门缩写,员工上手更快,出错更少。

那这套"声明"是怎么真正转化成计算节省的?答案在于一个叫DA状态机的东西,它跟推理引擎并肩运行,实时监听模型输出流里的标签变化,一旦看到``或者``标签,就立刻更新接下来这一步该允许模型看到哪些KV缓存位置,构造出一张分段级别的注意力掩码。

这套机制被集成进了vLLM

vLLM*:一个开源的大模型推理服务框架,被广泛用于生产环境部署,以高效管理KV缓存著称。

的推理框架里,而且做得相当讲究工程细节。因为vLLM把KV缓存存成一个个固定大小的"块"(通常16到32个token一块),注意力核函数是整块整块读取的,如果只是零散地丢弃个别token,实际的内存读取量根本不会减少。所以DA的掩码是按块对齐的,把要保留的token范围向外圆整到块边界,最多在每个边界多读几十个token,相对2048 token的片段来说几乎可以忽略。这样一来,现成的FlashAttention

FlashAttention*:一种针对Transformer注意力计算做了IO优化的高效算子,被广泛用于大模型的高速推理和训练。

核函数完全不需要改动就能直接吃掉这个掩码,跑得又快又稳。

这样值不值:更多的解码步骤,换来更少的每步开销

这里有个绕不开的权衡问题:既然DA需要模型多写一些标签、多绕几圈思考,那生成的步数肯定会变多,这多出来的步数会不会把省下来的注意力开销又吃回去?

论文用了一个叫roofline wall-time(屋顶线墙钟时间)的分析框架来回答这个问题。

Roofline模型*:一种衡量硬件性能上限的经典分析方法,把计算任务分为"计算受限"和"内存带宽受限"两类,分别用峰值算力和峰值带宽作为理论天花板去估算实际耗时。

简单说,这套框架把解码过程中的开销拆成两部分:一部分是FFN(前馈网络)的矩阵乘法,这部分在大批量推理时是计算密集型的,跟上下文长度没关系,只跟生成了多少个token有关;另一部分是注意力的KV缓存读取,这部分是内存带宽密集型的,会随着上下文长度和步数同时增长。

在大批量、长上下文的生产部署场景里,注意力这部分的开销会远远压过FFN。论文给了一个具体的数字例子:以Qwen-3.5-397B为例,在100万token上下文下,单步注意力操作的理论耗时大约是矩阵乘法耗时的145倍。这个差距意味着,只要能压缩注意力这一块的读取量,哪怕多花一点步数,总体也是划算的,前提是部署环境是那种把prefill(预填充)和decode(解码)分开跑在不同硬件池上的现代化大批量服务架构,这在DeepSeek这类大厂的生产环境里已经是标配做法。

用一个开车的场景来理解可能更清楚。假设你要开车去一个陌生地方,每一步都要停下来把整本地图册翻一遍确认路线,这显然很慢。而如果你先花几秒钟看一眼路标确定大概方向(相当于global模式),然后专心盯着眼前这一小段路(相当于focus模式),大部分时候甚至可以凭刚才记住的路线直接往前开而不用再看任何标识(相当于local模式),你确实会因为"确认方向"这个动作多花了几次停顿,但省下来的翻地图时间远远超过这点停顿的代价。如果不这么做,每一步都全本翻阅,速度会被拖到让人无法忍受。

实测效果:15个长文本任务,省下一半以上的注意力开销

方法讲清楚了,接下来看它到底管不管用。

研究者在Gemma-4-31B和Qwen-3.6-27B这两个当前主流的开源大模型上,做了零样本

零样本(zero-shot)*:不对模型做任何额外训练或微调,直接用一段固定的提示词让模型执行新任务的方式。

测试,没有做任何针对性训练,完全靠一段固定的提示词模板让模型"照做"。测试覆盖了15个长文本任务,涵盖RULER、LongBench v1/v2、LooGLE和ZeroSCROLLS这几个业内知名的长上下文评测基准,任务类型从简单的密钥检索到跨文档的复杂多跳推理都有,上下文长度从几千token到超过百万token的代码仓库不等。

结果是这样的:在Gemma-4-31B上,DA把解码过程中总的注意力读取量降低了52.0%,平均准确率只掉了1.27个百分点(从87.01%降到85.74%);在Qwen-3.6-27B上,注意力读取量降低了31.1%,准确率掉了2.75个百分点(从85.31%降到82.56%)。

| 模型 | 方法 | 准确率 | 注意力读取量(M/样本) |

|---|---|---|---|

| Gemma-4-31B | Vanilla(原始) | 87.01% | 13.43 |

| Gemma-4-31B | DA | 85.74% | **6.45** |

| Qwen-3.6-27B | Vanilla(原始) | 85.31% | 22.54 |

| Qwen-3.6-27B | DA | 82.56% | **15.52** |

单看这个数字可能没什么感觉,换算一下:在最长的代码仓库问答任务上(LBv2/code_repo),Gemma模型每次回复省下了4180万个token的注意力读取量,Qwen省下了5200万个。这不是理论上的数字游戏,是实实在在的显存带宽节省。

为了确认这些节省到底是从哪儿来的,研究者还专门做了一个对照实验,叫DA-no-mask(简称DAnm):用一模一样的提示词模板,让模型照样生成那种"分模式思考"的文字,但是推理引擎完全不做任何掩码限制,还是老老实实把全部上下文都算一遍。

结果发现,DAnm的准确率跟原始方法几乎没有差别(Gemma上87.01%对87.01%,完全持平;Qwen上84.62%对85.31%,只差0.69个百分点),但是它的注意力读取量反而比原始方法还高出66.2%(Gemma)和28.8%(Qwen),因为模型在这种协议下确实会生成更多的思考步骤。

这个对照实验说明了一件很关键的事:真正带来效率提升的,不是"让模型多想一点"这个动作本身,而是那个真正被执行的掩码。如果只是让模型嘴上说说"我现在要聚焦看哪里",却不真的把这句话落实成硬件层面的读取限制,那反而是白白多花了力气还没捞到好处。这就好比公司要求员工每天写工作日志声明"今天重点做A任务",但如果没有人真的照着这份日志去调配资源、减少其他任务的干扰,那这份日志除了增加员工的书写负担,什么好处都不会有。

越大的模型,用起来越顺手

论文还测了一个很有意思的规律:模型的能力和它用好DA协议的水平之间,存在明显的正相关。

研究团队一共测了六个不同规模的模型,Gemma系列从4B到31B,Qwen系列从4B到27B。结果显示,DA相对于原始方法的准确率保留比例,随着模型规模增大而稳步上升。在Gemma系列里,从最小的E4B模型只能保留29%的原始准确率,到最大的31B模型能保留99%;Qwen系列从4B的64%上升到27B的97%。

为什么小模型表现这么差?研究者进一步拆解发现,很大一部分原因根本不是"推理能力不够",而是"协议都没遵守好"。他们统计了一个叫focus成功率的指标,衡量模型发出的focus标签有多少能正确解析成一个有效的片段引用。Gemma-4-E4B这个最小模型的focus成功率只有58%,而最大的31B模型能达到99%。换句话说,小模型很多时候连"我要看哪个片段"这句话都说不利索,自然没法指望它精确地找到答案。

这个发现挺有意思的,它意味着DA不是一个万能药,而更像是一种需要一定"语言表达能力"门槛才能发挥价值的协议。这跟人类学习一门新技能有点像:一个刚学会走路的孩子,你让他"精确描述你现在想去哪个方向",他大概率说不清楚,但一个成年人做同样的事情毫无压力。模型的规模在这里扮演的角色,某种程度上类似于语言表达和自我认知的成熟度。

有意思的是,注意力节省的比例反而跟模型规模关系不大,五个模型里注意力读取量都稳定在原始方法的46%到69%之间,跟准确率那条明显向上的曲线形成了鲜明对比。这说明"每一步该读多少"这个机制本身的效率是相对稳定的,真正随着模型变强而改善的,是模型"用好这套机制去解决问题"的能力。

上下文越长,省得越多

另一个符合直觉但仍然值得单独拎出来说的发现是:DA节省的绝对token数量,会随着上下文长度的增加而急剧放大。

研究者把15个任务的数据按上下文长度分桶统计,发现DA在短上下文(8K以内)时,只比原始方法省下大约100万个token,而在最长的那一档(64K到256K)里,节省量猛增到2100万个token。

这个现象背后的道理其实很朴素。因为DA每一步的节省比例大致维持在50%左右这个恒定值,是一个相对固定的百分比,而上下文本身的体量决定了这个百分比对应的绝对数字有多大。上下文越长,50%对应的绝对数字自然就越夸张。这就好比给一辆百公里油耗5升的车加满油和给一辆油耗10升的车加满油,省下来的钱的绝对数额会随着油箱大小成倍放大,即便省油的百分比是一样的。

也正因为这个规律,DA这个方法的应用场景越往长上下文的方向走,价值就越明显。而当前整个行业的趋势恰恰就是上下文窗口越做越长,从最初的几千token一路推进到今天动辄百万token的规模,这也是研究者在论文里反复强调的一点:这个方法的收益会随着行业本身的技术演进而自然放大,不需要额外做什么。

掩码内部到底发生了什么:三种模式的成本分布

再往细节里看一层,DA的三种模式在实际生成中各自占了多大比重,每种模式又省下了多少。

在Gemma-4-31B上,global模式只占了生成token总量的大约27%,剩下73%都花在了focus和local这两种"便宜模式"上。而这两种便宜模式的每token注意力节省效果非常可观,focus模式平均能省掉88%左右的每步注意力开销,local模式更是能省掉94%左右,因为local模式压根不去看原始上下文。

这里有个细节值得琢磨:global模式的占比会随着上下文变长而上升,在超过128K的最长一档里,global占比涨到了45%左右。这意味着"导航"这件事本身,在超长文档里也会变得更费力,模型需要花更多的思考步骤去反复确认自己该往哪儿看。研究者提出了一个未来可能的改进方向,让模型在导航阶段不必看完整的原始内容,而是浏览一份类似"目录索引"的压缩摘要,就像图书馆的分类卡片目录一样,体积比原书小得多,翻起来自然快得多。

局限和例外:哪些任务DA还搞不定

研究者也很坦诚地列出了几类DA目前处理得不太好的任务,一共六个例子,可以归为两类根本性的矛盾。

第一类问题是分段本身破坏了答案所需的证据。比如一个统计全文里某个词出现次数的任务,答案需要跨越所有片段做全局计数,而focus模式一次只能看一个片段,天然就凑不齐完整信息,准确率在这类任务上跌幅高达30个百分点。再比如遇到跨片段的表格,切分本身就把一张完整的表格硬生生斩断了,数据自然就残缺了。

第二类问题是输出长度本身会随着文档长度线性增长的任务,比如逐段做摘要、或者需要给整本书里所有内容排序的任务。这种任务的解码步数天然就会随着文档变长而暴涨,即便每一步的注意力开销确实降低了,累积起来的总token数依然可能超过原始方法。

这两类问题揭示了一个挺重要的道理:DA的三种模式假设的是"信息可以被局部化处理",一旦某个任务需要真正意义上的全局信息聚合,或者输出体量跟文档规模强绑定,这套分模式思考的框架就会显得力不从心。这不是掩码机制本身失效了,论文里特别强调,即便在这六个失败案例上,每一步的注意力读取量依然确实降低了39%到67%,问题出在生成策略本身跟任务形状不匹配,而不是底层机制坏了。

写在后面

读完这篇论文,最触动我的不是那些节省了多少百分比token的数字,而是它选择的解决问题的角度。

过去几年,几乎所有减少注意力计算量的研究,都在琢磨怎么造一个更聪明的"外部裁判"去猜测模型接下来需要看哪里,无论是靠历史统计规律,还是训练一个专门的打分器。这篇论文换了个立场,它问的是:既然模型自己心里明镜似的知道该往哪看,为什么不直接问它?

这个转向背后其实藏着一个更大的判断,就是思维链本身正在从一种"让模型多想想提高准确率"的技巧,慢慢演变成一种"让模型的内部计算过程变得可读、可控、可干预"的接口。论文里提出的"系统2稀疏注意力"这个说法我觉得挺贴切,以往的稀疏注意力方法本质上是系统1式的,是从模型的内部激活里"猜"出该关注哪里;而DA是系统2式的,是模型用语言"说"出来的。这个差别看起来只是实现方式不同,但它意味着未来这套选择逻辑可以像调教模型的推理能力一样,用强化学习去继续优化,而不是被锁死在一套固定的启发式规则里。

还有一点我觉得值得单独提一句,论文里提到的"可逆式上下文压缩"这个设想。现在的agent系统在处理超长对话历史时,常用的做法是"摘要压缩",把旧内容浓缩成一段总结,原始token的KV缓存就此永久丢弃,如果之后又需要用到被压缩掉的细节,只能重新从文本把它跑一遍prefill,代价不小。而DA因为从不真的删除序列,只是暂时不让某一步看到某些内容,理论上被"忽略"的那部分KV缓存完全可以被挪到内存的更外层存放,等哪一步的声明重新点名它时再取回来,跟解码过程并行加载,不需要重新计算。这算是一个附带发现,但想象空间还挺大。

论文里也留了一个我觉得挺值得继续追问的口子:目前所有实验都是在模型没有开启"思考模式"

思考模式*:部分模型支持在正式回答前生成一段较长的内部推理过程(也叫thinking),通常用特殊标签包裹,不直接展示给用户。

的情况下跑的,因为研究者发现模型在思考标签内部没法好好遵守DA协议。可现在的agent系统越来越多地依赖那种在工具调用之间穿插思考的长推理链条,如果DA没法在思考模式下稳定工作,它能省下的开销可能就只覆盖了整个推理过程里的一小段。这个限制什么时候能被打破,或许才是决定这套思路能走多远的关键。

如果有一天,模型不仅能告诉你答案是什么,还能顺带告诉你它是怎么找到这个答案的、途中翻了哪几页书、跳过了哪些内容,你会不会觉得,这样的AI更值得信任一点?

Q&A

Q1:声明式注意力DA是什么?

A:DA是一种让语言模型在生成回答的思维链中主动声明"接下来该关注上下文哪个部分"的协议,分为global、focus、local三种模式,推理引擎读取这些声明后直接跳过不相关的KV缓存读取,从而减少计算开销。

Q2:DA会不会明显降低模型的回答准确率?

A:影响较小。在Gemma-4-31B上准确率只降低1.27个百分点,在Qwen-3.6-27B上降低2.75个百分点,同时注意力读取量分别减少了52%和31.1%,而且这个准确率差距会随着模型规模增大而进一步缩小。

Q3:DA需要额外训练模型才能用吗?

A:不需要。论文中的DA完全是零样本(zero-shot)方法,只依靠一段固定的提示词模板,在现成的Gemma和Qwen模型上直接生效,没有做任何参数微调或专门训练。

作者声明:作品含AI生成内容
举报/反馈
分享到: 微博 QQ 空间
对本文内容有合作意向?
我们将在 1 个工作日内与您联系
留言咨询