NoteBank 为循环及混合语言模型保存少量原文片段,在问题到来时重新输入,缓解固定大小状态遗忘历史信息的问题。该方案无需训练或修改主干,也不依赖额外的嵌入模型、检索器或阅读网络。
Linear attention 和 state-space 模型处理长输入时,运行成本较低,因为它们维护的是固定大小的 state,而不是不断增长的 KV cache。问题在于,state 会遗忘。KAUST 的一篇新论文《History Replays Itself》(arXiv:2610.15715)提出了 NoteBank:一个无需训练的附加机制,在模型之外保存少量原始文本片段,等问题到来时,再把这些片段送回模型重放。下面介绍它的工作原理,以及这些实验数字能说明什么、不能说明什么。
NoteBank 为 Gated DeltaNet(GDN)、Mamba-2 等预训练循环语言模型和混合语言模型,外挂了一套稀疏的情景记忆。它不改变 backbone 的权重或架构,也不使用外部 embedding 模型、单独训练的 retriever,或独立的 reader 网络。保存什么、如何找回、怎样读取,都由模型自己完成。
作者认为,循环 state 被要求同时承担两份工作:既要维持当前计算,又要充当长期存储。随着上下文增长,state 不断被覆盖,一些证据可能在尚无人知道它会派上用场时,就已经丢失了。NoteBank 把这两份工作分开:循环 state 继续负责原有的计算,一份小型的原文档案则负责回忆。
包含 linear attention 层的模型正越来越多地用于混合架构,例如 Kimi Linear 和 Qwen3-Next 系列,因为它们能降低长上下文的内存占用和计算量。它们的短板在于检索:从输入中很靠前的位置,找出某个被埋藏的具体事实。
在上下文长度为 100 万 tokens 的六项 RULER 大海捞针任务上,论文报告,加入 NoteBank 后,GDN 的平均准确率从 1.7% 提升到了 70.3%。论文还报告,从 4K 到 1M tokens,检索表现没有显著下降。在宽度、深度和精度相同的条件下,其持久存储量约为完整 multi-head attention KV cache 的 1/2,600,论文图 1 给出的对比是 74.5 MiB 与 192 GiB。额外计算量据报告最多占解析估算 FLOPs 的 0.025%。
整个流程分为三个阶段,全部利用模型原本就会计算的特征。
写入(Write)。上下文按每块 C 个 tokens 处理,循环 state 照常在块之间传递。在每个块内,writer 根据每个 token 的 key 向量有多独特来打分:用 1 减去该 token 的 key 与块内平均 key 的余弦相似度,再对各层、各 head 的结果取平均。选出独特性总分较高的窗口后,在 token 预算内将其扩展到句子边界,保存为笔记。这一步发生在问题尚未出现时,因此只能依靠独特性这类通用信号来筛选。
寻址(Address)。每条笔记都会在每个 layer-head 通道上获得一个紧凑的地址:取笔记中最独特的 token 所对应的模型原生 query 向量。问题到来后,从已保存 state 的副本出发运行这个问题,得到它自己的 query 向量。每个通道通过最大余弦相似度为所有笔记打分,并投票给自己的最佳匹配项。最终检索出票数最多的笔记,最多 R 条。票数相同时,优先选择更早出现的笔记。
重放(Replay)。将检索出的笔记按原文顺序拼接,从已保存 state 的一个新副本出发,送入未经修改的 backbone。随后处理问题并生成答案。实际效果相当于让模型在回答前,重新阅读相关段落,使证据在 state 中保持鲜活,而不是已经逐渐淡忘。
控制流程的大致示意如下:
# write (during context encoding)
for chunk in chunks(context, C):
state = backbone.update(state, chunk)
notes += select_notes(chunk, keys, top_w=W) # distinctiveness scoring
addresses += make_addresses(notes, queries)
# read (when the question arrives)
q_feats = backbone.query_features(question, state_copy)
top = vote_over_channels(q_feats, addresses, top_r=R)
replay = concat_in_document_order(top)
answer = backbone.generate(state_copy, replay + question)
论文还提供了一个可选方案:训练轻量级 LoRA adapters,帮助模型在下游任务中利用重放的证据。最受关注的检索结果无需训练即可实现。这些 adapters 只在重放和回答阶段启用,因此不会改变写入和寻址过程。
成本的增长方式也符合预期。档案大小随上下文长度线性增长,增长速率由笔记预算决定。问题与档案之间采用穷举匹配,因此匹配成本同样线性增长。重放预算则固定不变,额外 tokens 最多为 R 乘以笔记长度。
这个方案的实用价值在于:只要给成本较低的循环模型一个保存原文证据的地方,它就能表现得像是拥有大得多的记忆。这对长时间运行的 Agent、长文档和聊天历史很有吸引力,因为为这些场景保留完整 KV cache 的成本很高。论文报告的收益也不局限于合成检索任务:在 LongBench v1/v2 和 MemoryAgentBench 上同样取得了提升,覆盖的 backbone 从三个 1.3B 研究模型,一直到 Mamba-2-8B,以及经过 post-training 的 Qwen3.5-9B。
有几点限制需要留意:
大海捞针测试是最有利的场景。RULER 这类任务奖励的是找出一个具有鲜明特征的片段。如果回答问题所需的证据零散分布在整篇文档中,或者需要汇总大量段落,那么对于一份在问题出现前就已写好的稀疏档案来说,难度会更高。
存储和计算量方面的结论来自解析估算。论文中的 FLOP 数字是按层进行的解析估算,正如作者所说,它们并不测量实际运行时间。穷举匹配和重放会带来真实的延迟,而 FLOP 计数无法体现这些延迟。
这还是一篇预印本。实验结果尚未经过同行评审,也尚未得到独立复现。
它更接近一种检索机制,而非一种新架构。创新之处在于,利用 backbone 自己的 key 和 query 完成写入与寻址,再用它自己的前向传播完成读取。这省去了额外组件,但“保存片段,再重新阅读”这一核心模式,对任何构建过检索增强系统的人来说都很熟悉。
对于开发者,值得借鉴的是这个设计原则:要修复远距离信息的回忆能力,未必需要扩大循环 state,也未必需要重新训练模型。在 state 旁边维护一份小型原始文本档案,并从中取出内容重放,就可能以较低成本找回大量丢失的能力。
NoteBank 将“记住所有内容”和“利用当前上下文进行计算”分开。它在阅读时写下独特的文本片段,用模型自己的 query 特征找回这些片段,再在回答前重放。在论文报告的 benchmark 上,这让一个 1.3B 的 Gated DeltaNet 在 100 万 tokens 长度下的平均准确率,从接近零提升到约 70%,而存储开销很小。可以把它视为一种值得在自身工作负载上测试、颇有潜力且无需训练的技术,尤其适合答案集中在某个独特段落中的任务;但它还不代表长上下文问题已经解决。
主要来源:History Replays Itself: Unleashing Long Context Capability in Linear Attention(arXiv:2610.15715)及项目页面
背景资料:Gated Delta Networks
背景资料:Mamba-2 / Transformers are SSMs
背景资料:RULER 长上下文 benchmark
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。