文章目录
- 前言
- 零、论文基本信息
- 一、背景与问题
- 二、前置知识
- [三、RecMem 方法总览](#三、RecMem 方法总览)
- 四、核心模块详解
-
- [1. 潜意识记忆](#1. 潜意识记忆)
-
- [1.1 设计动机](#1.1 设计动机)
- [2. 交互单元的粒度](#2. 交互单元的粒度)
- [3. 原始交互的向量化存储](#3. 原始交互的向量化存储)
- [4. 基于复现的记忆巩固](#4. 基于复现的记忆巩固)
-
- [4.1 为什么使用复现信号](#4.1 为什么使用复现信号)
- [4.2 相似交互检索](#4.2 相似交互检索)
- [4.3 复现次数判断](#4.3 复现次数判断)
- [5. 一个三轮对话示例](#5. 一个三轮对话示例)
- 五、篇章记忆
-
- [1. 设计动机](#1. 设计动机)
- [2. Merge-First 策略](#2. Merge-First 策略)
- [3. 新篇章记忆生成](#3. 新篇章记忆生成)
- [4. 篇章记忆的优势与问题](#4. 篇章记忆的优势与问题)
- 六、语义记忆
- 七、问答阶段
-
- [1. 三层记忆同时检索](#1. 三层记忆同时检索)
- [2. 三层记忆的互补关系](#2. 三层记忆的互补关系)
- 八、参数设置与方法讨论
-
- [1. 相似度阈值](#1. 相似度阈值)
- [2. 复现次数阈值](#2. 复现次数阈值)
- [3. 为什么两个数据集使用不同阈值](#3. 为什么两个数据集使用不同阈值)
- 九、实验设置
-
- [1. 数据集](#1. 数据集)
- [2. 对比方法](#2. 对比方法)
- [3. 模型设置](#3. 模型设置)
- [4. 评价指标](#4. 评价指标)
-
- 问答准确率
- [Token 成本](#Token 成本)
- 十、实验结果与分析
- 十一、消融实验
-
- [1. 移除潜意识记忆](#1. 移除潜意识记忆)
- [2. 移除语义记忆](#2. 移除语义记忆)
- [3. 移除篇章记忆](#3. 移除篇章记忆)
- [4. 直接事实提取](#4. 直接事实提取)
- 十二、局限性与未来方向
-
- [1. 依赖人工设置阈值](#1. 依赖人工设置阈值)
- [2. 复现不完全等于重要性](#2. 复现不完全等于重要性)
- [3. Embedding 聚类错误](#3. Embedding 聚类错误)
- [4. LLM 摘要和事实提取仍然可能出错](#4. LLM 摘要和事实提取仍然可能出错)
- [5. 原始交互长期保存带来隐私风险](#5. 原始交互长期保存带来隐私风险)
- 十三、我的理解和启发
-
- [1. 记忆系统需要重新思考"什么时候处理"](#1. 记忆系统需要重新思考“什么时候处理”)
- [2. 原始层、事件层和事实层具有不同职责](#2. 原始层、事件层和事实层具有不同职责)
- [3. 重复出现可以作为记忆价值信号](#3. 重复出现可以作为记忆价值信号)
- [4. 复现信号应该与显著性信号结合](#4. 复现信号应该与显著性信号结合)
- [5. 记忆成本应该分阶段统计](#5. 记忆成本应该分阶段统计)
- [6. 与其他记忆方法的联系](#6. 与其他记忆方法的联系)
- 十四、总结
- 参考资料
前言
前面阅读 Mem0、A-MEM、MemoryOS 等 Agent 记忆方法时,我们主要关注的是:
text
如何从交互中提取事实?
如何更新已经发生变化的记忆?
如何组织记忆之间的关系?
如何从长期记忆中召回相关内容?
这些方法通常采用一种相对积极的记忆构建策略。
每当新的用户交互到来时,系统都会调用大模型:
text
读取当前交互
↓
提取事实或生成摘要
↓
与已有记忆比较
↓
执行新增、修改、合并或删除
↓
写入长期记忆库
这种策略的好处是很少遗漏信息,但也带来一个容易被忽视的问题:
长期记忆系统不仅在查询时消耗 Token,在构建记忆时同样会持续消耗 Token。
假设一个长期运行的个人助手每天处理 100 轮对话。如果每一轮交互都需要额外调用一次 LLM 提取记忆,那么系统每天就要执行 100 次记忆构建调用。
但这些交互并不都值得进行复杂处理。
例如:
text
用户:谢谢。
助手:不客气。
用户:今天天气不错。
助手:很适合出门散步。
用户:好的,我知道了。
助手:如果需要帮助可以继续告诉我。
这些内容可能没有长期价值,也不需要立即生成事实、事件摘要或知识图谱。
另一类信息虽然可能有用,但只出现了一次:
text
用户:我今天路过一家新的咖啡店。
系统可以先保存原始内容,等未来再次出现相关话题时,再判断它是否值得整理成稳定记忆。
例如,后续交互中用户又说:
text
我去了那家咖啡店;
那里的无乳糖拿铁不错;
我准备下周带朋友再去一次。
当同一主题反复出现时,系统才有足够信息判断:
text
这不是一次偶然提及,
而是一个持续发展的用户经历或偏好。
本文提出的 RecMem 正是从这个角度重新思考记忆构建:
不是每条交互都需要立即调用 LLM 进行记忆巩固,只有当语义相似的信息持续复现时,才值得将它们整理为更高层次的长期记忆。
RecMem 首先使用轻量 Embedding 将原始交互保存在"潜意识记忆"中。只有当相似主题出现达到一定次数时,系统才调用 LLM,生成:
- 描述事件演化过程的篇章记忆;
- 保存细粒度事实的语义记忆。
这种方式并不是删除不重要的信息。所有原始交互仍然保存在潜意识层,并且可以在问答阶段直接检索。
因此,RecMem 的核心贡献可以概括为:
text
原始信息全部保留;
高级记忆按需构建;
重复出现触发巩固;
摘要负责事件结构;
语义事实负责细节恢复。
零、论文基本信息
- 论文名称:RecMem: Recurrence-based Memory Consolidation for Efficient and Effective Long-Running LLM Agents
- 发表平台:ACL 2026 Findings
- 代码仓库:CaiusDai/RecMem
- 作者信息:Zijie Dai、Shiyuan Deng、Sheng Guan、Yizhou Tian、Xin Yao、Xiao Yan、James Cheng;作者来自香港中文大学、华为云、华为理论研究部、北京邮电大学和武汉大学
一、背景与问题
1. 长期对话记忆的构建成本
长期 Agent 需要持续接收新的交互,并根据历史信息回答未来问题。
例如,用户在几个月内陆续告诉助手:
text
3 月:
我准备给妹妹 Mia 订生日蛋糕。
4 月:
Mia 对花生过敏。
5 月:
我在考虑 SweetLeaf 的巧克力蛋糕。
6 月:
蛋糕上的文字准备写"Happy Birthday Mia"。
未来用户可能询问:
text
给 Mia 订蛋糕时,需要注意什么?
Agent 需要从多个时间点恢复:
- 用户要给妹妹 Mia 订蛋糕;
- Mia 对花生过敏;
- 用户考虑 SweetLeaf;
- 用户已经决定蛋糕文字。
这些信息不能只依赖当前上下文,因为长期对话可能已经超过模型的上下文窗口。
因此,系统需要在交互到来时构建长期记忆。
2. 什么是积极记忆巩固
当前很多记忆系统会处理每一轮新交互。
例如:
Mem0
text
新交互
→ 调用 LLM 提取原子事实
→ 与已有事实比较
→ ADD / UPDATE / DELETE / NONE
A-MEM
text
新交互
→ 生成记忆笔记
→ 提取属性和关键词
→ 寻找相关笔记
→ 建立新的关联
→ 更新邻居记忆
MemoryOS
text
新交互
→ 更新短期记忆
→ 整理中期记忆
→ 更新长期记忆和用户画像
这些系统的记忆结构不同,但具有一个共同特点:
每条交互都会触发或最终进入 LLM 驱动的记忆处理流程。
论文将这种方式称为 Eager Memory Consolidation,即积极记忆巩固。
3. 为什么不需要处理每条交互
对每条交互进行巩固可以避免遗漏,但并不一定具有最高的成本效益。
因为交互中可能包含:
- 寒暄;
- 临时状态;
- 重复表达;
- 无关噪声;
- 不会再次使用的信息;
- 只需要原文检索、不需要结构化的信息。
如果全部调用 LLM 处理,构建成本会随着交互数量近似线性增长。
text
交互越多
↓
记忆提取调用越多
↓
事实比较和更新越多
↓
长期运行成本持续积累
RecMem 认为,真正需要高级记忆巩固的通常是:
text
多次出现;
具有稳定主题;
跨时间形成关联;
包含足够丰富信息;
未来可能持续被使用。
4. 认知科学启发
RecMem 借鉴了认知科学中的多存储理论和互补学习系统。
其核心观点是:
text
孤立经历首先进入快速、临时的记忆系统;
反复出现的模式才会逐渐巩固为稳定长期记忆。
人在第一次遇到某件事情时,不一定立即形成高度抽象的长期知识。但当类似经历不断复现时,大脑会逐渐发现其中的稳定规律。
RecMem 将这一过程映射到 Agent 记忆:
| 人类记忆概念 | RecMem 对应模块 |
|---|---|
| 尚未巩固的原始经历 | 潜意识记忆 |
| 带有时间和事件过程的经历 | 篇章记忆 |
| 稳定事实、偏好和关系 | 语义记忆 |
| 重复激活促进长期巩固 | 基于复现的触发机制 |
二、前置知识
1. 问题设置:对话记忆
论文研究的是流式到达的长期对话记忆。
在时间步 t t t,系统已经观察到的交互历史表示为:
O 1 : t = { o 1 , o 2 , ... , o t } \mathcal{O}_{1:t}=\{o_1,o_2,\ldots,o_t\} O1:t={o1,o2,...,ot}
其中,每条消息可以表示为:
o t = ( s t , x t , τ t ) o_t=(s_t,x_t,\tau_t) ot=(st,xt,τt)
这里:
- s t s_t st 表示说话者,可以是用户或助手;
- x t x_t xt 表示消息内容;
- τ t \tau_t τt 表示消息发生的时间。
当用户提出新问题 q q q 时,系统需要从由历史交互构建的外部记忆中召回相关证据,再生成回答。
2. 对话记忆与传统 RAG 的区别
传统 RAG 通常面对预先准备好的静态知识库:
text
文档预处理
→ 文本切块
→ 建立向量索引
→ 用户查询
→ 召回相关文本
长期对话记忆则是一个在线问题:
text
交互不断到来;
用户状态持续变化;
新事实可能覆盖旧事实;
不同时间的信息需要建立关联;
记忆库需要边运行边更新。
因此,对话记忆的核心问题不仅是如何检索,还包括:
如何从持续到来的交互中构建和更新底层记忆。
3. 记忆构建成本与查询成本
论文将 Token 成本分成两个阶段。
记忆构建成本
指新交互进入系统时,为了生成摘要、提取事实和更新记忆所消耗的 LLM Token。
text
新交互到来
→ 记忆提取
→ 记忆比较
→ 记忆更新
查询成本
指用户提出问题后,为检索和回答问题消耗的 Token。
text
用户问题
→ 召回记忆
→ 拼接上下文
→ 生成答案
很多研究只关注查询阶段的上下文长度,却忽略了构建记忆也可能成为持续成本。
对于长期运行的 Agent,构建操作发生在每一次交互到来时,因此其累计成本可能超过查询成本。
三、RecMem 方法总览
为了理解 RecMem 与积极巩固方法的区别,可以先看论文 Figure 1(b)。

图源:论文 Figure 1(b)。
原始交互首先进入潜意识记忆。只有当相似主题持续复现时,系统才调用 LLM,生成篇章记忆和语义记忆。
RecMem 由三个记忆层组成:
text
潜意识记忆
↓ 主题持续复现
篇章记忆
↓ 细节恢复与事实维护
语义记忆
但这不是简单的单向流水线。
在问答阶段,系统会同时从三个记忆层检索:
text
用户问题
├── 检索潜意识记忆:原始交互
├── 检索篇章记忆:事件过程
└── 检索语义记忆:细粒度事实
↓
合并检索上下文
↓
LLM 回答
三个记忆层的分工如下:
| 记忆层 | 保存内容 | 构建方式 | 主要作用 |
|---|---|---|---|
| 潜意识记忆 | 原始用户-助手交互 | Embedding,无需 LLM | 完整保留原始证据 |
| 篇章记忆 | 带时间顺序的事件叙述 | LLM 总结与合并 | 建立跨轮次事件结构 |
| 语义记忆 | 原子事实、偏好、约束和关系 | LLM 语义精炼 | 保存摘要遗漏的细节 |
RecMem 的完整写入流程为:
text
新的用户-助手交互到来
↓
组成一个完整交互单元
↓
使用轻量模型生成 Embedding
↓
写入潜意识向量数据库
↓
检索语义相似的历史交互
↓
相似数量是否达到复现阈值?
├── 否:结束,不调用 LLM
└── 是:触发高级记忆巩固
↓
生成或合并篇章记忆
↓
恢复细节并生成语义事实
四、核心模块详解
1. 潜意识记忆
1.1 设计动机
如果不对每条交互进行 LLM 处理,就必须保证没有被巩固的信息不会丢失。
因此,RecMem 设置了一个低成本的潜意识层,完整保存原始交互。
潜意识层具有两个作用:
text
作用一:
保存所有原始证据,避免选择性巩固造成信息丢失。
作用二:
通过相似度检索判断某个主题是否持续复现。
2. 交互单元的粒度
RecMem 不把单独一条用户消息或助手消息视为完整记忆,而是把一轮用户-助手对话作为原子单元。
多轮历史表示为:
H t = ( u 1 , u 2 , ... , u t ) \mathcal{H}_t=(u_1,u_2,\ldots,u_t) Ht=(u1,u2,...,ut)
其中:
u i = ( m i u s r , m i a s t , τ i ) u_i=(m_i^{usr},m_i^{ast},\tau_i) ui=(miusr,miast,τi)
这里:
- m i u s r m_i^{usr} miusr 是用户消息;
- m i a s t m_i^{ast} miast 是助手回复;
- τ i \tau_i τi 是这一轮交互的时间。
这样做是因为助手回复通常依赖用户问题。
如果只保存:
text
助手:建议先确认是否含有花生成分。
这句话缺少上下文,很难知道它讨论的是药品、蛋糕还是餐厅。
保存完整交互后:
text
用户:给花生过敏的妹妹订蛋糕时要注意什么?
助手:建议先确认蛋糕胚、奶油和装饰是否含有花生成分。
Embedding 的语义会更加完整。
3. 原始交互的向量化存储
每个交互单元都会生成一个潜意识记忆单元:
s i = ( v i , u i ) , v i = Φ ( u i ) s_i=(v_i,u_i),\quad v_i=\Phi(u_i) si=(vi,ui),vi=Φ(ui)
其中:
- u i u_i ui 是原始用户-助手交互;
- Φ ( ⋅ ) \Phi(\cdot) Φ(⋅) 是 Embedding 模型;
- v i v_i vi 是该交互的向量;
- s i s_i si 是最终保存到潜意识层的记忆单元。
所有潜意识记忆都存入向量数据库 S s u b \mathcal{S}_{sub} Ssub。
这一过程不调用生成式 LLM,只需要轻量 Embedding,因此成本相对较低。
4. 基于复现的记忆巩固
4.1 为什么使用复现信号
一条信息多次以相似语义出现,通常意味着它:
- 是一个持续发展的主题;
- 与用户具有稳定关系;
- 包含可以跨时间关联的信息;
- 未来更可能被询问;
- 已经积累了足够内容进行总结。
因此,RecMem 将语义复现作为高级记忆巩固的触发信号。
4.2 相似交互检索
当新交互 s i s_i si 到来时,系统首先从潜意识记忆中检索与其最相似的 Top-K 条交互,得到候选集合 N i \mathcal{N}_i Ni。
随后根据余弦相似度阈值过滤:
R i = { s j ∈ N i ∣ cos ( v i , v j ) ≥ θ s i m } \mathcal{R}_i=\{s_j\in\mathcal{N}i\mid \cos(v_i,v_j)\geq\theta{sim}\} Ri={sj∈Ni∣cos(vi,vj)≥θsim}
其中:
- θ s i m \theta_{sim} θsim 是语义相似度阈值;
- R i \mathcal{R}_i Ri 是真正被认为属于相同主题的交互集合。
4.3 复现次数判断
只有当相关交互数量达到阈值时,才触发记忆巩固:
∣ R i ∣ ≥ θ c o u n t |\mathcal{R}i|\geq\theta{count} ∣Ri∣≥θcount
如果满足条件,系统将相关历史交互与当前交互组成一个语义簇:
C i = R i ∪ { s i } \mathcal{C}_i=\mathcal{R}_i\cup\{s_i\} Ci=Ri∪{si}
随后调用 LLM 生成高级记忆。
如果不满足条件:
text
当前交互只保留在潜意识层;
不生成摘要;
不提取事实;
不调用生成式 LLM。
5. 一个三轮对话示例
论文 Appendix B 使用了一个蛋糕订购示例。为了方便理解,示例将复现阈值设置为 2。
第一轮:首次出现蛋糕主题
text
用户:
我准备给妹妹订生日蛋糕,有什么建议?
助手:
可以先确认口味、过敏信息、蛋糕尺寸和取货日期。
处理过程:
text
生成 Embedding;
保存到潜意识记忆;
"蛋糕"主题只出现一次;
不触发 LLM 巩固。
第二轮:切换到无关话题
text
用户:
深色牛仔裤应该怎么清洗?
助手:
建议冷水反洗,并避免长时间浸泡。
处理过程:
text
保存到潜意识记忆;
与蛋糕主题相似度不足;
仍然不触发巩固。
第三轮:蛋糕主题再次出现
text
用户:
Mia 对花生过敏,我准备在 SweetLeaf 订蛋糕。
助手:
应该提前确认店内是否存在花生交叉污染。
处理过程:
text
检索到第一轮蛋糕交互;
相似度超过阈值;
蛋糕主题达到复现次数;
触发高级记忆巩固。
系统随后生成两种高级记忆。
篇章记忆:
text
用户正在为妹妹 Mia 准备生日蛋糕。
用户咨询过蛋糕口味、尺寸、取货时间和过敏安全问题,
并计划从 SweetLeaf 订购。
语义记忆:
text
用户有一个名叫 Mia 的妹妹。
Mia 对花生过敏。
用户计划从 SweetLeaf 订购生日蛋糕。
篇章记忆保存事件过程,语义记忆保存可以被精确检索的事实。
五、篇章记忆
1. 设计动机
相似交互达到复现阈值后,系统已经拥有了多条围绕同一主题的历史信息。
如果仍然只保存原始交互,未来查询时可能需要读取多轮内容。篇章记忆将这些交互整理成具有时间顺序的事件叙述。
它重点回答:
text
发生了什么?
事情如何发展?
不同时间的信息有什么联系?
当前事件处于什么状态?
2. Merge-First 策略
当新交互到来时,RecMem 会先检查篇章记忆中是否已经存在相似事件。
系统检索最接近的篇章记忆 E ∗ E^* E∗。如果相似度足够高,就直接在原位置更新:
E ∗ ← L L M m e r g e ( E ∗ , u i ) , cos ( v i , v E ∗ ) ≥ θ s i m E^*\leftarrow LLM_{merge}(E^*,u_i),\quad \cos(v_i,v_{E^*})\geq\theta_{sim} E∗←LLMmerge(E∗,ui),cos(vi,vE∗)≥θsim
也就是说,如果"给 Mia 订蛋糕"已经存在篇章记忆,新交互不会再创建一个平行事件,而是合并到原有叙述中。
这样可以避免:
text
Mia 蛋糕计划 1;
Mia 蛋糕计划 2;
Mia 过敏提醒;
SweetLeaf 订购计划;
蛋糕取货安排。
被分散成多个互不关联的篇章。
优化后,它们可以保持为一条持续更新的事件叙述。
3. 新篇章记忆生成
如果不存在可以直接合并的篇章记忆,系统会等待复现触发。
触发后,RecMem 会:
text
收集语义簇中的原始交互;
按照时间戳重新排序;
使用固定模板格式化;
调用 LLM 生成连贯事件叙述;
必要时将混合主题拆分成多个篇章。
需要注意的是,这里不是简单地压缩原文。
LLM 需要执行的是归纳组织:
- 识别交互的共同主题;
- 恢复事件时间顺序;
- 描述状态如何变化;
- 区分不同子主题;
- 保留重要的时间信息。
4. 篇章记忆的优势与问题
篇章记忆适合回答:
text
用户准备生日蛋糕的过程是什么?
用户的旅行计划发生过哪些变化?
某个项目问题是如何被解决的?
但摘要越长、合并次数越多,就越容易变得宽泛。
例如:
text
用户曾多次讨论妹妹的生日蛋糕,
包括口味、商店、过敏和取货安排。
它保留了整体事件,却可能遗漏:
text
妹妹叫 Mia;
Mia 对花生过敏;
商店名称是 SweetLeaf;
蛋糕上的文字是什么。
因此,RecMem 还需要语义记忆恢复细节。
六、语义记忆
1. 设计动机
篇章摘要主要保存事件结构,但在压缩过程中可能丢失对问答非常关键的细粒度事实。
RecMem 的语义记忆用于保存:
- 用户偏好;
- 稳定约束;
- 实体关系;
- 具体名称;
- 时间事实;
- 一般知识;
- 持续变化的用户状态。
与篇章记忆相比,语义记忆更加原子化。
2. 语义精炼
RecMem 没有直接从原始交互中独立提取事实,而是同时参考:
- 原始交互集合 U C \mathcal{U}_C UC;
- 已生成的篇章记忆 E E E;
- 已有的相关语义事实 V \mathcal{V} V。
系统先检索相关历史事实:
V = T o p K k ( S s e m , Φ ( E ) ) \mathcal{V}=TopK_k(\mathcal{S}_{sem},\Phi(E)) V=TopKk(Ssem,Φ(E))
然后调用语义精炼器:
M i s e m = L L M r e f i n e ( E , U C , V ) \mathcal{M}i^{sem}=LLM{refine}(E,\mathcal{U}_C,\mathcal{V}) Misem=LLMrefine(E,UC,V)
语义精炼包含两个并行任务。
细节恢复
比较篇章摘要和原始交互,寻找被摘要省略的重要内容:
text
具体人名;
商店名称;
过敏信息;
日期;
数量;
用户明确表达的偏好。
事实维护
将新事实与已有语义记忆比较:
text
重复事实:
不再次写入。
状态发生变化:
更新已有事实。
存在冲突:
根据时间信息保留最新状态。
全新事实:
创建新的语义记忆。
3. 为什么需要篇章作为参考
直接从原始对话提取事实,容易得到大量彼此孤立的信息。
篇章记忆提供了一个事件级参照,使语义精炼器能够判断:
text
摘要保留了什么?
摘要遗漏了什么?
哪些细节对当前事件真正重要?
哪些事实已经存在?
哪些事实发生了变化?
因此,篇章记忆和语义记忆并不是简单重复。
二者的关系是:
text
篇章记忆:
提供高层事件结构。
原始交互:
提供完整证据。
已有语义记忆:
提供历史事实状态。
语义精炼:
找出摘要遗漏的关键细节,
并维护稳定、可精确检索的事实。
七、问答阶段
1. 三层记忆同时检索
当用户提出问题 q q q 时,RecMem 首先生成查询向量:
v q = Φ ( q ) v_q=\Phi(q) vq=Φ(q)
随后分别从三个记忆层召回内容:
text
潜意识记忆:
召回相关原始交互。
篇章记忆:
召回相关事件叙述。
语义记忆:
召回相关原子事实。
默认检索预算为:
| 记忆层 | 默认数量 |
|---|---|
| 潜意识记忆 | 10 |
| 篇章记忆 | 5 |
| 语义记忆 | 10 |
论文设置:
k s e m = 2 k e p i k_{sem}=2k_{epi} ksem=2kepi
这样设计是因为一个篇章可能对应多个细粒度事实,语义记忆需要更大的召回预算。
2. 三层记忆的互补关系
假设问题是:
text
Mia 对什么过敏?
最有用的可能是语义记忆:
text
Mia 对花生过敏。
如果问题是:
text
用户为 Mia 准备蛋糕的过程是什么?
最有用的可能是篇章记忆。
如果问题询问一条只出现过一次、没有触发巩固的信息:
text
用户当时提到的蛋糕文字是什么?
系统仍然可以从潜意识记忆中召回原始交互。
因此,潜意识层并不是只用于构建高级记忆,它也是问答阶段的重要证据来源。
八、参数设置与方法讨论
1. 相似度阈值
θ s i m \theta_{sim} θsim 决定多相似的交互可以被视为同一主题。
阈值过低:
text
不相关交互被错误聚类;
主题内部噪声增加;
篇章总结缺少一致性。
阈值过高:
text
同一主题被拆成多个小簇;
复现信号难以积累;
高级记忆巩固被推迟或无法触发。
论文在 LoCoMo 中使用 0.7,在 LongMemEval-S 中使用 0.6。
2. 复现次数阈值
θ c o u n t \theta_{count} θcount 决定一个主题出现多少次后触发高级巩固。
阈值较低:
- 更早调用 LLM;
- 记忆覆盖率更高;
- 构建成本更高;
- 每次巩固包含的信息较少。
阈值较高:
- LLM 调用次数更少;
- 构建成本更低;
- 更偏向高频稳定主题;
- 低频主题可能长期不被巩固。
论文在 LoCoMo 中使用 5,在 LongMemEval-S 中使用 4。
这是一个典型的质量与成本权衡,而不是越大或越小越好。
3. 为什么两个数据集使用不同阈值
LoCoMo 主要是开放式社交对话,平均约 16K Token,主题相对分散,因此使用更保守的:
text
相似度阈值:0.7
复现阈值:5
LongMemEval-S 更偏向任务型交互,平均约 115K Token,信息密度和长期依赖更高,因此使用:
text
相似度阈值:0.6
复现阈值:4
这会让系统更积极地捕获任务过程中的细微关联。
九、实验设置
1. 数据集
LoCoMo
LoCoMo 包含长期、多会话的社交陪伴式对话。
- 10 组长对话;
- 平均约 16K Token;
- 涵盖单跳、多跳、时间推理和开放域问题;
- 重点评估个人经历和生活事件记忆。
LongMemEval-S
LongMemEval-S 更接近长期运行的任务助手。
- 500 组对话;
- 平均约 115K Token;
- 包含单用户、单助手、偏好、时间推理、知识更新和多会话问题;
- 对长上下文和持续状态维护要求更高。
2. 对比方法
| 方法 | 核心机制 |
|---|---|
| Full Context | 将完整历史直接放入上下文 |
| Naive RAG | 对历史切块并进行向量检索 |
| Mem0 | 每轮提取原子事实并执行生命周期更新 |
| A-MEM | 将交互组织为具有动态链接的记忆笔记 |
| MemoryOS | 使用短期、中期和长期层级管理记忆 |
| RecMem | 根据语义复现按需构建篇章和语义记忆 |
3. 模型设置
实验使用两个不同的 LLM 后端:
- GPT-4o-mini;
- GPT-4.1-mini。
向量模型使用:
text
text-embedding-3-small
所有生成调用的温度设置为 0。
每项任务结果取三次运行的平均值。
4. 评价指标
论文从两个维度评价记忆系统。
问答准确率
主要使用 GPT-4o-mini 作为 LLM Judge,判断生成答案是否正确。
论文同时在附录报告 F1,但认为字符或 Token 重叠可能低估同义改写的正确答案,因此将 LLM Judge 作为主要指标。
Token 成本
分别统计:
- 每组对话的平均记忆构建 Token;
- 每个问题的平均查询 Token。
这种拆分能够区分:
text
记忆写入是否昂贵;
记忆查询是否昂贵。
十、实验结果与分析
1. LoCoMo 结果
下面保留 GPT-4.1-mini 下的整体准确率和 Token 成本。
| 方法 | 整体准确率 | 构建 Token | 查询 Token |
|---|---|---|---|
| Full Context | 84.18 | 0 | 31.52K |
| Naive RAG | 54.42 | 0 | 6.28K |
| MemoryOS | 67.60 | 400.7K | 5.04K |
| Mem0 | 62.92 | 1520.8K | 2.11K |
| A-MEM | 68.83 | 1459.93K | 5.56K |
| RecMem | 81.10 | 193.2K | 2.75K |
在 LoCoMo 上,Full Context 的准确率略高于 RecMem。
这是因为 LoCoMo 的平均长度约为 16K Token,完整历史仍然可以放入上下文,因此 Full Context 保留了全部信息。
但 Full Context 每个问题需要消耗约 31.52K 查询 Token,而 RecMem 只需要约 2.75K。
在真正的记忆系统中,RecMem 的整体准确率最高。
2. 记忆构建成本
在 GPT-4.1-mini + LoCoMo 设置中:
text
Mem0:
1520.8K 构建 Token。
A-MEM:
1459.93K 构建 Token。
MemoryOS:
400.7K 构建 Token。
RecMem:
193.2K 构建 Token。
相对于 Mem0,RecMem 减少约 87.3% 的构建 Token。
相对于 A-MEM,减少约 86.8%。
这说明大部分交互不需要立即调用 LLM 提取高级记忆。
只在主题复现后进行巩固,可以显著减少构建阶段成本。
3. LongMemEval-S 结果
GPT-4.1-mini 下的结果为:
| 方法 | 整体准确率 | 构建 Token | 查询 Token |
|---|---|---|---|
| Full Context | 66.20 | 0 | 112.25K |
| Naive RAG | 67.00 | 0 | 11.93K |
| MemoryOS | 74.40 | 669.22K | 9.19K |
| Mem0 | 71.20 | 1626.54K | 2.00K |
| A-MEM | 71.60 | 1264.25K | 15.46K |
| RecMem | 76.80 | 365.49K | 5.89K |
在更长的 LongMemEval-S 中,RecMem 的整体准确率超过了所有方法,包括 Full Context。
相对于 Mem0,RecMem 的构建成本减少约 77.5%;相对于 A-MEM,减少约 71.1%。
Full Context 的问题在该数据集上更加明显:
text
每个问题平均需要约 112.25K Token;
信息过长可能出现 Lost-in-the-Middle;
即使证据位于上下文中,模型也不一定能有效使用。
4. 时间推理表现
RecMem 在 LongMemEval-S 的时间推理任务上表现尤其明显。
GPT-4.1-mini 下:
| 方法 | 时间推理准确率 |
|---|---|
| Full Context | 48.12 |
| Naive RAG | 45.86 |
| MemoryOS | 54.89 |
| Mem0 | 62.41 |
| A-MEM | 52.63 |
| RecMem | 68.42 |
论文认为,这主要来自两个机制。
跨时间语义聚类
同一主题的交互即使相隔很远,也可以通过潜意识层的相似度被聚到一起。
按时间戳重新排序
生成篇章记忆前,系统会将相关交互按照时间重新排序,从而恢复事件演变顺序。
此外,语义精炼会保存具有时间锚点的事实,避免摘要压缩掉关键变化。
5. 构建成本与查询成本的区别
RecMem 的主要优势来自构建阶段,而不是查询阶段召回更少内容。
查询阶段,各记忆系统通常都会召回有限数量的证据,因此 Token 规模相对接近。
构建阶段的差异则会随交互数量持续积累:
text
积极巩固:
每轮交互都调用 LLM。
RecMem:
每轮只计算 Embedding;
主题达到复现条件后才调用 LLM。
对于每天持续接收大量信息的长期 Agent,构建成本可能比单次查询成本更加重要。
十一、消融实验
论文 Figure 2 使用 GPT-4.1-mini 在 LoCoMo 上进行消融。

图源:论文 Figure 2。
完整 RecMem 得分为 81.10。移除潜意识、语义或篇章记忆都会导致性能下降。
具体结果为:
| 配置 | 整体得分 |
|---|---|
| 移除潜意识记忆 | 51.88 |
| 移除语义记忆 | 70.58 |
| 直接事实提取 | 74.22 |
| 移除篇章记忆 | 79.94 |
| 完整 RecMem | 81.10 |
1. 移除潜意识记忆
得分从 81.10 下降到 51.88,是幅度最大的下降。
原因是潜意识层保存了所有原始交互。
没有达到复现阈值的信息只存在于潜意识层。如果移除该层,这些一次性信息就无法在问答阶段被召回。
这说明潜意识记忆不是可有可无的临时缓冲区,而是整个系统的原始证据层。
2. 移除语义记忆
移除语义记忆后,得分下降到 70.58。
篇章摘要虽然能保存事件结构,但很难完整保留:
- 人名;
- 数字;
- 具体约束;
- 偏好;
- 时间点;
- 实体关系。
因此,语义记忆对细粒度问答具有重要作用。
3. 移除篇章记忆
移除篇章记忆后,得分只从 81.10 降到 79.94。
这并不代表篇章记忆没有作用。
原因是:
- 潜意识层仍然保留原文;
- 语义记忆仍然保存关键事实;
- 很多问题可以通过事实直接回答。
但篇章记忆对跨轮次事件关联和语义精炼仍然重要。
4. 直接事实提取
直接事实提取版本不使用篇章摘要作为参照,而是直接从原始对话提取语义事实,得分为 74.22。
它低于"移除篇章记忆"的 79.94,也明显低于完整 RecMem。
这说明篇章记忆的价值不仅体现在问答阶段的直接召回,也体现在构建语义记忆时提供事件上下文。
语义精炼回答的不是简单的:
text
原文中有哪些事实?
而是:
text
结合事件摘要来看,
哪些重要细节在摘要中被遗漏了?
哪些事实值得独立保存?
十二、局限性与未来方向
1. 依赖人工设置阈值
RecMem 使用两个固定阈值:
- 语义相似度阈值;
- 复现次数阈值。
不同领域的信息密度不同,需要重新调整。
例如:
text
社交对话:
主题分散,噪声较多,
适合更保守的巩固策略。
代码 Agent:
错误、文件和依赖关系反复出现,
可能需要更积极的巩固策略。
未来可以根据用户行为、记忆规模和任务反馈动态学习触发条件。
2. 复现不完全等于重要性
RecMem 假设值得形成高级记忆的信息通常会重复出现。
这一假设适用于:
- 用户长期偏好;
- 持续项目;
- 反复出现的实体;
- 多次讨论的生活事件。
但有些信息只出现一次,却非常重要:
text
用户对青霉素严重过敏;
禁止执行生产数据库删除操作;
本任务不得向外部服务上传数据;
唯一的一次安全告警。
这些信息可能永远不会达到复现阈值。
虽然原始内容仍保存在潜意识层,可以通过检索找回,但它无法获得篇章关联和语义精炼。
实际系统可以增加一条独立的显著性通道:
text
满足复现条件:
触发巩固。
或者具有高风险、高约束、高价值:
立即触发巩固。
3. Embedding 聚类错误
复现判断依赖向量相似度。
如果 Embedding 将不同主题错误聚在一起,篇章记忆可能混入无关内容;如果同一主题的表达差异较大,也可能无法形成复现信号。
例如:
text
"我不能喝牛奶"
与
"乳糖会让我不舒服"
语义相关,但使用不同表达。
因此,系统表现也取决于 Embedding 模型和相似度空间的质量。
4. LLM 摘要和事实提取仍然可能出错
RecMem 减少了 LLM 调用次数,但没有消除 LLM 提取错误。
篇章合并可能:
- 遗漏状态变化;
- 混淆人物;
- 错误排序事件;
- 将不确定信息写成事实。
语义精炼也可能生成原文中不存在的关系。
因此,实际部署还需要:
- 保存来源引用;
- 记录记忆生成时间;
- 允许回溯原始交互;
- 对高风险事实执行验证;
- 提供用户删除和纠错能力。
5. 原始交互长期保存带来隐私风险
潜意识层会完整保存用户和助手的原始交互。
这为问答提供了可靠兜底,但也增加了:
- 隐私泄露;
- 越权访问;
- 敏感信息长期留存;
- 记忆投毒;
- Prompt Injection 持久化。
实际系统需要增加:
- 数据访问控制;
- 用户可控的删除策略;
- 记忆保留期限;
- 敏感信息脱敏;
- 租户和用户隔离;
- 写入内容安全检查。
十三、我的理解和启发
1. 记忆系统需要重新思考"什么时候处理"
过去设计记忆系统时,我们通常讨论:
text
提取什么?
保存成什么结构?
如何检索?
如何更新?
RecMem 增加了一个更基础的问题:
这条交互现在真的需要调用 LLM 处理吗?
对于长期系统来说,一次记忆提取消耗可能不高,但每天、每月持续处理所有交互后,构建成本会非常可观。
因此,记忆系统应该把调用 LLM 视为一种需要预算控制的操作。
2. 原始层、事件层和事实层具有不同职责
RecMem 的三层结构很适合实际 Agent:
text
原始层:
保证信息不丢失。
事件层:
描述事情如何发展。
事实层:
保存可以精确检索的结论。
例如,代码 Agent 可以设计为:
text
潜意识记忆:
原始命令、错误日志和工具输出。
篇章记忆:
某次 Bug 的完整诊断和修复过程。
语义记忆:
项目使用 Python 3.12;
Redis 端口为 6379;
禁止修改生产数据库;
某个错误由依赖版本不兼容导致。
三种记忆不能简单互相替代。
3. 重复出现可以作为记忆价值信号
如果某个错误、需求或实体不断出现,通常说明它值得被提升为高级记忆。
例如,代码 Agent 多次遇到:
text
ModuleNotFoundError: package_x
第一次出现时:
text
只保存原始错误和处理过程。
多次出现后:
text
生成篇章记忆:
该错误在多个环境中出现,最终定位为虚拟环境未激活。
生成语义记忆:
运行项目命令前必须激活 .venv;
package_x 安装在项目虚拟环境中。
这种机制可以避免为每条终端输出都调用 LLM,同时逐渐形成可复用经验。
4. 复现信号应该与显著性信号结合
RecMem 使用"出现频率"判断是否巩固,但实际工程中,我更倾向于组合多个信号:
text
复现信号:
是否多次出现相似内容?
显著性信号:
是否涉及安全、权限、隐私和硬性约束?
任务信号:
是否影响任务成功?
使用信号:
这条原始记忆是否被多次检索?
反馈信号:
它是否帮助 Agent 修复错误或完成任务?
可以形成:
text
巩固分数
= 复现程度
+ 任务重要性
+ 检索使用次数
+ 风险权重
+ 用户显式要求
这样既能保留 RecMem 的成本优势,也能避免遗漏只出现一次的重要信息。
5. 记忆成本应该分阶段统计
RecMem 提醒我们,评价记忆系统时不能只统计最终回答用了多少 Token。
至少应该分别统计:
| 阶段 | 成本 |
|---|---|
| 写入 | 原始交互保存成本 |
| 构建 | 摘要、事实提取和结构更新成本 |
| 维护 | 合并、删除和离线整理成本 |
| 检索 | 查询和排序成本 |
| 回答 | 拼接记忆后的生成成本 |
一个查询阶段很便宜的系统,可能在每次写入时进行了多次 LLM 调用。
如果不统计完整生命周期成本,就无法判断它是否适合生产级长期 Agent。
6. 与其他记忆方法的联系
| 方法 | 核心问题 |
|---|---|
| Mem0 | 事实记忆应该新增、更新、删除还是忽略 |
| A-MEM | 记忆如何自主建立链接 |
| MemoryOS | 记忆如何在不同层级间迁移 |
| MemCon | 当前状态下应该执行哪种记忆操作 |
| AutoMem | 如何自动优化记忆结构并训练记忆能力 |
| RecMem | 什么时候值得调用 LLM 进行高级记忆巩固 |
RecMem 与 MemCon 都在讨论"什么时候使用昂贵的记忆操作",但切入点不同。
text
MemCon:
在 Agent 决策阶段学习何时检索、注入计划和整理记忆。
RecMem:
在交互写入阶段根据主题复现决定何时进行高级巩固。
AutoMem 则更进一步,尝试从完整轨迹中自动优化记忆工具和模型使用记忆的能力。
这三种方法可以组合成一个更完整的系统:
text
RecMem:
控制什么时候构建高级记忆。
MemCon:
控制什么时候、如何召回和使用记忆。
AutoMem:
根据长期轨迹优化整个记忆脚手架和记忆操作能力。
十四、总结
RecMem 重新思考了长期 Agent 记忆系统中的一个基础问题:
是否需要为每条新交互都调用 LLM 构建长期记忆?
它的答案是否定的。
RecMem 使用三层记忆架构:
text
潜意识记忆:
低成本保存全部原始交互。
篇章记忆:
在主题持续复现后,整理跨时间事件。
语义记忆:
恢复摘要遗漏的细粒度事实。
其核心流程是:
text
新交互到来
↓
生成 Embedding 并保存原文
↓
检索语义相似的历史交互
↓
判断相似主题是否持续复现
↓
只有达到阈值时才调用 LLM
↓
生成篇章记忆和语义记忆
实验表明,RecMem 在 LoCoMo 和 LongMemEval-S 上明显降低了记忆构建成本。在 GPT-4.1-mini + LoCoMo 设置中,它相对于 Mem0 减少约 87.3% 的构建 Token,同时取得更高的整体准确率。
消融实验说明三个记忆层具有明确分工:
- 潜意识层提供完整原始证据;
- 篇章层建立事件和时间关系;
- 语义层保存精确事实;
- 语义精炼利用篇章作为参照恢复遗漏细节。
这篇论文给实际 Agent 开发带来的核心启发是:
长期记忆不应该在信息到来时立即对所有内容进行同等强度的处理,而应该先低成本保存,再根据复现、价值和风险选择性地提升为高级记忆。
记忆系统的关键不只是"记住什么",还有:
text
什么时候只保留原文?
什么时候值得进行摘要?
什么时候需要提取稳定事实?
什么时候一次性信息也必须立即进入长期记忆?
只有同时考虑准确率、信息完整性和完整生命周期成本,Agent 记忆才真正具备长期运行的工程价值。
参考资料
- Zijie Dai, Shiyuan Deng, Sheng Guan, et al. RecMem: Recurrence-based Memory Consolidation for Efficient and Effective Long-Running LLM Agents. ACL 2026 Findings.
- RecMem 代码仓库