LLM Agent 每次遇到相似任务都要重新试错,前面踩过的坑不会自动变成下一次的捷径。 Memp 把成功轨迹和从轨迹里提炼出的脚本存进一个外部记忆库,让新任务先检索「怎么做」,再用失败反馈修正记忆。 它不在模型参数里写记忆,改变的是任务开始前塞进上下文的那一段经验。
Agent 的瓶颈常常不是单步推理,而是每个新任务都从零开始。论文把「知道怎么做」的程序记忆做成一个外部仓库:过去的轨迹先被提炼成可复用的步骤或脚本,下一次任务开始时再检索出来放进上下文。
论文没有提出新的网络结构,而是把记忆的生命周期拆成三个可做消融的决策:Build(存 Script、Trajectory,还是两者相加的 Proceduralization)、Retrieve(Query 还是 AveFact 关键词做向量检索)、Update(Vanilla、Validation,还是失败后反思修正的 Adjustment)。
在 ALFWorld 上,GPT-4o 的 Test 成功率从 42.14% 到 77.86%,平均步数从 23.76 到 15.01;TravelPlanner 的 #CS 也从 71.93 到 79.94。但 #HC 反而从 12.88 降到 9.76——记忆不是每个指标都加分。
迁移实验里,GPT-4o 的记忆给 Qwen2.5-14B 用,TravelPlanner 的 Delivery 从 91.4 到 96.6,平均步数从 16.9 到 15.3;检索条数从 0 加到 10 时 Final Score 从 40.7 升到 82.5,继续加到 20 又回落到 79.3。
读完这节应该知道:论文要优化的不是「存什么」,而是「怎么把一次探索变成下一次任务开始时就能用的起点」。
在 ALFWorld 里找鸡蛋、用微波炉加热、再丢进垃圾桶,或者在 TravelPlanner 里排一条同时满足预算、时间和常识约束的行程,往往要几十步。Agent 在过程中会积累大量关于环境的知识:东西通常放在哪里、哪个动作会失败、哪条工具调用顺序能走通。但下一次遇到同类任务,这些知识大多没有被保留下来。
论文把一次任务写成一条轨迹(Eq. 1),并用环境给出的奖励判断它是否完成(Eq. 2):
认知科学把这种「知道怎么做」的长时记忆称为 procedural memory,与「知道是什么」的 declarative memory 区分。论文借用这个概念,把 Agent 的程序记忆定义成一个可编辑的仓库:每条记忆 mp 由轨迹 τ 和奖励 r 经过一个 builder B 生成(Eq. 3)。
原始轨迹又长又具体,直接塞回上下文会占用大量 token;一旦环境细节变化,逐字复制的动作序列就可能失效。 如果只用一句抽象总结,又会丢掉「先做什么、后做什么、失败了怎么退」这些真正有用的步骤。 论文要在这两极之间找一个可操作的存储形态,并且回答:新经验进来时,什么时候该追加、什么时候该丢弃、什么时候该修正旧记忆?
更麻烦的是,记忆不是「越多越好」。检索错了会引入无关内容,更新错了会把错误经验写回仓库。 论文在 Introduction 里把这一点说得直接:
“Restarting from scratch every time is a punishing ordeal for present-day agents.”(§1)
所以问题不只是「给 Agent 加一个记忆模块」,而是给记忆的生命周期建立一套可比较、可衡量的策略。这正是 Memp 的切口。
前人分成两路:一路搭记忆架构,一路从经验里学习;两路都留下了「怎么建、怎么检、怎么改」的空档。
LangGraph、AutoGPT、Memory Bank、Soar 这类系统提供了粗粒度的抽象:buffer、rule chunk、production system。 它们能存东西,但论文指出,这些工作把程序记忆的生命周期操作——技能如何被构建、索引、修补、最终剪枝——基本留在了考察之外。
“leave the optimization of procedural memory life-cycle operations about how skills are built, indexed, patched, and eventually pruned, largely unexamined.”(§1)
另一路用强化学习、experience replay、imitation learning、memory management 让 Agent 从交互中改进。 这些方法能更新行为,但常见问题是样本效率低、跨任务泛化差、学新东西时灾难性遗忘,而且专门针对记忆更新的机制很少。
“low sample efficiency, poor generalization across tasks, catastrophic forgetting when learning new information, and there are few features for memory update.”(§2)
在程序记忆这个更窄的圈子里,Voyager、AWM、AutoManual 已经用技能库或操作手册提升过同类任务的表现。 但论文认为,这些工作仍然缺少对「如何构建、如何检索、如何更新程序记忆」的系统分析:
“there still lacks a systematic analysis on how to construct, retrieve, and update such procedural memory”(§2)
Memp 是一个 task-agnostic 的框架,把程序记忆当成一等优化对象:记忆存在模型外部,模型参数不动;每次任务开始时检索记忆,任务结束后按策略更新仓库。 论文的主要贡献不是某个单点技巧,而是把 Build / Retrieve / Update 三个模块拆开,分别做可复现的对照实验。
这一节是全页的核心:三种构建形态、三种检索 key、三种更新策略,以及它们各自的代价。
Memp 没有新的网络层。它把 Agent 的程序记忆写成一个集合(Eq. 3),每条记忆由 builder B 从轨迹和奖励中生成:
论文比较了三种构建形态,外加一个完全不用记忆的基线:
这三种形态对应一个直接的权衡:Script 更抽象、更省上下文,但可能丢失操作细节;Trajectory 更具体,但占用更多 token,也更容易被表面相似的案例带偏。 Proceduralization 试图同时保留两者。
给定新任务 tnew,检索器要找一条最相似的历史记忆(Eq. 4);实验里用余弦相似度(Eq. 5):
论文比较了三种 key 构造方式:
Figure 5(b) 把「检索多少条记忆」当成一个可调变量。拖动滑块或点柱子,看看 Final Score 怎么随 k 变化:
Figure 5(b) 的横轴取 0、2、5、8、10、15、20,纵轴 Final Score 分别是 40.7、70.7、75.8、78.2、82.5、81.5、79.3。滑块只在这 7 个点上跳,不会生成中间 k 的读数。
① k=2 → 70.7;相对 k=0 的 40.7,差值为 70.7 − 40.7 = 30.0。
② k=10 → 82.5;相对 k=0 的 40.7,差值为 82.5 − 40.7 = 41.8;相对 k=20 的 79.3,高出 82.5 − 79.3 = 3.2。
这 7 个点复现的是 Figure 5(b) 的离散读数;原文没有给出中间 k 的曲线,页面也不补插值。
记忆库不是一次性写死的。论文把更新写成 Eq. 6,并进一步拆成增加、删除、修改三类操作(Eq. 7):
实验里对应三种策略:
论文在 §4.3 把这种反思式更新称作 reflexion-based update mechanism,并给出结论:在 Figure 3 的最后一组任务上,它是三种策略里最高的。 具体数字与原文表述的对照放在 06 效果。
这一节回答工程问题:记忆从哪里来、什么时候写、每次任务要付多少上下文和 LLM 调用。
Memp 的方法里没有训练阶段;实验中的 backbone 参数保持不变。它的「学习」全部发生在外部仓库里:离线阶段从训练集构建记忆,在线阶段按任务流检索和更新。 实验的流程可以拆成四步:
表 4-1 · 三种更新策略的触发与写入内容(本页整理,来源 §4.3)
| 策略 | 触发时机 | 写入什么 | 失败怎么处理 |
|---|---|---|---|
| Vanilla | 每 t 个任务 | 这一组任务的全部轨迹 | 不筛选,失败也写入 |
| Validation | 每 t 个任务 | 只写成功完成的轨迹 | 丢弃失败轨迹与噪声 |
| Adjustment | 检索记忆导致失败时 | 失败轨迹 + 原记忆的修正结果 | 让模型反思并原位修正 |
构建:Script 与 Proceduralization 需要额外的 LLM 调用去总结轨迹;Trajectory 基本只做筛选和存储。
检索:每次任务要做一次向量编码和 top-k 检索;k 越大,上下文越长,噪声也越多。
更新:Vanilla / Validation 主要是存储操作;Adjustment 在失败时多一次反思调用,成本随失败次数增长。
模型:实验设置里没有训练阶段;不更新参数,也不需要 RL 或微调。
实验用三个 backbone:GPT-4o、Claude-3.5-sonnet、Qwen2.5-72B-Instruct;迁移实验的目标模型是 Qwen2.5-14B-Instruct。 两个 benchmark 分别是长程家居任务 ALFWorld(Dev / Test 成功率与平均步数)和长程信息规划 TravelPlanner(#CS / #HC 与平均步数)。 Figure 3 把测试任务分成 5 组(横轴 1–5),每组结束后刷新一次记忆。
§4.3 说「每 t 个测试任务刷新一次记忆」,但没有在正文或附录给出 t 的具体数值;§4.2 说检索 top-k 条轨迹,也没有给出 k 的取值。 Figure 5(b) 单独扫描了检索条数 0–20,但那是分析实验,不是主实验的默认 k。 本页不替论文补这些数字;如果要复现,需要对照官方代码。
把 Figure 2 的模块关系拆成箭头:谁读仓库、谁写仓库、反馈从哪里回来。
覆盖了什么:Build / Retrieve / Update 三个模块、Memory Bank 的读写方向、在线执行与离线构建两条回路、执行反馈回到 Updater 的路径。
没有覆盖什么:本图未覆盖原图中的具体 prompt 模板、向量库实现与模型调用顺序;本图只保留模块关系与数据流。图中的模块颜色只用于区分「本文模块 / 记忆库 / 数据」,不代表原文配色。
这张图里有两个时间尺度:快回路是每个任务开始时的「检索 → 执行」,慢回路是每 t 个任务后的「反馈 → 更新 → 仓库」。 论文的消融实验分别改了快回路的入口(Build 形态、Retrieve key)和慢回路的规则(Update 策略),所以才能把三个模块的贡献拆开看。
先看两张原表,再看四个反直觉的读数:硬约束下降、Script/Trajectory 方向与正文相反、更新增益的口径、迁移数字的口径。
Table 1 · Build 策略(v4 原表转录)。TravelPlanner 的 #CS / #HC 为常识 / 硬约束得分,Steps 为平均步数;ALFWorld 的 Dev / Test 为成功率。箭头 ↑ 表示越高越好,↓ 表示越低越好。
| Model | Granularity | #CS ↑ | #HC ↑ | Steps ↓ | Dev ↑ | Test ↑ | Steps ↓ |
|---|---|---|---|---|---|---|---|
| GPT-4o | No Memory | 71.93 | 12.88 | 17.84 | 39.28 | 42.14 | 23.76 |
| GPT-4o | Script | 72.08 | 5.50 | 15.79 | 66.67 | 56.43 | 18.52 |
| GPT-4o | Trajectory | 76.02 | 8.25 | 14.64 | 67.17 | 74.29 | 16.49 |
| GPT-4o | Proceduralization | 79.94 | 9.76 | 14.62 | 87.14 | 77.86 | 15.01 |
| Claude-3.5-sonnet | No Memory | 63.49 | 33.06 | 18.84 | 39.20 | 34.97 | 24.12 |
| Claude-3.5-sonnet | Script | 62.08 | 29.61 | 19.21 | 56.13 | 53.59 | 19.38 |
| Claude-3.5-sonnet | Trajectory | 65.76 | 29.61 | 17.72 | 69.28 | 71.78 | 15.97 |
| Claude-3.5-sonnet | Proceduralization | 65.46 | 30.14 | 15.29 | 82.50 | 74.72 | 15.79 |
| Qwen2.5-72B | No Memory | 56.57 | 7.34 | 18.32 | 44.91 | 41.25 | 21.38 |
| Qwen2.5-72B | Script | 58.59 | 7.34 | 18.53 | 66.24 | 61.88 | 17.13 |
| Qwen2.5-72B | Trajectory | 63.41 | 12.66 | 18.12 | 64.49 | 69.57 | 16.40 |
| Qwen2.5-72B | Proceduralization | 63.82 | 14.19 | 17.94 | 85.71 | 77.19 | 15.32 |
Table 2 · Retrieve 策略(v4 原表转录,TravelPlanner)。Key=AveFact 的三行与 Table 1 的 Trajectory 行逐位相同;推断检索消融固定在 Trajectory 构建上。
| Model | Policy | #CS ↑ | #HC ↑ | Steps ↓ |
|---|---|---|---|---|
| GPT-4o | No Memory | 71.93 | 12.88 | 17.84 |
| GPT-4o | Random Sample | 74.59 | 6.72 | 15.12 |
| GPT-4o | Key=Query | 73.38 | 8.95 | 15.44 |
| GPT-4o | Key=AveFact | 76.02 | 8.25 | 14.64 |
| Claude-3.5-sonnet | No Memory | 63.49 | 33.06 | 18.84 |
| Claude-3.5-sonnet | Random Sample | 63.99 | 29.91 | 17.93 |
| Claude-3.5-sonnet | Key=Query | 64.93 | 28.56 | 17.60 |
| Claude-3.5-sonnet | Key=AveFact | 65.76 | 29.61 | 17.72 |
| Qwen2.5-72B | No Memory | 56.57 | 7.34 | 18.32 |
| Qwen2.5-72B | Random Sample | 59.76 | 8.43 | 18.31 |
| Qwen2.5-72B | Key=Query | 61.71 | 11.97 | 18.54 |
| Qwen2.5-72B | Key=AveFact | 63.41 | 12.66 | 18.12 |
下面只做 Table 1 的查表:选择模型和指标,四根柱子分别是 No Memory / Script / Trajectory / Proceduralization。 重点看 TravelPlanner #HC 那一栏——Proceduralization 对 GPT-4o 和 Claude-3.5-sonnet 都比 No Memory 低。
① 选 GPT-4o + ALFWorld Test:No Memory 42.14,Proceduralization 77.86。绝对差 77.86 − 42.14 = 35.72 个百分点;相对提升 (77.86 − 42.14) / 42.14 × 100 = 84.8%。
② 选 GPT-4o + TravelPlanner #HC:No Memory 12.88,Proceduralization 9.76。绝对差 9.76 − 12.88 = −3.12 个百分点;相对变化 (9.76 − 12.88) / 12.88 × 100 = −24.2%。
JS 在相同选择下显示 77.86 / 42.14 与 9.76 / 12.88;上面的差值只在文字里计算,图里画的是原始读数。
在 ALFWorld Test 上,三种 backbone 的 Proceduralization 都是各自的最高值: GPT-4o 从 No Memory 的 42.14 到 77.86,绝对差 35.72 个百分点(77.86 − 42.14),相对提升 84.8%(35.72 / 42.14); 平均步数从 23.76 降到 15.01,少 8.75 步,相对减少 36.8%(8.75 / 23.76)。 Qwen2.5-72B 的 Test 从 41.25 到 77.19,绝对差 35.94 个百分点,相对提升 87.1%。
TravelPlanner 的 #CS 也在涨:GPT-4o 从 71.93 到 79.94,绝对差 8.01 个百分点,相对提升 11.1%。 但同一张表的 #HC 列讲的是另一个故事:GPT-4o 从 12.88 降到 9.76,下降 3.12 个百分点,相对下降 24.2%; Claude-3.5-sonnet 从 33.06 降到 30.14;只有 Qwen2.5-72B 从 7.34 升到 14.19。记忆把「常识合理」推高了,却没有稳定推高「硬约束满足」。
§4.2 的总结句是: “all memory construction methods outperform the no-memory baseline, achieving higher scores on both datasets while also reducing the number of steps required.”
按 Table 1 的逐列读数,以下单元格的方向与该句相反(原文没有说明总结句用的是哪种聚合口径):
页面只并列这些格子,不替原文选择聚合方式,也不把「总体提升」改写成「每列都提升」。
§4.2 写: “abstracting trajectories into scripts during training yields relatively better performance on the ALFWorld test set compared to the dev set. Conversely, trajectories ... achieve higher scores on the dev set ... suggesting that scripts are more capable of generalizing to different test tasks, while trajectories are better suited for scenarios involving tasks similar to those already completed.”
按 Table 1 的 ALFWorld 两列,三个模型都是 Script 的 Test 低于 Dev、Trajectory 的 Test 高于 Dev:
原文没有进一步解释这个方向差异;页面保留原句与表格读数并列,不判断是哪一处需要修正。
§4.3 的原句是: “it surpasses the second-best strategy by an impressive margin of +0.7 points and achieves a reduction of 14 steps.”
按 Figure 3 的末组(Trajectory Group Index = 5)读数:Adjustment 的 Reward Gain 为 0.70、Steps Reduction 为 −14.3; Vanilla 为 0.60、−11.8;Validation 为 0.55、−11.2。 若按字面把 +0.7 理解成「比第二名高 0.7」,图中末组 Adjustment 与 Vanilla 的差是 0.10(0.70 − 0.60); 若把 14 理解成「比第二名多减 14 步」,图中末组 Adjustment 与 Vanilla 的差约为 2.5 步(14.3 − 11.8)。 原文没有说明这两个数字是自身值还是与第二名的差值;页面并列两种读法。
Table 2 里,GPT-4o 的 Key=AveFact 在 #CS 上从 No Memory 的 71.93 升到 76.02(相对 Random Sample 高 1.43 分,1.92%;相对 Key=Query 高 2.64 分,3.60%)。 但同一行的 #HC 是 8.25,低于 No Memory 的 12.88;Claude-3.5-sonnet 的 AveFact #HC 29.61 也低于 No Memory 的 33.06。 检索策略把「常识合理」找得更准,并没有同步把「硬约束」找回来。
Table 2 的 Key=AveFact 三行与 Table 1 的 Trajectory 三行逐位相同(GPT-4o 76.02 / 8.25 / 14.64;Claude 65.76 / 29.61 / 17.72;Qwen 63.41 / 12.66 / 18.12)。 推断(由 Table 1 与 Table 2 的三组数值完全相同反推):检索消融是在 Trajectory 构建上做的,AveFact 就是 Trajectory 条件的默认 key;原文没有在表注里写明这一点。
论文自己列了两条限制,Table 1 / Figure 5 又给出了三条数据层面的边界。
论文 Limitations 明确写:检索限制在 vector-similarity search + manually crafted keys,BM25 这类更经典、可能更精确的方法没有纳入。 推断(依据:论文只列了这条限制,没有给出大记忆库或稀疏关键词下的检索实验):记忆库很大、关键词很稀疏时,向量检索的召回不一定可靠。
论文 Limitations 的第二条:框架依赖 benchmark 提供的显式奖励信号,因此在真实世界里奖励稀疏或缺失时,还不能判断任务是否成功。 Validation 和 Adjustment 都需要「成功 / 失败」这个信号;没有它,更新规则就无法触发。
Trajectory、Script、Proceduralization 都从训练集筛选的 gold trajectories 构建(§4.2)。 如果目标场景没有可靠的成功轨迹,或者成功轨迹本身带有偏差,这套流水线的前提就不成立。 论文在 §2 也提到,收集高质量训练数据本身可能很困难,并可能引入偏差。
Table 1 的 #HC 列显示:GPT-4o 与 Claude-3.5-sonnet 的记忆策略都没有超过 No Memory;Qwen2.5-72B 的 Trajectory / Proceduralization 高于 No Memory(7.34 → 12.66 / 14.19),Script 与 No Memory 持平(7.34)。 如果任务的关键是「不能违反硬约束」,而不是「计划看起来合理」,单靠这套程序记忆不够,需要额外的约束检查或验证器 推断(依据:GPT-4o / Claude 的 #HC 在加入记忆后下降,而 #CS 上升)。
Figure 5(b) 在 k=10 之后回落;论文把原因归为上下文变长和低质量记忆的干扰。 迁移实验只展示了 GPT-4o → Qwen2.5-14B 这一组强到弱的方向;TravelPlanner 有具体数字,ALFWorld 只说 “similar gains”,没有给出具体值。 推断(依据:Figure 5(a) 只报告这一组模型对):目前还不能把「强模型记忆能普遍迁移到弱模型」外推到任意模型对。
什么时候别用:任务没有可靠的 0/1 奖励、硬约束是主要矛盾、拿不到 gold trajectories、或者记忆库会膨胀到向量检索明显失准时,这套方法的收益会打折。