【论文阅读】Agent 记忆机制(30):Memex(RL)——用稳定索引压缩上下文而不丢失原始证据
文章目录
- 前言
- 零、论文基本信息
- 一、背景与问题
- 二、相关工作
- 三、方法总览
- 四、核心模块详解
- 4.1 工作上下文与外部经验库
- 4.2 Indexed Summary
- 4.3 CompressExperience
- 4.4 ReadExperience
- 4.5 Memex Agent 循环
- 4.6 软压缩触发
- 4.7 MemexRL 奖励设计
- 4.8 分段轨迹训练
- 4.9 GRPO 策略优化
- 五、理论分析
- 5.1 有界解引用下的决策充分性
- 5.2 工作上下文有界
- 六、实验设置
- 6.1 基础模型
- 6.2 实验环境
- 6.3 训练设置
- 七、实验结果与分析
- 7.1 训练过程
- 7.2 最终任务成功率
- 7.3 峰值工作上下文
- 7.4 记忆工具行为变化
- 八、局限性与未来方向
- 九、我的理解和启发
- 十、总结
- 参考资料
前言
长程 Agent 往往需要连续执行几十甚至上百次工具调用。
例如,一个代码 Agent 可能需要:
阅读项目结构
↓
搜索相关代码
↓
运行测试
↓
分析错误日志
↓
修改代码
↓
再次运行测试
↓
对比修改前后的结果
随着任务推进,Agent 的上下文会不断累积:
- 中间推理;
- 工具调用;
- 文件内容;
- 命令输出;
- 错误日志;
- 已经失败的尝试;
- 当前任务进度。
最直接的做法是将所有历史全部保留在上下文中,但上下文窗口始终有限。即使模型支持很长的输入,也会出现成本增长、注意力稀释和关键信息难以定位等问题。
因此,很多长程 Agent 会定期生成摘要:
完整历史
↓
压缩为一段任务摘要
↓
删除原始历史
↓
继续执行
这种方法能够降低上下文长度,但存在一个根本问题:摘要是有损的。
假设 Agent 曾经读取过如下工具输出:
Object ID: apple_17
Location ID: fridge_4
Required command: take apple_17 from fridge_4
摘要可能只保留:
苹果在冰箱中。
当 Agent 后续真正需要执行操作时,精确的 apple_17 和 fridge_4 已经丢失。模型知道大致发生了什么,却无法恢复工具真正需要的参数。
另一种方法是将所有历史写入向量数据库,再根据语义相似度检索。但长程工具轨迹中往往存在大量内容相似的日志、代码片段和查询结果。模糊相似度检索未必能够稳定找到那一条精确证据。
Memex 提出了不同的思路:
工作上下文中只保留任务进度和稳定索引,完整的原始工具输出保存在外部经验数据库中。Agent 需要细节时,通过索引精确取回原始证据。
例如,工作上下文只需要保留:
当前目标:从冰箱中取出苹果。
已归档经验:
- kitchen_objects:厨房中的对象和精确 ID
- fridge_contents:冰箱内容及位置 ID
完整内容则存储在外部数据库:
kitchen_objects -> 完整厨房探索结果
fridge_contents -> 完整冰箱观察结果
当 Agent 需要精确 ID 时,调用:
ReadExperience("fridge_contents")
即可将原始内容重新放回上下文。
在此基础上,论文进一步提出 MemexRL,通过强化学习让 Agent 学会:
- 什么时候压缩上下文;
- 哪些内容只需要写入摘要;
- 哪些原始证据必须完整归档;
- 应该如何为经验设计稳定索引;
- 什么时候需要读取某个索引;
- 什么时候应该直接完成任务。
因此,这篇论文的核心不是“把摘要写得更好”,而是:
将摘要从历史信息的替代品,变成访问完整历史证据的索引目录。
零、论文基本信息
- 论文名称:Memex(RL): Scaling Long-Horizon LLM Agents via Indexed Experience Memory
- 发表平台:arXiv,cs.CL、cs.LG,2026
- 代码仓库:论文当前版本未提供 MemexRL 的公开代码仓库
- 作者信息:Zhenting Wang、Huancheng Chen、Jiayun Wang、Wei Wei,Center for Advanced AI, Accenture
一、背景与问题
1. 长程 Agent 的上下文为什么会失控
普通工具 Agent 通常采用如下循环:
模型推理
↓
生成工具调用
↓
获得工具输出
↓
将输出追加到上下文
↓
继续下一轮推理
假设每轮新增 n t n_t nt 个 token,那么经过 T T T 轮后,完整轨迹长度大致为:
C T = ∑ t = 1 T n t C_T=\sum_{t=1}^{T}n_t CT=t=1∑Tnt
随着任务轮数增加,上下文会持续增长。
这会带来三个问题。
(1)上下文预算有限
当轨迹超过模型上下文窗口后,系统只能截断、压缩或拒绝继续执行。
(2)推理成本增加
即使还没有超过窗口限制,模型也需要处理越来越长的输入,推理延迟和显存占用会随之增加。
(3)原始证据难以重新利用
工具输出可能仍然存在于上下文中,但距离当前决策已经非常远。模型不一定能够准确定位和使用早期信息。
2. 截断为什么不可靠
截断策略通常只保留最近若干轮历史:
删除最早的内容
↓
保留最近的工具交互
但长程任务中的关键信息不一定出现在最近几轮。
例如:
- 用户最初提出的约束;
- 第一次探索时发现的对象 ID;
- 早期命令返回的配置路径;
- 某个已经验证过的失败原因;
- 后续步骤才会用到的 API 返回值。
按照时间删除内容,无法判断信息的长期价值。
3. 摘要为什么仍然会丢失信息
运行摘要比直接截断更智能,因为模型会尝试保留重要信息。
但摘要存在两个问题。
第一,模型在生成摘要时并不知道未来具体需要什么。
当前看起来不重要的字段,可能在几十步后成为必要参数。
第二,摘要更适合保存语义结论,不适合保存大量高精度内容,例如:
- 文件原文;
- 错误堆栈;
- 精确对象 ID;
- SQL 查询结果;
- API JSON;
- 配置文件片段;
- 测试输出。
一旦原始历史被摘要替换,这些细节就无法恢复。
4. 向量检索为什么也不完全适合工具轨迹
传统外部记忆一般采用:
历史片段
↓
向量编码
↓
相似度检索
↓
返回 Top-K 记忆
但工具轨迹中的记忆经常具有以下特点:
- 多条日志语义非常相似;
- 文件片段可能缺少自然语言描述;
- 对象 ID 本身没有明显语义;
- Agent 需要的是精确内容而不是相似内容;
- 多个搜索分支包含大量重复信息。
Memex 因此不使用模糊相似度作为主要访问方式,而是让 Agent 主动创建稳定索引。
如果 Agent 知道自己需要 fridge_contents,就直接读取这个索引,而不是用“苹果在哪里”搜索整个经验库。
二、相关工作
1. 长期事实记忆
Mem0、A-MEM、Zep 等方法主要关注:
- 用户偏好;
- 长期事实;
- 跨会话实体关系;
- 记忆写入、更新和删除;
- 时间关系和图结构。
这类系统解决的是“Agent 如何跨会话记住用户和世界”。
Memex 关注的则是另一个场景:
在单次长程任务中,如何保存几十到上百步工具交互产生的过程证据。
2. 经验记忆
Reflexion、ExpeL、Agent Workflow Memory 等方法会从历史任务中提取:
- 成功策略;
- 失败教训;
- 可复用工作流;
- 环境交互经验。
这些方法更关注跨任务复用。
Memex 中的 Experience 主要指当前任务轨迹中的完整工具输出和中间产物,重点是避免压缩过程中丢失细节。
3. 上下文压缩与折叠
MEM1、Memory-R1、ReSum、SUPO、FoldGRPO、AgentFold 等方法会学习:
- 什么时候压缩;
- 如何总结历史;
- 如何将多个阶段折叠为紧凑状态;
- 如何在动态上下文下进行强化学习。
这类方法能够限制工作上下文,但主要依赖摘要承载过去的信息。
Memex 与它们的区别是:
摘要式方法:
原始历史 → 摘要 → 删除原始历史
Memex:
原始历史 → 摘要 + 稳定索引
↓
完整原文归档
4. Memex 的定位
| 方法 | 上下文中的内容 | 外部保存内容 | 读取方式 |
|---|---|---|---|
| 全历史上下文 | 完整轨迹 | 无 | 直接注意力 |
| 滚动截断 | 最近历史 | 通常无 | 无法恢复 |
| 运行摘要 | 压缩摘要 | 通常无完整原文 | 无法精确恢复 |
| 向量记忆 | 摘要或检索结果 | 历史片段 | 相似度 Top-K |
| MEM1 | 滚动内部状态 | 不强调完整外部轨迹 | 状态递推 |
| Memex | 任务状态和索引目录 | 完整经验块 | 精确索引解引用 |
三、方法总览
为了理解 Memex 如何将长轨迹转换成“摘要 + 索引”,可以先看论文 Figure 1。

