NoteBank:给线性注意力外挂记忆,长文检索 1.7%→70.3%
线性注意力记不住长上文,卡在一个定长状态同时要算、又要记
定长状态撑不住长文检索,病因不在容量,而在于同一个状态被同时征用了两个互相冲突的角色,持续计算与长期存储。KAUST 团队的新论文《History Replays Itself》把病因定位在这里,解法也因此变得很干净:把长期存储搬出状态,交给一份可以随意增删的外挂记忆,模型权重一个都不动。NoteBank 的整篇设计都在回答同一个问题,定长状态为什么会撑不住长文检索,以及怎样把压垮它的那份职责拆出去。
要解释这个双重职责为何会让检索塌缩,先回到线性注意力如何用定长状态计算。它用核函数点积替换 softmax,把计算量从序列长度的平方降到近似线性;换成状态更新的视角看,每一步只更新一个定长状态 $S_t$,推理开销与历史长度无关,而模型能留到下一步的记忆也只能落在这个状态里。这份“每步只动这一个张量”的记账是它效率的来源,也是塌缩的隐患所在,因为历史证据没有别处可放,只能覆盖着写进同一块固定大小的记忆。Mamba、Gated DeltaNet 这一族模型的效率优势正来自这里。Gated DeltaNet
塌缩的第一手证据来自同一族的三个 1.3B 模型。在 RULER-NIAH 这类“海里捞针”基准上,平均准确率随上下文从 4K 走到 1M 一路跌向零,而它们用的正是同一套定长状态,只是具体更新规则不同。紧挨着这笔能力账的还有一笔存储账,它同样指向“不是装不下”:要把 1M token 的检索能力补回来,并不需要一块巨大的显存。NoteBank 的持久上下文存储是 74.5 MiB,而同等宽度、深度与 BF16 精度的 MHA KV cache 需要 192 GiB,相差约 2600 倍。能力跌到接近零,账却这么便宜,这两个事实并置才逼出真正的问题,状态里到底发生了什么。NoteBank 项目页

图注:论文 Figure 1 的双 panel。左图是同一族三个 1.3B 循环模型在六个 RULER-NIAH 任务上的平均准确率,虚线 Plain 随上下文从 4K 到 1M 趋零;右图对比 1M token 下的持久上下文存储,NoteBank 约 74.5 MiB,同宽度同精度的 MHA KV cache 为 192 GiB。NoteBank
塌缩的解释因此只剩下一个,问题出在同一个状态被同时征用了两个角色。一个定长状态既要承载当前步的计算,又要保存全部历史证据,两件事挤在同一块固定大小的记忆里。把这两个角色拆开看会更清楚,计算需求是每读一个 token 就更新一次状态,容量始终是常数;存储需求是把过去所有 token 的信息都压进这同一块状态,而它随历史线性增长。一个要求常量,一个要求增长,两条曲线方向相反,却共用同一个张量。序列一长,新证据持续写入,就必然覆盖旧证据。这个诊断有一个必要的限定,它不是某一家模型更新规则没写好,而是这一族模型共同的记账方式:在 SSD(结构化状态空间对偶)框架下,状态空间模型与结构化掩码注意力在 1-半可分矩阵上互为对偶,Mamba-2 正是这一交集的实现 SSD,而 Gated DeltaNet 是同一族里加入门控与 delta rule 的实例 Gated DeltaNet。三条曲线能画进同一张图,前提就是它们共享这套定长状态记账,所以换 backbone 也躲不掉。接下来的每一处设计都在回应这个诊断。
NoteBank 的解法:把证据搬出状态,用 backbone 自己的 k/q 寻址、再原样回放
NoteBank 由三步组成,写(write)、寻址(address)、回放(replay)。写,把上下文分块,按 key 的独特性给块内位置打分,选出有信息的片段,连同固定维度的地址一起存进记忆。寻址,用 backbone 自己的 query 对每条 note 做通道投票,取回最相关的 top-R 条。回放,从保留状态的工作副本重新跑一遍“被选证据加问题”,复用 backbone 的原生前向生成答案。三步里 backbone 始终冻结。
具体走一个小例子。假设输入是 1M token 的合同文本,问题是“违约金比例是多少”。写阶段,模型把文本按固定长度切块,在每一块里用该层该头的 native key 算一个独特性分数,衡量某个 token 的 key 与所在块平均 key 有多不一样,分数高的位置更可能是关键信息。被选中的片段按句子边界扩展成一条 note,每个通道各挑一个分数最高的 token,把它的 native query 压缩成 16 维的地址,note 与地址一起存档。
寻址阶段,问题到达后,模型从保留状态 $S_T$ 的一份副本出发做一次额外前向,得到问题侧的 query。它把这条 query 与每条 note 的地址逐通道算相似度,再让所有通道投票,得票最高的前 R 条被取回。检索用的那份中间状态随即丢弃。
回放阶段,从 $S_T$ 的另一份副本起跑,先跑取回的原文片段,再跑问题,生成答案。读出过程的每一步都是 backbone 原本就有的前向计算,没有插入任何专门训练的读出模块。

