【论文阅读】Agent 记忆机制(27):MemRefine——用 LLM 事实判断将长期记忆压缩到固定预算

文章目录

  • 前言
  • 零、论文基本信息
  • 一、背景与问题
    • [1. 长期记忆为什么会无限增长](#1. 长期记忆为什么会无限增长)
      • [1.1 存储成本持续增长](#1.1 存储成本持续增长)
      • [1.2 检索噪声增加](#1.2 检索噪声增加)
    • [2. 什么是存储预算约束下的记忆管理](#2. 什么是存储预算约束下的记忆管理)
    • [3. 为什么这是查询无关压缩](#3. 为什么这是查询无关压缩)
  • 二、相关工作
    • [1. Agent 长期记忆](#1. Agent 长期记忆)
      • [1.1 外部记忆与多会话交互](#1.1 外部记忆与多会话交互)
    • [2. 记忆和上下文压缩](#2. 记忆和上下文压缩)
      • [2.1 写入前的对话摘要](#2.1 写入前的对话摘要)
      • [2.2 推理时上下文压缩](#2.2 推理时上下文压缩)
      • [2.3 基于结构的图剪枝](#2.3 基于结构的图剪枝)
    • [3. MemRefine 的定位](#3. MemRefine 的定位)
  • [三、MemRefine 方法](#三、MemRefine 方法)
    • [1. 方法总览](#1. 方法总览)
    • [2. 问题形式化](#2. 问题形式化)
    • [3. 存储预算目标](#3. 存储预算目标)
    • [4. 为什么不能直接优化该目标](#4. 为什么不能直接优化该目标)
  • 四、为什么使用成对判断
    • [1. 单条记忆重要性评分的问题](#1. 单条记忆重要性评分的问题)
    • [2. 三类事实关系](#2. 三类事实关系)
      • [2.1 冗余关系](#2.1 冗余关系)
      • [2.2 互补关系](#2.2 互补关系)
      • [2.3 独立关系](#2.3 独立关系)
    • [3. 方法流程图](#3. 方法流程图)
  • [五、MemRefine 核心流程](#五、MemRefine 核心流程)
    • [1. 候选记忆对选择](#1. 候选记忆对选择)
    • [2. LLM Judge](#2. LLM Judge)
    • [3. DELETE 操作](#3. DELETE 操作)
    • [4. MERGE 操作](#4. MERGE 操作)
    • [5. PRESERVE 操作](#5. PRESERVE 操作)
    • [6. 终止条件](#6. 终止条件)
    • [7. 完整算法](#7. 完整算法)
  • [六、如何接入已有 Agent 记忆框架](#六、如何接入已有 Agent 记忆框架)
  • 七、实验设置
    • [1. 数据集](#1. 数据集)
      • [1.1 LoCoMo](#1.1 LoCoMo)
      • [1.2 3x LoCoMo-style](#1.2 3x LoCoMo-style)
      • [1.3 10x LoCoMo-style](#1.3 10x LoCoMo-style)
      • [1.4 LongMemEvalS](#1.4 LongMemEvalS)
    • [2. 记忆框架](#2. 记忆框架)
      • [2.1 A-MEM 风格图记忆](#2.1 A-MEM 风格图记忆)
      • [2.2 Mem0](#2.2 Mem0)
    • [3. 存储预算](#3. 存储预算)
    • [4. 对比方法](#4. 对比方法)
      • [4.1 Base Memory](#4.1 Base Memory)
      • [4.2 RuleSim](#4.2 RuleSim)
      • [4.3 RulePR](#4.3 RulePR)
      • [4.4 仅保留基线](#4.4 仅保留基线)
    • [5. 评价指标](#5. 评价指标)
    • [6. 实现细节](#6. 实现细节)
  • 八、实验结果与分析
    • [1. 标准 LoCoMo](#1. 标准 LoCoMo)
      • [1.1 A-MEM 风格图记忆](#1.1 A-MEM 风格图记忆)
      • [1.2 Mem0](#1.2 Mem0)
    • [2. LongMemEvalS](#2. LongMemEvalS)
    • [3. 不同问题类型受到的影响](#3. 不同问题类型受到的影响)
      • [3.1 A-MEM 风格图记忆](#3.1 A-MEM 风格图记忆)
      • [3.2 Mem0](#3.2 Mem0)
    • [4. 与规则方法对比](#4. 与规则方法对比)
    • [5. 为什么 PageRank 不够](#5. 为什么 PageRank 不够)
    • [6. 不同压缩模型](#6. 不同压缩模型)
      • [A-MEM 风格图记忆](#A-MEM 风格图记忆)
      • Mem0
    • [7. 扩展到更长对话](#7. 扩展到更长对话)
  • 九、局限性与未来方向
    • [1. LLM 判断可能出错](#1. LLM 判断可能出错)
    • [2. 删除和合并缺少默认可逆性](#2. 删除和合并缺少默认可逆性)
    • [3. 候选对计算和 LLM 调用成本](#3. 候选对计算和 LLM 调用成本)
    • [4. 存储大小定义有限](#4. 存储大小定义有限)
    • [5. 局部成对判断不能保证全局最优](#5. 局部成对判断不能保证全局最优)
    • [6. 事实保留与硬预算存在冲突](#6. 事实保留与硬预算存在冲突)
    • [7. 实验范围有限](#7. 实验范围有限)
    • [8. 缺少重复实验](#8. 缺少重复实验)
  • 十、我的理解和启发
    • [1. MemRefine 更像记忆库的垃圾回收器](#1. MemRefine 更像记忆库的垃圾回收器)
    • [2. 记忆压缩应该使用两阶段决策](#2. 记忆压缩应该使用两阶段决策)
    • [3. 不同预算应该使用不同策略](#3. 不同预算应该使用不同策略)
    • [4. 合并记忆必须保留来源](#4. 合并记忆必须保留来源)
    • [5. 记忆压缩和检索应该联合评估](#5. 记忆压缩和检索应该联合评估)
    • [6. 与其他论文的联系](#6. 与其他论文的联系)
  • 十一、总结
  • 参考资料

前言

长期运行的 Agent 会不断积累记忆。

这些记忆可能包括:

  • 用户偏好;
  • 历史任务;
  • 环境配置;
  • 工具调用结果;
  • 成功和失败经验;
  • 多轮对话中的人物、事件和关系。

现有研究通常关注两个问题:

  1. 如何从交互中提取记忆;
  2. 如何在未来任务中召回记忆。

但是,当 Agent 从几次交互扩展到数月甚至数年的运行后,还会出现第三个问题:

已经构建好的记忆库越来越大,应该如何把它压缩到一个固定预算之内?

记忆并不是越多越好。

大量重复或低价值条目不仅增加存储成本,还会影响检索。例如,关于同一事实的多个相似版本可能同时进入 Top-K,挤掉真正需要的其他证据。

在移动设备、本地 Agent 或边缘设备中,存储容量还可能是一个无法突破的硬约束。

一种直观方案是直接删除相似记忆:

text 复制代码
相似度高
  ↓
认为内容重复
  ↓
删除其中一条

但语义相似不等于事实重复。

例如:

text 复制代码
记忆 A:Jon 的舞蹈团队去年赢得了一场比赛。
记忆 B:Jon 正在准备下个月的另一场比赛。

两条记忆都包含 Jon、舞蹈和比赛,Embedding 相似度可能很高,但它们分别描述过去成就和未来计划,任何一条都不应该被删除。

反过来,两条用词不同的记忆也可能表达同一个事实。

因此,MemRefine 将相似度和压缩决策拆开:

  • 相似度只负责找出值得比较的候选记忆;
  • LLM 根据事实内容决定删除、合并还是保留;
  • 系统重复执行这一过程,直到达到目标存储预算。

这篇论文关注的不是如何创建一种新的记忆结构,而是提供一个可以插入现有记忆框架的后处理模块:

text 复制代码
记忆构建
  ↓
MemRefine 压缩
  ↓
记忆检索
  ↓
Agent 回答或执行任务

它研究的是长期记忆系统中一个容易被忽略的"反问题":

不只是研究如何把记忆写进去,还要研究如何安全地把记忆库缩小。


零、论文基本信息


一、背景与问题

1. 长期记忆为什么会无限增长

长期 Agent 通常采用以下流程:

text 复制代码
用户交互
  ↓
提取事实、事件或经验
  ↓
写入外部记忆
  ↓
持续积累
  ↓
根据未来问题检索

如果系统只关心记忆写入和召回,而没有独立的维护阶段,那么记忆库大小会随着交互次数近似单调增长。

长期运行后,记忆库中可能同时存在:

  • 完全重复的事实;
  • 同一事实的不同表达;
  • 内容互补但被拆散的记录;
  • 已经被新信息覆盖的旧事实;
  • 问候和感谢等低价值内容;
  • 多次任务执行产生的相似过程;
  • 大量只有局部区别的历史版本。

这些内容会带来两个直接问题。

1.1 存储成本持续增长

在云端系统中,这意味着更高的数据库和索引成本。

在本地设备中,存储预算可能是硬约束。例如,一个端侧个人助理不可能无限保存所有历史交互和对应的向量索引。

1.2 检索噪声增加

如果某个事实在记忆库中重复出现五次,那么五个相似条目可能同时占据 Top-K。

最终检索结果可能变成:

text 复制代码
Top-1:事实 A 的表达 1
Top-2:事实 A 的表达 2
Top-3:事实 A 的表达 3
Top-4:事实 A 的表达 4
Top-5:事实 A 的表达 5

系统虽然召回了相关内容,却没有空间容纳回答问题所需的其他互补证据。

因此,压缩长期记忆不仅是为了节省空间,也可能改善检索结果的信息密度。


2. 什么是存储预算约束下的记忆管理

MemRefine 提出 Storage-Budgeted Memory Management,即存储预算约束下的记忆管理。

它的输入不是原始对话,而是已经由某个记忆框架构建好的记忆库。

输入包括:

text 复制代码
已有记忆库 M0
目标存储比例 ρ

输出为:

text 复制代码
压缩后的记忆库 M'

要求满足:

text 复制代码
M' 的大小不超过 M0 的 ρ 倍

例如:

预算比例 含义
70% 最多保留原记忆库 70% 的大小
50% 将记忆库压缩到原大小的一半
30% 只允许保留原记忆库 30% 的大小

这里容易产生一个表述误区:

"30% 预算"表示保留 30%,也就是压缩掉约 70%;不是只压缩 30%。


3. 为什么这是查询无关压缩

MemRefine 压缩记忆时,并不知道未来用户会提出什么问题。

它不能像推理时上下文压缩那样,根据当前问题删除无关内容。

例如,当前没有人询问用户去年去过哪里,不代表旅行记录以后不会有用。

因此,MemRefine 面临的是 Query-Agnostic Compression:

在未知未来问题的情况下,尽量只删除已经被其他记忆覆盖的内容,避免删除可能独立回答某个问题的事实。

这使问题比普通摘要更困难。


二、相关工作

1. Agent 长期记忆

1.1 外部记忆与多会话交互

长期记忆系统允许 Agent 在不同会话之间保存信息。

代表性路线包括:

  • MemoryBank:保存长期用户记忆,并引入记忆衰减;
  • MemGPT:通过类似操作系统的方式管理上下文和外部存储;
  • Mem0:提取、更新和检索事实级记忆;
  • A-MEM:将记忆组织成具有属性和动态链接的结构化笔记;
  • LightMem:通过多阶段记忆处理降低长期运行成本。

这些方法主要研究:

text 复制代码
新信息如何写入
旧信息如何更新
当前问题如何召回记忆

MemRefine 关注的是它们的下游维护问题:

text 复制代码
记忆库已经建好
  ↓
如何在不修改原框架的前提下压缩

2. 记忆和上下文压缩

现有压缩方法大致可以分成三类。

2.1 写入前的对话摘要

系统先将一段对话压缩成摘要,再写入长期记忆。

这种方法压缩的是:

text 复制代码
原始对话历史

而不是:

text 复制代码
记忆框架已经构建好的记忆库

它不能直接处理已经存在的大型记忆存储。


2.2 推理时上下文压缩

LLMLingua、LongLLMLingua、RECOMP 等方法根据当前查询,压缩输入模型的 Prompt 或检索结果。

它们解决的是:

当前这次推理应该向模型提供哪些 Token?

MemRefine 解决的是:

持久化记忆库本身应该长期保存哪些内容?

两者发生在不同阶段。

text 复制代码
MemRefine:
压缩长期存储。

Context Compression:
压缩单次推理输入。

2.3 基于结构的图剪枝

对于图记忆,可以根据以下信号删除节点:

  • PageRank;
  • 节点中心性;
  • 连接数量;
  • 图结构重要性。

但是,图中心性不一定代表事实价值。

一个位于图中心的节点可能只是频繁出现的普通信息;一个边缘节点却可能保存了某个未来问题的唯一答案。

因此,MemRefine 认为:

图结构和相似度适合发现候选,但不能单独决定某条事实是否可以删除。


3. MemRefine 的定位

方法 压缩对象 是否利用当前问题 发生阶段
会话摘要 原始对话 记忆构建前
上下文压缩 Prompt 或检索证据 推理阶段
图剪枝 图节点和边 记忆维护阶段
MemRefine 已构建的记忆库 构建后、检索前

MemRefine 的核心区别是:

  • 面向已经构建的记忆库;
  • 具有明确存储预算;
  • 与未来查询无关;
  • 同时支持图和非图记忆;
  • 使用 LLM 判断事实关系;
  • 不修改宿主框架的构建和检索流程。

三、MemRefine 方法

1. 方法总览

为了理解论文解决的问题,可以先看 Figure 1。

图源:论文 Figure 1。

传统 Agent 记忆会随着长期交互持续增长;MemRefine 通过删除和合并将已经构建好的图或非图记忆压缩到目标预算内。

整体流程如下:

text 复制代码
已有记忆库
  ↓
计算记忆条目之间的语义相似度
  ↓
选择尚未判断的最相似记忆对
  ↓
LLM 判断两条记忆的事实关系
  ├─ DELETE:删除冗余记忆
  ├─ MERGE:合并互补记忆
  └─ PRESERVE:保留两条记忆
  ↓
更新记忆库和 Embedding
  ↓
是否达到存储预算?
  ├─ 否:继续选择下一对
  └─ 是:输出压缩后的记忆库

2. 问题形式化

设初始记忆库为:

M 0 = { m i } i = 1 n M_0=\{m_i\}_{i=1}^{n} M0={mi}i=1n

每条记忆 m i m_i mi 至少包含:

  • 文本内容;
  • Embedding。

根据宿主框架不同,还可能包含:

  • 时间戳;
  • 元数据;
  • 图连接;
  • 标签;
  • 其他结构字段。

对于查询 q q q,宿主记忆框架首先从记忆库 M M M 中检索上下文:

c = Ret ⁡ ( q ; M ) c=\operatorname{Ret}(q;M) c=Ret(q;M)

然后由 LLM 生成答案:

a = LLM ⁡ ( q , c ) a=\operatorname{LLM}(q,c) a=LLM(q,c)

下游效果记为:

U ( q , M ) ∈ 0 , 1 U(q,M)\in0,1 U(q,M)∈0,1

其中, U U U 可以是 F1、Exact Match 或其他任务指标。


3. 存储预算目标

设 F ( M 0 ) \mathcal{F}(M_0) F(M0) 表示通过删除和合并等编辑操作可以从 M 0 M_0 M0 得到的所有记忆库。

目标预算比例为:

ρ ∈ ( 0 , 1 ] \rho\in(0,1] ρ∈(0,1]

论文将目标形式化为:

max ⁡ M ′ ∈ F ( M 0 ) min ⁡ q ∈ Q U ( q , M ′ ) s.t. size ⁡ ( M ′ ) ≤ ρ ⋅ size ⁡ ( M 0 ) \max_{M'\in\mathcal{F}(M_0)}\min_{q\in\mathcal{Q}}U(q,M')\quad\text{s.t.}\quad\operatorname{size}(M')\leq\rho\cdot\operatorname{size}(M_0) M′∈F(M0)maxq∈QminU(q,M′)s.t.size(M′)≤ρ⋅size(M0)

其中:

  • M ′ M' M′ 表示压缩后的记忆库;
  • Q \mathcal{Q} Q 表示所有可能的未来查询;
  • 内层最小化表示关注最不利的未来查询;
  • 外层最大化要求压缩后的记忆库尽量保留对所有查询有用的证据;
  • 约束项要求记忆大小不超过目标预算。

直观来说,系统不能只保留高频问题需要的内容,而应该尽量避免删除某个罕见问题的唯一证据。


4. 为什么不能直接优化该目标

这个目标在实际中无法直接计算,原因包括:

  1. 压缩时不知道未来查询集合 Q \mathcal{Q} Q;
  2. 每尝试一种压缩结果,都需要运行完整检索和问答流程;
  3. 删除和合并的组合数量会随记忆规模快速增长;
  4. 很难提前知道某条记忆未来是否会成为唯一证据。

因此,MemRefine 使用一个局部替代目标:

对语义相关的两条记忆判断它们是事实重复、事实互补,还是事实独立。

只有在事实可以由其他记忆覆盖时,才执行删除或合并。


四、为什么使用成对判断

1. 单条记忆重要性评分的问题

一种直接方案是为每条记忆计算重要性分数,然后删除低分内容。

可以使用的信号包括:

  • 新近程度;
  • Embedding 范数;
  • 出现频率;
  • 图中心性;
  • LLM 重要性评分。

但是,一条记忆的价值通常是相对的。

例如:

text 复制代码
记忆 A:用户的项目使用 Python。
记忆 B:用户的项目主要使用 Python 开发。

如果 B 已经存在,A 可以删除。

但如果只有 A,它就是不可替代的事实。

反过来:

text 复制代码
记忆 A:用户的项目使用 Python。
记忆 B:用户的项目使用 FastAPI。

两条记忆虽然主题相近,但信息互补,应该同时保留或者合并。

因此,记忆是否可删除取决于其他记忆是否已经覆盖它,而不是它自身的绝对分数。


2. 三类事实关系

对于候选记忆对 ( u , v ) (u,v) (u,v),MemRefine 将其分为三种关系。

2.1 冗余关系

一条记忆的事实已经被另一条完整覆盖。

例如:

text 复制代码
A:Jon 因为喜欢舞蹈,准备开一家舞蹈工作室。

B:Jon 从小学习舞蹈,希望通过自己的工作室教授其他人。

如果 B 已经包含 A 的核心事实,同时提供更丰富信息,可以删除 A。

对应操作:

text 复制代码
DELETE

2.2 互补关系

两条记忆都包含对方没有的事实,但又适合合并成一条紧凑记忆。

例如:

text 复制代码
A:Jon 正在扩大舞蹈工作室的社交媒体推广,并提供工作坊。

B:Jon 的工作室正在与学校合作举办评审比赛。

合并结果可以是:

text 复制代码
Jon 经营一家舞蹈工作室,正在扩大社交媒体推广、
提供工作坊,并与学校合作举办评审比赛。

对应操作:

text 复制代码
MERGE

2.3 独立关系

两条记忆虽然主题相似,但描述不同事实。

例如:

text 复制代码
A:Jon 的舞蹈团队去年赢得了一场本地比赛。

B:Jon 正在准备下个月的另一场比赛。

它们分别描述过去成就和未来计划,不能删除或强行合并。

对应操作:

text 复制代码
PRESERVE

3. 方法流程图

图源:论文 Figure 2。

MemRefine 先根据语义相似度提出候选记忆对,再由 LLM 根据事实内容选择 Delete、Merge 或 Preserve。

这张图体现了论文最重要的设计:

相似度是候选生成器,不是压缩决策器。


五、MemRefine 核心流程

1. 候选记忆对选择

对于每条记忆,系统计算 Embedding。

在每轮迭代中,选择尚未处理的最相似记忆对:

$ ( u , v ) ← arg ⁡ max ⁡ ( u , v ) ∉ S cos ⁡ ( e u , e v ) (u,v)\leftarrow\arg\max_{(u,v)\notin S}\cos(e_u,e_v) (u,v)←arg(u,v)∈/Smaxcos(eu,ev)

其中:

  • e u e_u eu 和 e v e_v ev 分别是记忆 u u u 和 v v v 的向量;
  • cos ⁡ ( e u , e v ) \cos(e_u,e_v) cos(eu,ev) 表示余弦相似度;
  • S S S 保存已经被判断为 PRESERVE 的记忆对。

如果一对记忆已经被判断为应该同时保留,就不再重复交给 LLM,避免无效调用。

相似度较高的记忆更可能存在:

  • 重复;
  • 局部事实重叠;
  • 同一主题下的互补信息。

因此,先处理高相似记忆对,可以优先发现最容易压缩的部分。


2. LLM Judge

候选记忆对会被发送给 Judge LLM。

Judge 返回结构化结果:

text 复制代码
action:
  DELETE / MERGE / PRESERVE

target:
  删除 A 或删除 B

merge_instruction:
  合并时必须保留哪些事实

reason:
  判断理由

Judge 被要求根据事实价值判断,而不是根据表面措辞判断。

重点保留的内容包括:

  • 人名;
  • 时间;
  • 地点;
  • 事件;
  • 用户偏好;
  • 计划;
  • 个人经历;
  • 人物关系;
  • 观点和明确状态。

低价值内容包括:

  • 普通问候;
  • 通用感谢;
  • 没有具体事实的寒暄;
  • 不携带信息的情绪表达。

3. DELETE 操作

如果 Judge 判断一条记忆被另一条完全覆盖,就删除指定目标。

对于普通记忆库:

text 复制代码
删除目标记忆

对于图记忆:

text 复制代码
删除目标节点
  ↓
删除悬空关系边

删除操作适合完全冗余的记忆,不负责整合互补事实。


4. MERGE 操作

如果两条记忆分别携带不同事实,且可以合并成更紧凑的内容,Judge 会生成合并指令。

随后由另一个 Merge LLM 生成新记忆:

m ← Merge ⁡ ( u , v , instruction ) m\leftarrow\operatorname{Merge}(u,v,\text{instruction}) m←Merge(u,v,instruction)

新记忆需要:

  • 保留两条记忆中的所有独立事实;
  • 删除重复措辞;
  • 删除没有事实价值的内容;
  • 保持人物归属;
  • 尽量简洁。

合并完成后:

text 复制代码
删除 u 和 v
  ↓
加入新记忆 m
  ↓
重新计算 m 的 Embedding

对于图记忆,新节点还会继承两条原节点的关系边并集,同时删除:

  • 重复边;
  • 指向自身的边。

重新计算 Embedding 很重要,因为新记忆内容已经变化,后续候选对选择应该根据新内容进行。


5. PRESERVE 操作

如果两条记忆分别表达不可替代的事实,就保持不变。

同时将该记忆对加入缓存 S S S:

S ← S ∪ { ( u , v ) } S\leftarrow S\cup\{(u,v)\} S←S∪{(u,v)}

后续迭代不会再次处理该组合。


6. 终止条件

首先根据预算比例计算目标大小:

B = ρ ⋅ size ⁡ ( M 0 ) B=\rho\cdot\operatorname{size}(M_0) B=ρ⋅size(M0)

算法在以下条件之一满足时停止:

  1. 当前记忆库大小已经不超过 B B B;
  2. 已经没有尚未判断的候选记忆对;
  3. 剩余候选全部被判断为应该保留。

第二种情况意味着系统可能提前退出。

论文的原则是:

如果继续压缩必然删除没有冗余备份的事实,那么事实保留优先于机械满足预算。

这一设计也揭示了一个潜在矛盾:

  • 论文任务强调固定存储预算;
  • 算法又允许为了保留事实而提前退出。

实验中 MemRefine 能够达到设定预算,但在更缺少冗余的真实记忆库中,硬预算和事实完整性之间仍然可能冲突。


7. 完整算法

text 复制代码
输入:
- 初始记忆库 M0
- 存储预算比例 ρ

初始化:
- B = ρ × size(M0)
- M' = M0
- S = 空集合

循环:
1. 从 M' 中选择尚未判断的最相似记忆对 (u, v)
2. 如果没有候选记忆对,则结束
3. LLM Judge 判断操作

   DELETE:
   - 删除指定目标
   - 图结构中删除悬空边

   MERGE:
   - 合并 u 和 v
   - 保留独立事实
   - 继承关系边
   - 重新计算 Embedding

   PRESERVE:
   - 保留 u 和 v
   - 将 (u, v) 加入 S

4. 检查是否达到预算
5. 未达到则继续

输出:
- 压缩后的记忆库 M'

六、如何接入已有 Agent 记忆框架

MemRefine 是一个离线、构建后的记忆维护模块。

text 复制代码
宿主框架创建记忆
  ↓
MemRefine 定期压缩
  ↓
宿主框架照常检索

它不会修改:

  • 原来的记忆提取方式;
  • 原来的写入策略;
  • 原来的查询检索器;
  • 原来的答案生成流程。

对于图结构记忆,MemRefine 维护节点和边。

对于非图结构记忆,它直接处理文本条目和 Embedding。

所有 Judge 和 Merge 调用都发生在记忆维护阶段,而不是用户查询阶段。

因此,它不会直接增加每次问答的检索轮数和生成延迟,但会增加离线维护成本。


七、实验设置

1. 数据集

1.1 LoCoMo

论文使用 LoCoMo 的 10 个样本,共包含 1986 个问题。

问题覆盖五个类别:

  • 单跳事实回忆;
  • 多跳推理;
  • 时间推理;
  • 开放式问题;
  • 反事实问题。

这些任务可以检验压缩后是否仍然保留:

  • 局部事实;
  • 分散在多个位置的证据;
  • 事件顺序;
  • 较大范围的对话信息。

1.2 3x LoCoMo-style

为了测试更长历史,论文构造了约三倍规模的 LoCoMo 风格数据。

数据包括:

text 复制代码
样本数:5
总 Session:400
总对话轮次:8000
问答数量:2720

平均每个样本包含:

text 复制代码
80 个 Session
1600 轮用户---助手交互

1.3 10x LoCoMo-style

更大规模的压力测试包括:

text 复制代码
样本数:5
总 Session:1350
总对话轮次:27000
问答数量:9180

平均每个样本包含:

text 复制代码
270 个 Session
5400 轮用户---助手交互

3x 和 10x 数据由模型合成,因此主要用于可控压力测试,不能完全替代真实用户的长期交互日志。


1.4 LongMemEvalS

论文还选择 LongMemEvalS 中的 60 个问题,每种类型 10 个:

  • Single-user;
  • Single-assistant;
  • Single-preference;
  • Multi-session;
  • Temporal;
  • Knowledge-update。

它用于验证结果是否只对 LoCoMo 有效。


2. 记忆框架

2.1 A-MEM 风格图记忆

论文使用一种简化的 A-MEM 风格图表示,保留:

  • 记忆文本;
  • Embedding;
  • 节点之间的链接。

实验没有使用完整 A-MEM 的所有字段,而是移除了辅助上下文、类别、标签和检索次数等字段。

作者认为这些辅助字段在当前检索设置中没有带来有效证据,反而可能增加噪声。

因此,实验中的结果应准确理解为:

MemRefine 在 A-MEM 风格的事实图记忆上有效,而不是完整复现并压缩原始 A-MEM 的全部记忆结构。


2.2 Mem0

Mem0 会在写入阶段对原始对话执行事实提取和更新,得到已经经过处理的记忆条目。

相比 A-MEM 风格图记忆,Mem0 本身已经做过一定程度的:

  • 过滤;
  • 去重;
  • 更新;
  • 合并。

因此,它留给后处理压缩的冗余空间可能更少。


3. 存储预算

实验分别将记忆库压缩到初始大小的:

text 复制代码
70%
60%
50%
40%
30%

这覆盖了从轻度压缩到激进压缩的完整范围。


4. 对比方法

4.1 Base Memory

未经过压缩的原始记忆库,用于衡量性能保留程度。

4.2 RuleSim

使用相同的候选对选择流程,但不调用 LLM Judge。

系统根据固定相似度阈值决定:

  • 删除;
  • 合并。

它用于验证"只看相似度是否已经足够"。

4.3 RulePR

在相似度规则基础上加入 PageRank。

图中心性更高的节点会被优先保留;如果删除仍然无法达到目标预算,再执行图结构上的合并。

它用于验证"图中心性是否可以替代 LLM 的事实判断"。

4.4 仅保留基线

附录还比较了:

  • 根据 PageRank 保留固定比例节点;
  • 随机保留固定比例节点。

这两种方法不执行事实级合并。


5. 评价指标

在 LoCoMo 及其扩展版本上,论文使用:

  • Token-level F1;
  • Exact Match,简称 EM。

在 LongMemEvalS 上使用:

  • Accuracy。

此外,论文记录实际存储比例,验证压缩结果是否满足目标预算。


6. 实现细节

候选记忆向量由以下模型生成:

text 复制代码
all-MiniLM-L6-v2

候选对根据余弦相似度排序。

宿主框架检索阶段保持原设置:

text 复制代码
Top-K = 10

默认 Judge 和 Merge 模型为:

text 复制代码
GPT-5-mini

论文还使用开源模型进行对比:

text 复制代码
Qwen3-8B

每条记忆送入 Judge 和 Merge 模型前,最多保留前 2000 个字符。

LongMemEvalS 使用 GPT-4o-mini 作为自动评审模型。

由于 API 调用成本较高,每个设置只运行一次,因此论文没有报告:

  • 置信区间;
  • 标准差;
  • 误差条。

八、实验结果与分析

1. 标准 LoCoMo

1.1 A-MEM 风格图记忆

存储预算 F1 EM
100% 0.4013 0.1712
70% 0.4014 0.1690
60% 0.3977 0.1715
50% 0.3902 0.1628
40% 0.3844 0.1615
30% 0.3628 0.1474

压缩到 70% 时,F1 与未压缩记忆基本相同。

压缩到 50% 时:

text 复制代码
F1:0.4013 → 0.3902

在删除约一半存储的情况下,仍保留了约 97.2% 的基础 F1。

即使压缩到 30%,F1 仍为 0.3628,没有出现断崖式下降。


1.2 Mem0

存储预算 F1 EM
100% 0.2827 0.1098
70% 0.2888 0.1177
60% 0.2773 0.1095
50% 0.2761 0.1132
40% 0.2685 0.1102
30% 0.2510 0.0994

Mem0 在 70% 预算下反而略有提升。

这不代表压缩必然提高性能,而是说明删除重复和低价值记忆后,Top-K 中可能出现更多有用证据。

不过,Mem0 在紧预算下下降得更明显,说明它原本已经在写入阶段完成了较多整理,可安全删除的冗余空间小于 A-MEM 风格图记忆。


2. LongMemEvalS

框架 Base 70% 60% 50% 40% 30%
A-MEM graph 0.5833 0.6000 0.6000 0.6167 0.5833 0.5500
Mem0 0.5167 0.4833 0.5167 0.4833 0.4500 0.4000

A-MEM 风格记忆在 50% 预算时,从 0.5833 提高到 0.6167。

Mem0 只有在 60% 预算时维持基础准确率,预算继续缩小时开始下降。

需要注意,LongMemEvalS 实验只有 60 个问题,每类 10 个,因此一个问题就会造成约 1.67 个百分点的总体变化。

这里的轻微提升可能包含样本波动,不能过度解读。


3. 不同问题类型受到的影响

为了观察压缩影响,论文 Figure 3 展示了各类别相对于未压缩记忆的 F1 变化。

图源:论文 Figure 3。

红色表示压缩后 F1 提高,蓝色表示下降。压缩效果与问题类型、宿主记忆表示都有明显关系。

3.1 A-MEM 风格图记忆

单跳和时间问题在多个预算下反而提高。

例如,60% 预算下:

text 复制代码
Single-hop:+0.047
Temporal:+0.093

这说明去除重复节点后,局部事实更容易进入 Top-K。

但是,多跳、开放式和反事实问题在紧预算下更敏感。

30% 预算时:

text 复制代码
Multi-hop:-0.039
Open-ended:-0.034
Counterfactual:-0.108

这些任务需要更广泛的证据覆盖。压缩越激进,删除某条边缘证据的风险越高。


3.2 Mem0

Mem0 的类别变化与 A-MEM 不完全一致。

例如,反事实问题在多个预算下有所提高,而开放式问题在紧预算下明显下降。

这说明:

压缩效果不仅由压缩器决定,也由宿主记忆框架已经生成了什么样的记忆决定。

同一个压缩算法不能脱离宿主记忆表示单独评价。


4. 与规则方法对比

在 A-MEM 风格图记忆上,30% 预算时:

方法 F1
MemRefine 0.3628
RuleSim 0.3482
RulePR 0.3306

当预算较宽松时,规则方法与 MemRefine 比较接近,某些中等预算下甚至略高。

例如,50% 预算时:

text 复制代码
MemRefine:0.3902
RuleSim:0.3989
RulePR:0.3850

因此,不能简单地说 LLM 方法在所有预算下都最好。

更准确的实验结论是:

当压缩主要处理明显重复内容时,固定相似度规则已经具有竞争力;当预算越来越紧、系统必须处理事实互补和主题相似但内容不同的记忆时,LLM 判断优势更加明显。


5. 为什么 PageRank 不够

PageRank 衡量的是图结构中心性,不是事实不可替代性。

附录中的仅保留实验显示,在 70% 存储预算下:

方法 F1
MemRefine 0.4014
PageRank 保留 0.3111
随机保留 0.3085

PageRank 只比随机保留略好,明显低于带合并和事实判断的 MemRefine。

这说明记忆压缩不是简单的节点选择问题。

如果只保留某些节点而不合并互补事实,就会损失大量信息。


6. 不同压缩模型

论文比较了 GPT-5-mini 和 Qwen3-8B。

A-MEM 风格图记忆

模型 70% 60% 50% 40% 30%
GPT-5-mini 0.4014 0.3977 0.3902 0.3844 0.3628
Qwen3-8B 0.4006 0.3893 0.3796 0.3529 0.3430

Mem0

模型 70% 60% 50% 40% 30%
GPT-5-mini 0.2888 0.2773 0.2761 0.2685 0.2510
Qwen3-8B 0.2880 0.2718 0.2623 0.2390 0.2076

在 70% 预算下,两种模型表现接近。

随着预算收紧,GPT-5-mini 的优势逐渐扩大。

原因是轻度压缩主要处理明显重复记忆,而激进压缩需要进行更精细的事实判断:

  • 是重复还是互补;
  • 哪条信息更加完整;
  • 合并时哪些细节不能丢;
  • 相似主题下是否描述了不同事件。

这也给实际部署提供了一个思路:

日常轻度压缩可以使用较小模型,只有在预算压力较大时才调用更强 Judge。


7. 扩展到更长对话

在 3x 和 10x LoCoMo 风格数据上,性能随着预算收紧而平滑下降,没有突然崩溃。

例如 A-MEM 风格记忆:

数据规模 Base F1 70% 60% 50% 30%
3x 0.2344 0.2307 0.2324 0.2163 0.1900
10x 0.2053 0.2033 0.2006 0.1916 0.1660

10x 数据在 70% 预算时,F1 只下降约 1%。

但压缩到 30% 时,F1 下降约 19.1%。

这说明 MemRefine 可以用于更长历史,但并不存在"任意压缩都不影响效果"。

真正可安全删除的比例仍然取决于:

  • 记忆库冗余程度;
  • 宿主框架是否已经做过去重;
  • 问题需要多少分散证据;
  • Judge 的事实判断能力;
  • 目标预算是否过于激进。

九、局限性与未来方向

1. LLM 判断可能出错

Judge 可能将互补事实误判为重复,导致永久删除。

Merge LLM 也可能:

  • 遗漏时间;
  • 混淆人物;
  • 删除限定条件;
  • 将两件不同事件合成一件;
  • 生成原记忆中不存在的关系。

压缩错误会直接写入持久化记忆,因此风险高于一次普通生成错误。


2. 删除和合并缺少默认可逆性

论文算法会直接修改记忆库。

实际系统更适合采用:

  • 软删除;
  • 压缩前快照;
  • 操作日志;
  • 合并来源 ID;
  • 版本号;
  • 人工审核;
  • 一键回滚。

否则,一次错误删除可能永久丢失用户信息。

论文在伦理讨论中也建议结合软删除和审计日志。


3. 候选对计算和 LLM 调用成本

如果记忆库有 n n n 条记忆,直接计算所有两两相似度可能产生接近 O ( n 2 ) O(n^2) O(n2) 的候选规模。

此外,每次压缩操作可能需要:

  • Judge 调用;
  • Merge 调用;
  • 新 Embedding 计算;
  • 图关系更新。

论文强调这些成本发生在离线阶段,但没有详细报告:

  • 压缩总 Token;
  • LLM 调用次数;
  • 压缩耗时;
  • 单位存储节省成本;
  • 不同记忆规模下的计算复杂度。

因此,它减少了长期存储和检索噪声,却不一定降低总系统成本。


4. 存储大小定义有限

论文通过将记忆条目序列化为 JSON,计算文件大小。

这能够提供统一比较,但不完全等价于生产环境中的实际占用,例如:

  • 向量索引开销;
  • 数据库索引;
  • 图数据库边存储;
  • 元数据页;
  • 缓存;
  • 副本;
  • 日志;
  • 对象存储压缩。

因此,实验中的 50% 存储预算应理解为序列化记忆表示的 50%,不一定等于系统总内存或磁盘成本下降 50%。


5. 局部成对判断不能保证全局最优

论文形式化目标是面向所有未来问题的全局最坏情况优化。

实际算法只对当前最相似的记忆对做局部判断。

这是一种可计算的近似,但不能保证:

  • 最终压缩结果全局最优;
  • 合并顺序不会影响后续结果;
  • 多条记忆共同形成的冗余能被发现;
  • 跨三个以上条目的事实关系能被正确处理。

不同操作顺序可能产生不同的最终记忆库。


6. 事实保留与硬预算存在冲突

算法允许在没有可压缩候选时提前停止。

这意味着,如果记忆库本身冗余很少,系统可能无法同时满足:

  • 严格存储预算;
  • 不删除独立事实。

对真正资源受限的端侧 Agent 来说,预算可能无法突破。此时系统还需要额外策略,例如:

  • 将低优先级记忆转移到冷存储;
  • 允许查询后按需加载;
  • 使用任务或领域重要性;
  • 引入用户定义的保留策略;
  • 对不可压缩事实进行更强编码。

7. 实验范围有限

论文只测试了:

  • 简化的 A-MEM 风格图记忆;
  • Mem0;
  • 长期对话问答任务。

还没有验证:

  • 完整 A-MEM;
  • 文件式主题记忆;
  • 多模态记忆;
  • 技能记忆;
  • 工具调用经验;
  • 软件工程 Agent;
  • 多 Agent 共享记忆;
  • 真实用户数月运行日志。

8. 缺少重复实验

每种设置只进行一次压缩和评估,没有置信区间或误差条。

但 MemRefine 中包含多个非确定性环节:

  • Judge 判断;
  • Merge 生成;
  • 自动评审;
  • 合成数据;
  • 记忆构建。

因此,部分小幅提升可能来自随机波动。


十、我的理解和启发

1. MemRefine 更像记忆库的垃圾回收器

我认为 MemRefine 最适合被理解为 Agent 记忆系统中的 Garbage Collector。

text 复制代码
记忆框架:
负责持续创建和更新记忆。

MemRefine:
定期清理冗余、合并碎片并控制容量。

检索器:
从压缩后的记忆库中找证据。

它不取代 Mem0、A-MEM 或其他记忆框架,而是为它们增加一个后处理维护阶段。


2. 记忆压缩应该使用两阶段决策

MemRefine 的"相似度提候选,LLM 做决策"非常适合工程实现。

text 复制代码
第一阶段:便宜的向量模型
  ↓
筛选少量高相似候选对
  ↓
第二阶段:较贵的 LLM
  ↓
判断删除、合并或保留

这样既避免对所有记忆调用 LLM,也避免仅依靠相似度进行危险删除。


3. 不同预算应该使用不同策略

可以为系统设置多级存储水位:

text 复制代码
记忆使用率 < 60%
  → 不压缩

60%~75%
  → 只删除高置信度重复项

75%~90%
  → 允许合并互补事实

> 90%
  → 使用更强 Judge,执行激进压缩或迁移冷存储

论文结果也说明:

  • 宽松预算下,小模型和规则已经比较有效;
  • 预算越紧,越需要强模型进行事实级判断。

4. 合并记忆必须保留来源

论文重点关注事实保留,但在实际项目中,合并后的记忆还应该记录:

text 复制代码
merged_from
source_message_ids
created_time
compression_model
judge_reason
confidence
previous_versions

否则,未来无法知道一条复合记忆来自哪些原始交互。


5. 记忆压缩和检索应该联合评估

单看压缩率无法判断方法是否有效。

需要同时监控:

指标 含义
存储压缩率 记忆库缩小多少
事实保留率 独立事实是否仍然存在
检索覆盖率 相关证据能否被召回
Top-K 多样性 是否减少重复候选
下游任务效果 Agent 最终是否正确
错误删除率 被删除事实是否仍有替代
合并完整率 合并后是否保留全部事实
压缩成本 Judge、Merge 和 Embedding 成本

MemRefine 的结果表明,减少记忆数量有时反而能提高问答效果,因为它改善了 Top-K 的信息密度。


6. 与其他论文的联系

方法 主要问题 与 MemRefine 的关系
Mem0 事实如何写入、更新和删除 MemRefine 可压缩 Mem0 已构建的记忆
A-MEM 记忆如何关联和演化 MemRefine 可压缩其图式事实节点
LightMem 如何降低记忆处理成本 主要优化构建流程,MemRefine 优化构建后的存储
Infini Memory 如何维护主题文档 可以在文档或条目过多时增加预算压缩
H-Mem 如何组织时间层级和实体关系 MemRefine 可作为混合索引后的清理层
MemRefine 如何在固定预算下压缩已有记忆 重点是后构建、查询无关压缩

一个更加完整的 Agent 记忆生命周期可以表示为:

text 复制代码
交互信息
  ↓
记忆写入判断
  ↓
事实提取和结构化
  ↓
记忆更新与冲突处理
  ↓
主题、图或层次化组织
  ↓
MemRefine 定期预算压缩
  ↓
按需检索
  ↓
任务执行
  ↓
审计和用户删除

十一、总结

MemRefine 提出了一种面向长期 Agent 的后构建记忆压缩框架。

它解决的问题是:

如何将已经构建好的长期记忆库压缩到固定存储预算,同时尽量保留对未知未来问题有用的事实?

核心方法包括:

  1. 将存储预算管理形式化为查询无关的压缩问题;
  2. 不为单条记忆独立计算重要性;
  3. 根据 Embedding 相似度选择候选记忆对;
  4. 让 LLM 根据事实内容做最终判断;
  5. 对冗余记忆执行删除;
  6. 对互补记忆执行合并;
  7. 对独立事实执行保留;
  8. 合并后重新计算 Embedding;
  9. 对图记忆维护节点关系;
  10. 重复处理直到达到预算或没有安全操作。

实验说明,在标准 LoCoMo 上:

  • A-MEM 风格图记忆压缩到 70% 后,F1 与未压缩基本一致;
  • 压缩到 50% 时仍保留约 97.2% 的基础 F1;
  • Mem0 在 70% 预算下甚至略有提升;
  • 更紧预算下,效果逐渐下降,但没有突然崩溃。

实验也表明:

  • 相似度规则在宽松预算下已经具有竞争力;
  • 当预算收紧时,LLM 的事实判断优势更加明显;
  • PageRank 不能可靠代表事实价值;
  • 单跳和时间问题可能受益于去重;
  • 多跳、开放式和反事实问题对激进压缩更敏感;
  • 宿主记忆框架决定了还有多少冗余可以安全删除。

MemRefine 的局限也比较明显:

  • LLM 可能错误删除或合并事实;
  • 压缩操作默认不可逆;
  • 成对判断不能保证全局最优;
  • 离线压缩成本没有充分报告;
  • 实验只覆盖两种记忆表示;
  • 每个设置只运行一次;
  • 严格预算与事实完整性可能发生冲突。

对实际 Agent 开发而言,这篇论文最值得借鉴的不是直接使用某个模型做压缩,而是三个设计原则:

第一,记忆库需要独立于写入和检索的维护阶段。
第二,相似度适合寻找压缩候选,但不适合直接决定删除。
第三,记忆压缩必须围绕事实是否被其他记忆覆盖来判断。

长期记忆系统不仅需要回答"什么值得记住",还必须持续回答:

text 复制代码
什么已经重复?
什么可以合并?
什么仍然不可替代?
在有限预算下应该保留到什么程度?

从这个角度看,MemRefine 将 Agent 记忆研究从"不断增长的外部存储"推进到了"具有容量上限和垃圾回收机制的长期系统"。


参考资料

相关推荐
一次旅行1 小时前
fzf+ripgrep+fd终端三合一实战:一套检索工具链,大幅提升大型项目开发效率
人工智能·python·github
蓦然回首却已人去楼空1 小时前
Build a Large Language Model (From Scratch) 附录 E 使用 LoRA 进行参数高效微调
人工智能·语言模型·自然语言处理
IT小盘1 小时前
05-PDF-Word-Excel接入RAG知识库
人工智能
zzzll11111 小时前
RAG(检索增强生成)技术详解:从原理到实践
java·人工智能
星恒随风1 小时前
Linux 权限详解:从 rwx、chmod 到 umask、目录权限与粘滞位
linux·运维·服务器·笔记·学习
Python私教1 小时前
Django 做一个 AI 销售助手:读取客户记录,自动生成跟进计划
人工智能·python·django
leikooo2 小时前
ARTS 0802: 合并有序链表、AI 时代的技术断层与 TCP 200ms 延迟之谜
人工智能·tcp/ip·链表
动物园猫2 小时前
塑料瓶目标检测数据集:3,000张图像 | 目标检测
人工智能·目标检测·计算机视觉
zzzzzz3102 小时前
用 TRAE Work 拆解一次“老订单系统加退款状态机”的紧急方案
人工智能·程序员·workflow