图源:论文 Figure 1。
左侧是不断增长的工具交互轨迹。调用CompressExperience后,工作上下文被替换为紧凑的 Indexed Summary,完整内容写入外部键值库。之后,Agent 可以通过ReadExperience(index)精确取回某段原始经验。
Memex 系统由四部分组成:
- Agent 策略模型;
- 动态工作上下文;
- 外部经验数据库;
- 两个记忆工具。
完整流程为:
执行环境工具
↓
积累推理、动作和观察
↓
监控上下文长度
↓
调用 CompressExperience
├── 生成紧凑任务状态
├── 创建索引目录
└── 将完整证据写入外部数据库
↓
继续执行任务
↓
需要旧证据时调用 ReadExperience(index)
↓
精确取回对应内容
↓
继续推理或完成任务
MemexRL 则负责使用强化学习优化整个循环中的记忆读写行为。
四、核心模块详解
4.1 工作上下文与外部经验库
1. 工作上下文
论文将 Agent 的完整输入表示为:
M = [ m 0 , u , M w o r k ] \mathbf{M}=[m_0,u,\mathbf{M}_{\mathrm{work}}] M=[m0,u,Mwork]
其中:
- m 0 m_0 m0 是固定系统提示词;
- u u u 是用户任务;
- M w o r k \mathbf{M}_{\mathrm{work}} Mwork 是动态工作上下文。
系统提示词和原始任务不会被压缩。
动态工作上下文可能包含:
- Indexed Summary;
- 中间推理;
- 工具调用;
- 工具输出;
- 重新读取的经验块。
2. 外部经验数据库
外部数据库是一个键值映射:
D : i n d e x ↦ c o n t e n t \mathcal{D}:\mathsf{index}\mapsto\mathsf{content} D:index↦content
例如:
kitchen_map
→ 完整厨房探索结果
fridge_objects
→ 冰箱中全部对象和精确 ID
failed_attempt_1
→ 第一次失败命令及错误信息
这里的索引由 Agent 主动生成,而不是自动计算的向量 ID。
3. 为什么使用稳定索引
稳定索引相当于 Agent 自己创建的文件名或书签。
它有三个作用:
- 告诉 Agent 归档内容是什么;
- 为未来读取提供确定地址;
- 避免在大量相似历史中执行模糊检索。
向量检索回答的是:
哪些历史片段和当前问题相似?
索引解引用回答的是:
把我之前保存为 fridge_objects 的那段原始内容取回来。
后者更适合精确工具参数和原始证据。
4.2 Indexed Summary
1. 定义
论文将 Indexed Summary 定义为:
σ = ( s , I ) \sigma=(s,\mathcal{I}) σ=(s,I)
其中:
- s s s 是紧凑、可行动的任务进度;
- I \mathcal{I} I 是索引及其描述的集合。
索引集合表示为:
I = { ( i n d e x , d e s c r i p t i o n ) } \mathcal{I}=\{(\mathsf{index},\mathsf{description})\} I={(index,description)}
2. 任务进度应该保存什么
任务进度 s s s 适合保存:
- 当前目标;
- 已完成步骤;
- 已确认结论;
- 当前计划;
- 仍未解决的问题;
- 必须持续满足的约束。
例如:
## 当前目标
将苹果放入微波炉并加热。
## 已确认状态
- 已找到苹果所在的冰箱。
- 已发现微波炉,但尚未打开。
- 下一步需要取出苹果。
## 关键限制
- `look` 操作已经使用,不能再次调用。
3. 索引目录应该保存什么
索引目录不需要包含完整内容,只需要让 Agent 知道每个索引可以取回什么。
## Indexed Experience
- `room_layout`
- 第一次 look 返回的完整房间结构和位置 ID。
- `fridge_contents`
- 冰箱内部对象、苹果 ID 和容器 ID。
- `failed_pickup`
- 第一次取苹果失败时的完整命令和环境错误。
4. 与普通摘要的区别
普通摘要可能直接写:
苹果位于冰箱中。
Indexed Summary 则写:
苹果位于冰箱中。精确对象 ID 和冰箱位置 ID 保存在 `fridge_contents`。
后者既保留了当前决策所需的语义状态,也保留了恢复精确信息的路径。
4.3 CompressExperience
1. 功能
压缩工具表示为:
CompressExperience(
IndexedSummary,
MemoryBlocks
)
其中:
IndexedSummary用于替换当前工作上下文;MemoryBlocks是需要写入外部数据库的经验块。
每个经验块包括:
(index, content)
系统将经验块写入数据库:
D [ i n d e x ] ← c o n t e n t \mathcal{D}[\mathsf{index}]\leftarrow\mathsf{content} D[index]←content
然后重写上下文:
M ← [ m 0 , u , I n d e x e d S u m m a r y ] \mathbf{M}\leftarrow[m_0,u,\mathsf{IndexedSummary}] M←[m0,u,IndexedSummary]
旧的推理、工具调用和工具输出会离开工作上下文,但需要保留的完整内容已经进入外部经验库。
2. 显式写入模式
第一种归档方式是由模型直接生成 db_content。
例如:
{
"db_index": "verified_constraints",
"db_content": "用户要求:不得修改数据库 Schema;必须兼容 Python 3.11。"
}
这种方式适合:
- 重新组织笔记;
- 合并多个结论;
- 保存结构化经验;
- 删除无关细节。
但它仍然可能发生改写错误或信息遗漏。
3. 锚点抽取模式
第二种方式是指定三个文本锚点:
start_anchor
mid_anchor
end_anchor
系统在当前上下文中定位对应文本范围,并将原始内容逐字保存。
mid_anchor 用作校验点,降低锚点匹配到错误片段的风险。
这种方式适合保存:
- 代码片段;
- 完整错误堆栈;
- 命令输出;
- 对象 ID;
- JSON 响应;
- 测试日志。
它的优势是模型不需要重新生成长文本,可以直接归档原文。
4. 为什么需要两种写入模式
| 写入模式 | 优点 | 风险 | 适用内容 |
|---|---|---|---|
| 显式生成 | 可以整理和压缩 | 可能改写错误 | 结论、计划、经验 |
| 锚点抽取 | 保留原始内容 | 依赖锚点唯一性 | 日志、代码、精确 ID |
两种模式组合后,Memex 可以同时保存语义和证据:
语义状态进入摘要
原始证据进入经验块
4.4 ReadExperience
读取工具表示为:
KaTeX parse error: Undefined control sequence: \textsc at position 1: \̲t̲e̲x̲t̲s̲c̲{ReadExperience…
系统根据索引获取经验:
o t ← D [ i n d e x ] o_t\leftarrow\mathcal{D}[\mathsf{index}] ot←D[index]
然后将内容追加到当前上下文:
M ← M ⊕ [ o t ] \mathbf{M}\leftarrow\mathbf{M}\oplus[o_t] M←M⊕[ot]
例如,Agent 当前只知道:
苹果的精确 ID 保存在 `fridge_contents`。
调用:
ReadExperience("fridge_contents")
后,完整工具输出重新进入上下文:
You see:
- apple_17
- lettuce_8
- bottle_3
Container: fridge_4
Agent 就可以生成精确动作:
take apple_17 from fridge_4
读取完成后,Agent 后续仍然可以再次压缩,将这次读回的内容移出工作上下文。
4.5 Memex Agent 循环
Memex 的工具集合包括:
KaTeX parse error: Undefined control sequence: \textsc at position 15: \mathcal{T}=\{\̲t̲e̲x̲t̲s̲c̲{CompressExperi…
每一步执行流程如下:
读取当前上下文状态
↓
生成推理和工具调用
↓
判断工具类型
├── CompressExperience:归档并重写上下文
├── ReadExperience:读取经验块
├── Finish:提交最终答案
└── OtherTool:执行环境动作
初始化时:
M ← [ m 0 , u ] \mathbf{M}\leftarrow[m_0,u] M←[m0,u]
D ← ∅ \mathcal{D}\leftarrow\varnothing D←∅
其中,系统提示词和任务始终保留,外部经验库从空状态开始。
这也意味着论文中的 Memex 主要是单任务、单轨迹经验记忆,不是自动跨任务积累的长期经验库。
4.6 软压缩触发
1. 固定阈值的问题
一种简单方案是:
上下文超过 8000 token
↓
系统强制压缩
这种方式虽然稳定,却忽略了任务语义。
例如:
- Agent 可能只差一步就完成任务,此时压缩反而浪费一次调用;
- 某个自然任务阶段已经结束,即使只有 6000 token,也适合提前归档;
- 当前上下文虽然很长,但正在使用其中多个相关证据,不适合立即压缩。
2. ContextStatus
Memex 在每轮向 Agent 提供上下文状态:
[Context Status:
working=6932,
total=7120,
threshold=8000]
当工作上下文接近或超过阈值时,系统还会加入额外警告。
但系统不会直接替 Agent 调用压缩工具,是否压缩仍由策略模型决定。
3. 学习压缩时机
通过这种软触发机制,Agent 需要学习:
- 当前是否已经形成自然阶段边界;
- 是否有必要先归档精确证据;
- 任务是否即将完成;
- 当前上下文是否已经影响推理;
- 是否应该先读取某个旧经验,再统一压缩。
因此,压缩不再只是 token 数量规则,而是策略的一部分。
4.7 MemexRL 奖励设计
1. 总体奖励
MemexRL 使用 GRPO 风格的策略优化。
一条轨迹的总回报为:
R = R t a s k − P c o n t e x t − P r e d u n d a n c y − P f o r m a t R=R_{\mathrm{task}}-P_{\mathrm{context}}-P_{\mathrm{redundancy}}-P_{\mathrm{format}} R=Rtask−Pcontext−Predundancy−Pformat
其中:
- R t a s k R_{\mathrm{task}} Rtask 是任务成功奖励;
- P c o n t e x t P_{\mathrm{context}} Pcontext 是上下文超限惩罚;
- P r e d u n d a n c y P_{\mathrm{redundancy}} Predundancy 是重复工具调用惩罚;
- P f o r m a t P_{\mathrm{format}} Pformat 是工具格式错误惩罚。
2. 上下文超限惩罚
设第 t t t 步的工作上下文长度为 C t C_t Ct,目标阈值为 τ \tau τ,总步数为 T T T:
P c o n t e x t = min ( 1 , ∑ t = 1 T max ( 0 , C t − τ ) τ T ) P_{\mathrm{context}}=\min\left(1,\frac{\sum_{t=1}^{T}\max(0,C_t-\tau)}{\tau T}\right) Pcontext=min(1,τT∑t=1Tmax(0,Ct−τ))
当上下文超过阈值时,超出的 token 越多、持续时间越长,惩罚越大。
这个奖励鼓励 Agent 主动压缩,而不是等到系统无法继续处理时才行动。
3. 重复工具调用惩罚
设 N r e d u n d a n t N_{\mathrm{redundant}} Nredundant 是重复工具调用次数, N t o o l _ c a l l N_{\mathrm{tool\_call}} Ntool_call 是非记忆工具调用总数:
P r e d u n d a n c y = N r e d u n d a n t N t o o l _ c a l l P_{\mathrm{redundancy}}=\frac{N_{\mathrm{redundant}}}{N_{\mathrm{tool\_call}}} Predundancy=Ntool_callNredundant
重复调用指:
- 工具名称相同;
- 参数相同;
- 两次调用之间没有发生状态修改。
例如,Agent 已经读取过同一文件区域,在文件没有修改的情况下再次读取,就可能被判定为冗余。
这个惩罚鼓励 Agent:
不要重复执行环境工具
而是读取之前归档的结果
4. 格式错误惩罚
格式错误包括:
<tool_call>标签不闭合;- JSON 无法解析;
- 缺少工具名称;
- 缺少必要参数。
设格式错误次数为 N m a l f o r m e d N_{\mathrm{malformed}} Nmalformed:
P f o r m a t = N m a l f o r m e d N t o o l _ c a l l P_{\mathrm{format}}=\frac{N_{\mathrm{malformed}}}{N_{\mathrm{tool\_call}}} Pformat=Ntool_callNmalformed
这个信号主要用于提升基础模型的工具调用可靠性。
5. 奖励设计的实际含义
MemexRL 并不是只奖励“压缩得更短”。
它要求策略同时满足:
任务成功
+
上下文不过度增长
+
不重复执行工具
+
正确调用记忆工具
如果压缩很激进,但丢失了完成任务所需的信息,最终任务奖励会下降。
如果完全不压缩,即使完成任务,也会受到上下文超限惩罚。
4.8 分段轨迹训练
1. 为什么不能将完整轨迹直接训练
调用 CompressExperience 后,Agent 的上下文会被重写。
压缩前:
system
+ task
+ 历史推理
+ 历史工具调用
+ 历史工具输出
压缩后:
system
+ task
+ Indexed Summary
+ 新的交互
后续 token 实际上不是基于完整历史生成,而是基于新摘要生成。
如果训练时将整个轨迹当作连续上下文,就会造成训练条件与真实 rollout 不一致。
2. 按压缩边界切分
假设一条轨迹发生了 k k k 次压缩,MemexRL 将其切分为:
{ S 0 , S 1 , … , S k } \{S_0,S_1,\ldots,S_k\} {S0,S1,…,Sk}
其中:
- S 0 S_0 S0 包含第一次压缩前的完整历史;
- S i S_i Si 包含上一个阶段生成的摘要和当前阶段的新交互。
对于 i > 0 i>0 i>0:
S i = [ s y s t e m , t a s k , s u m m a r y i − 1 , z i 1 , c i 1 , o i 1 , … ] S_i=[\mathrm{system},\mathrm{task},\mathrm{summary}_{i-1},z_{i1},c_{i1},o_{i1},\ldots] Si=[system,task,summaryi−1,zi1,ci1,oi1,…]
其中:
- z i j z_{ij} zij 表示推理;
- c i j c_{ij} cij 表示动作或工具调用;
- o i j o_{ij} oij 表示环境返回结果。
3. 如何保留延迟信用分配
训练时,每个片段根据自己的真实上下文独立计算。
但同一条完整轨迹产生的所有片段共享最终回报 R R R。
因此,第一次压缩产生的索引即使在几十步后才被使用,仍然能够通过最终任务结果获得学习信号。
这解决了记忆策略中的核心困难:
创建索引的价值通常不会立刻显现,而要等未来真正读取时才能判断。
4.9 GRPO 策略优化
对于同一个训练任务,MemexRL 采样 G G G 条轨迹,并根据组内回报计算标准化优势:
A ( g ) = R ( g ) − m e a n ( { R ( h ) } h = 1 G ) s t d ( { R ( h ) } h = 1 G ) + ϵ A^{(g)}=\frac{R^{(g)}-\mathrm{mean}(\{R^{(h)}\}_{h=1}^{G})}{\mathrm{std}(\{R^{(h)}\}_{h=1}^{G})+\epsilon} A(g)=std({R(h)}h=1G)+ϵR(g)−mean({R(h)}h=1G)
其中:
- R ( g ) R^{(g)} R(g) 表示第 g g g 条轨迹的回报;
- A ( g ) A^{(g)} A(g) 表示相对于同组其他轨迹的优势。
如果某条轨迹:
- 更早在合适位置压缩;
- 创建了更清晰的索引;
- 避免了重复探索;
- 在需要时正确读取经验;
- 最终完成任务;
那么它相对于同组其他轨迹会获得更高优势。
论文先使用监督示范进行 Warm Start,让模型学会生成合法的 Indexed Summary 和 Memory Blocks,再用 RL 优化读写策略。
这说明 MemexRL 并不是完全从零探索复杂记忆工具格式。
五、理论分析
论文进一步讨论:在什么条件下,Memex 能同时保持任务质量和有界上下文?
5.1 有界解引用下的决策充分性
设完整历史为:
M t f u l l M_t^{\mathrm{full}} Mtfull
Memex 当前状态由两部分组成:
( σ t , D t ) \left(\sigma_t,D_t\right) (σt,Dt)
其中:
- σ t \sigma_t σt 是 Indexed Summary;
- D t D_t Dt 是外部经验数据库。
如果存在索引选择器 g g g,每一步最多选择 B B B 个索引,并且摘要加上这些索引内容足以恢复最优决策,那么:
∣ g ( σ t ) ∣ ≤ B |g(\sigma_t)|\leq B ∣g(σt)∣≤B
并且:
π ∗ ( ⋅ ∣ M t f u l l ) = μ ( ⋅ ∣ σ t , { D t [ i ] } i ∈ g ( σ t ) ) \pi^{*}(\cdot\mid M_t^{\mathrm{full}})=\mu\left(\cdot\mid\sigma_t,\{D_t[i]\}_{i\in g(\sigma_t)}\right) π∗(⋅∣Mtfull)=μ(⋅∣σt,{Dt[i]}i∈g(σt))
此时,Memex 策略可以达到和完整上下文最优策略相同的期望回报:
J ( π I E M ) = J ( π ∗ ) J(\pi_{\mathrm{IEM}})=J(\pi^{*}) J(πIEM)=J(π∗)
直观理解是:
如果当前决策只依赖少量关键历史证据,那么摘要只需要告诉 Agent 去读取哪些证据,不需要把全部历史塞进上下文。
5.2 工作上下文有界
设:
- 摘要长度不超过 τ σ \tau_{\sigma} τσ;
- 每步最多读取 B B B 个经验块;
- 每个经验块长度不超过 L L L。
那么工作上下文长度满足:
C t w o r k ≤ τ σ + B L C_t^{\mathrm{work}}\leq\tau_{\sigma}+BL Ctwork≤τσ+BL
因此,无论完整历史如何增长,只要摘要、读取数量和经验块大小有界,工作上下文就可以保持有界。
压缩比定义为:
ρ t = C t f u l l C t w o r k \rho_t=\frac{C_t^{\mathrm{full}}}{C_t^{\mathrm{work}}} ρt=CtworkCtfull
随着完整历史继续增长,而工作上下文保持有界,理论压缩比可以持续增加。
需要注意的前提
这些命题证明的是 Memex 架构“存在这种可能性”,并不证明 MemexRL 在所有任务中都能自动学到决策充分的摘要。
理论成立依赖以下假设:
- 摘要确实保存了正确的索引目录;
- Agent 能选择正确索引;
- 每步只需要有限数量的历史证据;
- 单个经验块大小有界;
- 历史依赖可以被少量索引覆盖。
如果任务需要同时比较大量历史记录,工作上下文仍然可能增长。
六、实验设置
6.1 基础模型
论文使用:
Qwen3-30B-A3B-Thinking-2507
这是一个 MoE 模型:
- 总参数约 30B;
- 每层 128 个专家;
- Top-8 路由;
- 每个 token 激活约 3B 参数。
论文选择该模型的原因是它在 RL 训练前已经具有较好的工具理解和指令遵循能力,能够初步使用 CompressExperience 和 ReadExperience。
6.2 实验环境
论文使用经过修改的 ALFWorld。
原始 ALFWorld 是一个文本交互环境,Agent 需要在房间中:
- 探索位置;
- 查找对象;
- 操作容器;
- 搬运物品;
- 完成指定任务。
为了强化对长程记忆的依赖,论文进行了四项修改。
1. 隐藏合法动作
原始环境会提供所有可执行动作及精确对象 ID。
论文删除了这些信息,要求 Agent 通过探索发现合法动作。
2. 隐藏初始房间观察
初始房间描述和位置 ID 不再自动提供。
Agent 必须主动调用 look 才能获取环境信息。
3. look 只能调用一次
第一次 look 后,Agent 无法再次通过环境获得完整房间信息。
如果后续忘记位置 ID,只能通过 ReadExperience 读取之前归档的内容。
4. 摘要限制为 300 token
CompressExperience 生成的摘要会被截断到 300 token。
这迫使 Agent 将对象 ID 等详细内容写入经验块,而不是全部塞进摘要。
训练集包含 3553 个任务。
6.3 训练设置
- RL 框架:Slime;
- Rollout 推理:INT4 量化;
- 训练:量化感知训练;
- 前向权重:INT4;
- 梯度累积:BF16;
- 优化器:Adam;
- 学习率: 5 × 10 − 6 5\times10^{-6} 5×10−6;
- Weight Decay:0.1;
- KL 系数:0.001;
- TIS Clip Ratio:2.0;
- 模型上下文窗口:32K;
- 上下文惩罚阈值:8K;
- Batch Size:32;
- GRPO Group Size:8。
七、实验结果与分析
7.1 训练过程
论文 Figure 2 显示,在训练 rollout 中,任务成功率从约 20% 提升到 90% 以上。
Figure 3 显示,总惩罚从约 − 0.4 -0.4 −0.4 降低到约 − 0.1 -0.1 −0.1。
这说明模型同时学到了:
- 更好的环境任务策略;
- 更低的上下文超限;
- 更少的重复调用;
- 更规范的工具格式。
不过,训练 rollout 上超过 90% 并不等同于最终测试集结果。正式评估结果应以 Figure 4 为准。
7.2 最终任务成功率
论文 Figure 4(a) 展示了 MemexRL 的最终效果。

图源:论文 Figure 4(a)。
在相同 Memex Agent 接口下,经过 MemexRL 训练后,任务成功率从 24.22% 提升到 85.61%。
| 方法 | 任务成功率 |
|---|---|
| Memex,未经过 MemexRL | 24.22% |
| Memex + MemexRL | 85.61% |
任务成功率提升超过 3.5 倍。
这说明仅仅提供记忆工具并不够。未经过强化学习的 Agent 虽然能够调用压缩和读取工具,却不一定知道:
- 应该何时压缩;
- 索引应该如何命名;
- 哪些信息需要原文保存;
- 哪些索引值得读取;
- 当前应该继续探索还是恢复历史信息。
需要特别注意,论文比较的是:
Memex Agent without RL
vs.
Memex Agent with RL
它不是 Memex 与 MEM1、ReSum、FoldGRPO 或普通全上下文 Agent 的横向比较。
因此,3.5 倍提升主要说明 MemexRL 对该记忆接口的训练有效,不能直接证明 Memex 架构全面优于其他记忆方法。
7.3 峰值工作上下文
论文 Figure 4(b) 展示了峰值工作上下文。

图源:论文 Figure 4(b)。
MemexRL 将峰值工作上下文从约 16934 token 降低到约 9634 token,下降约 43%。
| 方法 | 峰值工作上下文 |
|---|---|
| Memex,未经过 MemexRL | 16934.46 token |
| Memex + MemexRL | 9634.47 token |
训练时设置的惩罚阈值为 8000 token。
经过训练后,峰值上下文虽然明显下降,但仍然高于 8000。这说明阈值是软约束而不是硬上限。
Agent 可以在以下情况下暂时超过阈值:
- 刚刚读取了较长经验块;
- 当前任务即将结束;
- 立即压缩会损害任务表现;
- 当前需要同时使用多段证据。
这也说明 Memex 的目标不是把上下文强行压到最短,而是在任务成功与上下文成本之间取得平衡。
7.4 记忆工具行为变化
论文 Figure 5 展示了训练过程中两种记忆工具的使用变化。
压缩调用次数:

读取调用次数:

图源:论文 Figure 5。
训练后,平均压缩次数从约 6.5 次下降到约 3 次,而平均读取次数从约 1 次增加到 6–7 次。
这个结果比较反直觉。
如果只看上下文控制,可能会认为 Agent 应该学习更频繁地压缩。
但 MemexRL 学到的是:
更少但更有意义的压缩
+
更频繁、更精确的证据恢复
未经训练的模型倾向于反复生成摘要,却没有真正利用已经归档的内容。
经过 RL 后,Agent 更像是在建立可复用的资料目录:
- 在自然阶段边界执行压缩;
- 创建较稳定的经验索引;
- 后续需要细节时主动读取;
- 避免重新执行已经完成的探索。
因此,MemexRL 的效果不是来自“摘要更多”,而是来自“索引和读取更有效”。
八、局限性与未来方向
1. 实验环境比较单一
论文只在修改后的 ALFWorld 上进行了主要实验。
尚未验证:
- 代码 Agent;
- Web 搜索 Agent;
- Deep Research;
- API 工作流;
- 桌面操作;
- 长期对话;
- 多模态任务。
因此,目前还不能确定索引经验记忆能否在不同类型的长程任务中保持相同收益。
2. 环境被专门设计为依赖 ReadExperience
论文限制 look 只能调用一次,并将摘要截断为 300 token。
这确实能够检验索引读取能力,但也使环境天然偏向 Memex:
- 精确位置 ID 必须从历史恢复;
- 普通摘要难以容纳所有 ID;
- 重复探索被环境禁止;
- ReadExperience 成为主要恢复通道。
因此,这组实验更适合证明 MemexRL 能学会使用索引经验,而不是证明所有真实 Agent 都需要同样的架构。
3. 缺少与其他方法的横向比较
正式结果只比较 MemexRL 训练前后,没有系统对比:
- 全历史上下文;
- 简单截断;
- 运行摘要;
- 向量检索;
- MEM1;
- ReSum;
- FoldGRPO;
- AgentFold。
因此,无法从当前实验判断 85.61% 是否优于其他长程上下文管理方法。
4. 缺少组件消融实验
论文没有分别量化以下模块的贡献:
- 稳定索引;
- 外部完整经验库;
- 锚点抽取;
- ContextStatus;
- 上下文惩罚;
- 重复工具惩罚;
- 格式惩罚;
- 分段轨迹训练;
- SFT Warm Start。
因此,当前还不清楚提升主要来自:
- 记忆架构;
- 强化学习;
- 环境设计;
- 奖励塑形;
- 工具调用格式训练
中的哪一部分。
5. 外部经验库仍然会持续增长
Memex 控制的是工作上下文,而不是总存储规模。
如果完整工具输出不断归档:
∣ D t ∣ → ∞ |\mathcal{D}_t|\rightarrow\infty ∣Dt∣→∞
那么系统仍然需要解决:
- 索引数量增长;
- 重复经验合并;
- 过期数据删除;
- 索引命名冲突;
- 经验块版本管理;
- 存储成本;
- 隐私和审计。
6. 索引错误会导致记忆不可达
Memex 不依赖模糊检索,优点是读取精确,缺点是需要 Agent 记住正确索引。
如果 Indexed Summary 中:
- 漏掉某个索引;
- 索引描述不清;
- 两个索引名称过于相似;
- 索引被错误覆盖;
- 描述与实际内容不一致;
那么完整证据虽然还在数据库中,Agent 也可能无法找到。
7. 经验可能过期
论文关注单条任务轨迹中的经验,没有讨论经验的时间有效性。
如果 Memex 扩展到跨天或跨任务长期记忆,就需要处理:
- 文件已经被修改;
- API 数据已经变化;
- 用户偏好已经更新;
- 环境对象已经不存在;
- 旧测试结果不再适用于当前代码。
稳定索引保证的是“能够找回旧证据”,不保证旧证据现在仍然有效。
8. 理论结论依赖较强假设
理论分析假设:
- 摘要具有决策充分性;
- 每步只需读取有限数量的经验块;
- 经验块长度有界;
- Agent 能选择正确索引。
这些条件本身正是实际系统最难保证的部分。
因此,理论结果说明架构在理想条件下可以扩展,不代表强化学习一定能在所有任务中学到满足条件的策略。
9. 需要监督数据进行 Warm Start
论文先使用监督示范让模型学会合法的摘要和经验块格式,再进行强化学习。
这意味着工程落地仍然需要:
- 高质量示范轨迹;
- 索引设计样例;
- 正确的工具格式;
- 合理的归档策略。
MemexRL 并不是完全不依赖人工设计。
九、我的理解和启发
1. 摘要不应该替代原始证据
这篇论文最重要的启发是:
摘要应该回答“当前进展是什么”,索引应该回答“详细证据在哪里”。
一个更合理的 Agent 工作状态可以分成两层。
控制层
## 当前目标
## 已完成步骤
## 当前计划
## 未解决问题
## 关键约束
证据索引层
## Experience Index
- `test_failure_before_fix`
- `database_schema`
- `api_response_user_17`
- `config_file_original`
这样既能让 Agent 快速理解当前状态,又不会永久丢失精确证据。
2. Memex 更像文件系统,而不是向量数据库
向量数据库的使用方式是:
我不知道内容在哪里
↓
通过语义相似度搜索
Memex 的使用方式是:
我知道之前将它保存为什么
↓
通过稳定索引直接读取
它更像:
- 文件路径;
- 数据库主键;
- URL;
- 书签;
- 笔记编号。
这也解释了为什么论文称其为 Indexed Experience Memory。
3. 精确检索和模糊检索可以结合
实际 Agent 不一定要在稳定索引和向量检索之间二选一。
可以采用混合方案:
Indexed Summary
↓
优先按索引精确读取
↓
索引不存在或不确定
↓
再使用语义检索搜索经验库
这样既保留稳定索引的确定性,也避免索引目录丢失后经验完全不可达。
4. 记忆写入应该围绕未来工具调用设计
传统摘要关注:
过去发生了什么?
Memex 风格的记忆写入更关注:
未来执行动作时可能需要哪些精确参数?
例如,代码 Agent 应优先完整保存:
- 错误堆栈;
- 测试命令;
- 修改前文件内容;
- 关键函数签名;
- 数据库 Schema;
- API 响应;
- 构建日志。
而当前工作上下文只保留:
- 当前问题;
- 已确认根因;
- 修改计划;
- 证据索引。
5. 可以如何应用到自己的 Agent
不训练 MemexRL,也可以先实现简化版本。
外部经验库:
{
"repo_structure": "...完整目录树...",
"initial_test_failure": "...完整测试输出...",
"auth_service_source": "...原始代码片段...",
"patched_test_result": "...修改后的测试结果..."
}
工作状态:
## 当前任务
修复用户登录失败问题。
## 当前结论
问题位于 token 过期时间计算。
## 已完成
- 已定位 AuthService。
- 已复现失败测试。
- 已修改时间单位。
## 下一步
运行完整认证测试。
## Experience Index
- `repo_structure`:项目目录和认证模块位置。
- `initial_test_failure`:修改前完整错误日志。
- `auth_service_source`:修改前 AuthService 原始代码。
- `patched_test_result`:局部测试结果。
当需要重新比较修改前代码时,再读取:
ReadExperience("auth_service_source")
6. 需要增加索引生命周期管理
如果用于生产环境,我会在 Memex 基础上增加:
- 唯一索引命名规范;
- 索引创建时间;
- 来源工具和参数;
- 内容哈希;
- 数据版本;
- 有效期;
- 是否可覆盖;
- 访问次数;
- 最后访问时间;
- 敏感数据等级。
例如:
{
"index": "auth_service_source_v1",
"description": "修改前 AuthService 完整实现",
"source_tool": "read_file",
"source_path": "src/auth/service.py",
"created_at": "2026-08-05T10:30:00",
"content_hash": "sha256:...",
"status": "superseded",
"superseded_by": "auth_service_source_v2"
}
7. 与其他记忆方法的联系
| 方法 | 核心思想 | 更适合解决的问题 |
|---|---|---|
| Mem0 | 事实生命周期管理 | 用户事实如何更新 |
| A-MEM | 动态关联记忆 | 记忆如何形成网络 |
| APEX-MEM | 追加式时间事件图 | 冲突事实如何按时间解析 |
| MEM1 | 滚动内部状态 | 如何控制当前任务上下文 |
| Memex | 摘要索引 + 原始证据库 | 如何压缩上下文且保留精确证据 |
| MemexRL | 学习记忆读写策略 | 何时存、如何索引、何时取 |
MEM1 和 Memex 看起来相似,但有一个关键区别:
MEM1:
将历史整合到新的内部状态,旧内容被丢弃。
Memex:
将历史整合到 Indexed Summary,
但完整内容仍然通过索引保存在外部。
因此,MEM1 更轻量,Memex 的可恢复性更强。
十、总结
Memex 提出了一种索引经验记忆机制,将 Agent 的记忆拆成:
紧凑工作上下文
+
完整外部经验库
工作上下文保存:
- 当前任务状态;
- 已验证结论;
- 后续计划;
- 稳定经验索引。
外部经验库保存:
- 完整工具输出;
- 原始日志;
- 代码片段;
- 对象 ID;
- 其他精确证据。
Agent 通过两个工具管理记忆:
CompressExperience
→ 压缩工作上下文并归档经验
ReadExperience
→ 通过索引取回完整证据
MemexRL 则使用强化学习优化:
- 压缩时机;
- 摘要内容;
- 归档内容;
- 索引命名;
- 读取时机;
- 工具调用效率。
在修改后的 ALFWorld 中,MemexRL:
- 将任务成功率从 24.22% 提升到 85.61%;
- 将峰值工作上下文从 16934.46 token 降低到 9634.47 token;
- 将平均压缩次数从约 6.5 次降低到约 3 次;
- 将平均读取次数从约 1 次提高到约 6–7 次。
实验说明,训练后的 Agent 并不是更频繁地压缩,而是学会了:
更有选择地归档,并在真正需要时主动恢复精确证据。
不过,论文目前只在专门修改的 ALFWorld 环境中验证,也没有与其他上下文压缩方法进行系统横向比较。
对实际 Agent 开发而言,Memex 最有价值的启发是:
不要让摘要承担保存全部历史细节的职责。摘要应该维护当前控制状态,而完整证据应该保存在外部,并通过稳定、可审计的索引按需恢复。
参考资料
- Wang Z., Chen H., Wang J., Wei W. Memex(RL): Scaling Long-Horizon LLM Agents via Indexed Experience Memory. arXiv, 2026.
更多推荐



所有评论(0)