图注:论文的方法总览图。context encoding 阶段用 native 的 keys 与 queries 选定 span,每个 span 与它的地址 $A_i$ 一起存下;问题到达后,从保留状态 $S_T$ 的副本编码问题,经通道投票取回相关的 span;回放阶段从同一 $S_T$ 的另一份副本出发,先处理取回的证据再处理问题,由冻结的 backbone 生成答案。NoteBank
把 $S_T$ 复制成两份、分别用于检索与读出,是这套机制里最容易看漏的一步。检索那份用完即弃,读出那份才用来生成答案,所以 NoteBank 不需要在状态里保存中间计算,也不需要把历史 K/V 拼回去。这一点把它和“复用 KV cache”明确区分开:KV cache 是把历史的键值原样贴回来,NoteBank 是让模型拿着被选中的原文重新读一遍。项目页的架构图里三个 backbone 块旁都标着雪花标记,对应论文里 backbone 全程冻结的设置。NoteBank 项目页
还有一点值得一提:正因为回放走的是原生前向,backbone 已经支持的并行训练与推理算法可以直接套用,NoteBank 不需要为这套机制单独写一套定制 kernel。
既然索引和读出都复用 backbone 自身,就既不需要外部 embedding 模型,也不需要单独训练的神经 reader。论文给出的成本旁证是:native routing 在 1M 上耗时 26 ms,BM25 是 87 ms,BGE 是 2630 ms。NoteBank
在 1M token 的 RULER 上,检索准确率从 1.7% 抬到 70.3%,多花的算力不到原有 0.025%
在 GDN 1.3B、1M token 上下文、六个 RULER-NIAH 检索任务取均值的口径下,训练-free 的 NoteBank 把分数从 1.7% 抬到 70.3%,整整加了 68.6 个百分点。同一设置下 GDN-2 加 66.6 个百分点,Mamba-2 加 37.8 个百分点。作为对照,把上下文整段重复一遍再提问的 JRT 仍然随长度趋零。
评测覆盖 4K / 16K / 64K / 256K / 1M 五档长度,每档 100 个样本,六个子任务覆盖单针、多针、多值、多查询等检索变体。NoteBank

