推理模型单次生成可以吐出几十万 token——大约是一本书的长度。这些 token 全部驻留在内存里,以同等成本被注意力机制处理,不管它们最终有没有价值。模型本身没有内置机制来压缩已经推理出的内容、保留结论、然后轻装前进。
Memento 试图解决的就是这个问题。
核心机制:Memento
Memento 训练让模型把自己的思维链切成语义连贯的块(block),每个块结束后生成一个 memento——一个密集的压缩摘要,包含块的结论、关键公式、中间值、策略判断。可以把它理解为一个引理:最小的、足够未来推理继续的记录。
一旦 memento 生成,前面的思维块立即从注意力中被遮罩(mask),其 KV 缓存条目被刷新。模型后续只看累计的 memento 加上正在工作的当前块。这形成一种锯齿状模式:上下文在块推理时增长,在 memento 产生后骤降,峰值内存远低于标准思维链跟踪。
整个过程在一个生成调用内完成,不需要重启、额外摘要器或编排层。模型自己分割、自己压缩、自己遮罩。
训练方法:课程很重要
训练数据是关键:需要大规模、高质量的思维链痕迹,分块标注,每块附带 memento。
他们先用 QwQ-32B 生成的 OpenThoughts-v3 轨迹作为基础,然后解决"如何切块"这个问题:直接让 LLM 做全局分割不 work——它不知道在哪儿切。他们把问题拆解:先切成原子单元(句子、代码块、公式),然后让 LLM 给每个句间边界打分(0=打断思维,3=自然停顿),再用动态规划在分数约束下决定实际切分位置。
压缩也用 LLM,但单次压缩 pass 只有 28% 的通过率。加了两轮 judge 反馈后升到 92%——judge 会给出具体可操作的意见(不是"需要更多细节",而是"缺少公式:K²−3K+3")。
最终数据集 OpenMementos 包含 22.8 万条标注轨迹,数学/代码/科学各占 54%/19%/27%,每个轨迹约压缩 6 倍(1.1 万 token 压到 2 千)。
课程分三阶段:第一阶段用标准因果注意力让模型学会格式;第二阶段引入硬遮罩,让模型被迫把关键信息压进 memento;第三阶段强化学习微调。
关键发现:30K 样本足够,非推理模型需要先做一轮标准推理 SFT。
精度损失不是本质问题
压缩后精度确实有下降,但分析表明主要原因是用其他模型(QwQ-32B)的推理轨迹做 SFT 本身带来的分布不匹配,而不是压缩本身。在相同控制条件下,压缩带来的额外精度损失很小,且随着模型规模扩大而缩小,RL 微调后完全弥补。
更重要的发现:被遮罩的块并没有真正消失——它的信息通过 KV 缓存状态向前泄漏,形成了一个隐式通道。禁用这个通道会导致 AIME'24 从 66.1% 跌到 50.8%,15 个百分点的差距说明这个隐式通道对精度贡献巨大。他们还用线性探针在 KV 表示中恢复了被遮罩块注入的随机密码——信息确实残留在 KV 状态里。
这意味着 KV 缓存不只是存储显式 token,它本身也是一个信息通道。
开源了什么
OpenMementos(22.8 万标注推理轨迹)、完整数据生成 pipeline、以及内置块遮罩功能的 vLLM fork。Stop flushing your KV cache——你的模型记得比你以为的更多。
Memento 最有趣的不是压缩效率,而是证明了"上下文管理"是一个可以被教会的技能,而不是模型天生就会或不会的东西。这和 Karpathy 的 Auto Research 是同一个思路的不同切片——不是建一套外部系统来管理记忆,而是让模型自己学会管理自己的内部状态。