【论文阅读】Agent 记忆机制(20):RecMem——只在信息反复出现时进行长期记忆巩固

文章目录

  • 前言
  • 零、论文基本信息
  • 一、背景与问题
    • [1. 长期对话记忆的构建成本](#1. 长期对话记忆的构建成本)
    • [2. 什么是积极记忆巩固](#2. 什么是积极记忆巩固)
    • [3. 为什么不需要处理每条交互](#3. 为什么不需要处理每条交互)
    • [4. 认知科学启发](#4. 认知科学启发)
  • 二、前置知识
    • [1. 问题设置:对话记忆](#1. 问题设置:对话记忆)
    • [2. 对话记忆与传统 RAG 的区别](#2. 对话记忆与传统 RAG 的区别)
    • [3. 记忆构建成本与查询成本](#3. 记忆构建成本与查询成本)
  • [三、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. 语义精炼)
    • [3. 为什么需要篇章作为参考](#3. 为什么需要篇章作为参考)
  • 七、问答阶段
    • [1. 三层记忆同时检索](#1. 三层记忆同时检索)
    • [2. 三层记忆的互补关系](#2. 三层记忆的互补关系)
  • 八、参数设置与方法讨论
    • [1. 相似度阈值](#1. 相似度阈值)
    • [2. 复现次数阈值](#2. 复现次数阈值)
    • [3. 为什么两个数据集使用不同阈值](#3. 为什么两个数据集使用不同阈值)
  • 九、实验设置
    • [1. 数据集](#1. 数据集)
    • [2. 对比方法](#2. 对比方法)
    • [3. 模型设置](#3. 模型设置)
    • [4. 评价指标](#4. 评价指标)
  • 十、实验结果与分析
    • [1. LoCoMo 结果](#1. LoCoMo 结果)
    • [2. 记忆构建成本](#2. 记忆构建成本)
    • [3. LongMemEval-S 结果](#3. LongMemEval-S 结果)
    • [4. 时间推理表现](#4. 时间推理表现)
    • [5. 构建成本与查询成本的区别](#5. 构建成本与查询成本的区别)
  • 十一、消融实验
    • [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 复制代码
原始信息全部保留;
高级记忆按需构建;
重复出现触发巩固;
摘要负责事件结构;
语义事实负责细节恢复。

零、论文基本信息


一、背景与问题

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 记忆才真正具备长期运行的工程价值。


参考资料

相关推荐
林间码客1 小时前
Langfuse:AI 应用的可观测性利器
人工智能·langfuse
三声三视1 小时前
DevEco Code 让 AI 写 ArkTS,enum 反向查表真机翻车——我换成 typeof + as const 后清净了
人工智能·harmonyos·arkts·鸿蒙
m沐沐1 小时前
【自然语言处理】NLP分词与Word2Vec词向量——从原理到实战
人工智能·深度学习·opencv·机器学习·计算机视觉·自然语言处理·word2vec
数聚天成DeepSData1 小时前
外贸海关进出口数据去哪免费下载?从统计到明细的查找指南
linux·服务器·开发语言·前端·网络·人工智能·自然语言处理
tntxia1 小时前
开源的使用AI的drawio绘制软件
人工智能
秦先生在广东1 小时前
`book-to-skill`:把技术书“编译“成 AI Agent 按需加载的结构化知识库
人工智能
东风破_1 小时前
百万字 EPUB 怎么做 RAG?用《天龙八部》跑通 Loader、Splitter、Milvus 与问答
人工智能
秦先生在广东1 小时前
Microsoft Agent Governance Toolkit:用确定性代码墙代替概率性提示词护栏
人工智能
菩提树下的打坐1 小时前
测试工程与 DevOps / SRE 的边界:三方协作的真实工作流
学习