图注:项目页的 RULER 主曲线,三个并排面板依次是 GDN、GDN-2 与 Mamba-2。每个面板横轴为 4K 到 1M token 的对数刻度,纵轴为六个检索任务的平均准确率;灰色虚线的 plain 与蓝色虚线的 JRT 随长度塌缩,橙色实线的 NoteBank top-2 保持在高位,右侧粉箭头标注 +68.6 / +66.6 / +37.8 个百分点的差值。NoteBank 项目页
这张图右侧只标了三个差值,1.7% 与 70.3% 这两个绝对值来自论文正文,图上并没有标出。
1.7% 这个数字值得单独说一句,因为它说明基线低得有多彻底。RULER 本身就是一把能区分“声称的长上下文”与“实际可用的长上下文”的尺子:它以 Llama2-7B 在 4K 上的平均分 85.6% 作为通过门槛,评测过的多款号称 32K 到 1M 上下文的模型,实际有效长度都远低于声称值,而非 Transformer 架构在它上面明显落后于 Llama2-7B 基线。RULER 也就是说,1.7% 是一个远低于有效长度门槛的分数,抬到 70.3% 是在一把能量出差距的尺子上量出来的,不是在没区分度的题上刷分。
同期还有一条平行路线,不去外挂记忆,而是改线性注意力的 update 规则。GDN-2 把擦除与写入从共享的标量 β 拆成通道级向量。GDN-2 FG²-GDN 把标量 β 通道化,并进一步分离 K/V 两侧的写缩放。FG²-GDN QED 在 GDN-2 上又加了 query 方向的二次擦除。QED 这些工作与 NoteBank 目标相同、接口不同:它们改的是模型内部怎么记,NoteBank 改的是证据放在哪里。
同一套机制挪到真实长文与代理记忆上,收益缩成 +3.2 与 +1.1 个百分点
换成真实长文与代理记忆,同一套机制的收益变得温和。在 post-trained 的 Qwen3.5-9B 上,LongBench v2 的 QA 与对话子集从 46.1 升到 49.3,加 3.2 个百分点;MemoryAgentBench 从 55.7 升到 56.8,加 1.1 个百分点。与 RULER 上 +68.6 的断崖式提升相比,这是另一个量级的增益。
要理解这个落差,得看清 LongBench v2 测的是什么。它是 503 道四选一多选题,上下文从 8K 到 2M 词,覆盖六类二十个子任务,考的是深度理解与推理,而不是把答案直接抽出来;在这个题集上,人类专家的平均准确率也只有 53.7%。LongBench v2 换句话说,+3.2 个百分点是在一个连人类都只有一半多对的题集上拿到的稳定增益,含金量不能用 RULER 上的涨幅来换算。

图注:MemoryAgentBench 的四类能力分类示意,横向依次是准确检索、测试时学习、长程理解、选择性遗忘,每类下方配一段多轮交互片段作为示例。这张图给出的是代理记忆能力的分类框架,不是基准对比结果。MemoryAgentBench
MemoryAgentBench 把这四类能力做成 2071 道题,上下文深度从 103K 到 1.44M token。MemoryAgentBench NoteBank 的 +1.1 个百分点落在“相关证据还在不在、能不能被取回”这一格,选择性遗忘论文没有声称解决。
论文里还有一个更醒目的数字:Mamba-2-8B 在 MemoryAgentBench 上 Plain 是 0.0,加上 NoteBank 后到 14.7。NoteBank 但这个起点需要先用 λ=0 重置循环状态才能用上,论文说明这是该 backbone 自身的长度外推失败,所以不能拿它去宣称任何 backbone 都能开箱即用。
论文还区分了两种设置。训练-free 的 NB-TF 完全冻结 backbone;可选的 NB-LoRA 只在回放与答案生成阶段打开轻量适配器,在上下文摄入与检索阶段关闭。两者的分工在数据里很清楚:RULER 1M 上 NoteBank 单独就把 GDN 从 1.7 拉到 59.8,再加 LoRA 反而略低到 58.4;而在 LongBench v1 的 12 个任务上,LoRA 单独就能把 GDN 从 15.49 拉到 22.72,NoteBank 加 LoRA 到 23.03。NoteBank 项目页 取回证据与任务适配解决的是两个不同的瓶颈,这也解释了为什么真实任务上的收益要靠 reader 侧的轻量适配才明显。
把上限从状态容量挪到外挂存储容量之后,剩下的空档是写入策略与选择性遗忘
NoteBank 真正搬动的是长上下文上限的来源。定长状态只负责持续计算,长期存储交给外挂容量,而这份容量的账很小,但绝不是零。
在 1M token 上,NoteBank 在三个 backbone 上增加的 analytical FLOPs 在 0.0171% 到 0.0250% 之间,持久上下文存储 74.5 MiB,含循环状态、不含模型权重。代价出现在实际延迟上:H100、batch size 1、生成 32 个 token 的设置下,GDN 的端到端时间从 125.11 秒涨到 140.64 秒,增幅 10.6% 到 13.2%,峰值显存从 2.93 GiB 升到 3.27 GiB。NoteBank

图注:论文第 5 节的效率图。panel (a) 是相对 analytical FLOPs 开销,随上下文变长被摊薄;panel (b) 是 NoteBank 新增的持久 GPU 存储,随上下文线性增长但量级很小;panel (c) 是 H100 上 batch 1、生成 32 个 token 的端到端延迟,NoteBank 与 Plain 的曲线几乎平行。NoteBank
把这份账和别的方案放在一起看更清楚。InfLLM 在 1M 上用 block-level memory 复用历史 K/V,需要在 CPU 上保留 47.78 GiB 的历史键值,而 NoteBank 的持久上下文存储是 74.5 MiB 这个量级。InfLLM
剩下三个空档论文自己写得明白。第一,写入策略是手工设计的,分块大小、span 预算与回放预算的最优值都随 backbone 与任务变化,论文没有给出端到端学习的方案。第二,归档后取不回来的问题也没解决:即使把包含正确答案的 oracle note 直接放进去,Mamba-2 加 LoRA 的配置上仍有 +17.34 个百分点的提升空间,说明“存了但没取回”是当前的主要 headroom,而 oracle 也不是上界。第三,选择性遗忘与对抗性检索论文没有回答。
还有几处边界不该被忽略:论文没有声称解决自然长文的理解本身,Mamba-2-8B 的零起点要靠重置循环状态才能用,代码仓库目前尚未发布。一句话总结这篇论文的位置:它的可复用贡献是一个不改 backbone、几乎不花算力就能挂上去的长上下文接口。它换来的是“能取回”,换不来“会挑证据、会忘掉旧证据”,而这两件事正是这条路线接下来最有价值的空档。
想深入可以读原文:History Replays Itself: Unleashing Long-Context Capability in Linear Attention — arXiv:2610.15715
参考文献
- History Replays Itself: Unleashing Long-Context Capability in Linear Attention(NoteBank,锚定论文)— arXiv:2610.15715
- NoteBank — History Replays Itself(官方项目页)— 项目页
- FG²-GDN: Enhancing Long-Context Gated Delta Networks with Doubly Fine-Grained Control — arXiv:2604.19021
- Gated DeltaNet-2: Decoupling Erase and Write in Linear Attention — arXiv:2605.22791
- The Query Knows What to Forget: A Second Erase Direction for Linear Attention(QED)— arXiv:2608.13668
- Gated Delta Networks: Improving Mamba2 with Delta Rule — arXiv:2412.06464
- Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality(Mamba-2 / SSD)— arXiv:2405.21060
- Just Read Twice: Closing the Recall Gap for Recurrent Language Models(JRT)— arXiv:2407.05483
- InfLLM: Training-Free Long-Context Extrapolation for LLMs with an Efficient Context Memory — arXiv:2402.04617
- RULER: What's the Real Context Size of Your Long-Context Language Models? — arXiv:2404.06654
- LongBench v2: Towards Deeper Understanding and Reasoning on Realistic Long-context Multitasks — arXiv:2412.15204
- Evaluating Memory in LLM Agents via Incremental Multi-Turn Interactions(MemoryAgentBench)— arXiv:2507.05257