【论文阅读】Agent 记忆机制(56):R2D2——把历史网页轨迹变成可搜索地图与反思记忆

文章目录

  • 前言
  • 零、论文基本信息
  • [一、背景:为什么 Web Agent 仅靠即时推理不够](#一、背景:为什么 Web Agent 仅靠即时推理不够)
    • [1. Web Agent 的任务不是一次普通问答](#1. Web Agent 的任务不是一次普通问答)
    • [2. Unknown MDP 带来的局部决策问题](#2. Unknown MDP 带来的局部决策问题)
    • [3. 两种失败不能用一种方式修复](#3. 两种失败不能用一种方式修复)
    • [4. 为什么只保存成功轨迹仍然不够](#4. 为什么只保存成功轨迹仍然不够)
  • [二、相关工作:R2D2 位于哪条技术路线](#二、相关工作:R2D2 位于哪条技术路线)
    • [1. 感知对齐](#1. 感知对齐)
    • [2. 事后反思](#2. 事后反思)
    • [3. 在线搜索](#3. 在线搜索)
    • [4. Workflow 与持续探索](#4. Workflow 与持续探索)
    • [5. R2D2 的位置](#5. R2D2 的位置)
  • [三、方法总览:Remember、Reflect 与 Retrieval 如何协作](#三、方法总览:Remember、Reflect 与 Retrieval 如何协作)
    • [1. 探索阶段](#1. 探索阶段)
    • [2. 推理阶段](#2. 推理阶段)
  • [四、Remember Paradigm:把历史轨迹变成可搜索地图](#四、Remember Paradigm:把历史轨迹变成可搜索地图)
    • [1. 动机:轨迹列表无法显式表达环境结构](#1. 动机:轨迹列表无法显式表达环境结构)
    • [2. 构建 Replay Buffer](#2. 构建 Replay Buffer)
    • [3. 为什么需要 A*,而不是遍历整张图](#3. 为什么需要 A*,而不是遍历整张图)
    • [4. 搜索过程](#4. 搜索过程)
    • [5. 一个直观例子](#5. 一个直观例子)
    • [6. Algorithm 1 应该如何理解](#6. Algorithm 1 应该如何理解)
  • [五、Reflect Paradigm:反思第一个执行错误](#五、Reflect Paradigm:反思第一个执行错误)
    • [1. 动机:完整失败轨迹会污染示范](#1. 动机:完整失败轨迹会污染示范)
    • [2. 为什么只在执行失败时使用这种反思](#2. 为什么只在执行失败时使用这种反思)
  • [六、Reflective Memory:存什么、如何查、何时更新](#六、Reflective Memory:存什么、如何查、何时更新)
    • [1. Key-Value 结构](#1. Key-Value 结构)
    • [2. Lookup 操作](#2. Lookup 操作)
    • [3. Update 操作](#3. Update 操作)
  • 七、探索与推理如何形成闭环
    • [1. Exploration Phase](#1. Exploration Phase)
    • [2. Inference Phase](#2. Inference Phase)
    • [3. R2D2 实际上有两种时间尺度](#3. R2D2 实际上有两种时间尺度)
  • 八、实验设置
    • [1. Benchmark](#1. Benchmark)
    • [2. 基础模型与实现](#2. 基础模型与实现)
    • [3. Baselines](#3. Baselines)
  • [九、主实验:R2D2 到底提升了什么](#九、主实验:R2D2 到底提升了什么)
    • [1. 总体结果](#1. 总体结果)
    • [2. 哪些领域提升最明显](#2. 哪些领域提升最明显)
    • [3. 结果说明了什么](#3. 结果说明了什么)
  • [十、消融实验:Remember 与 Reflect 各自解决什么](#十、消融实验:Remember 与 Reflect 各自解决什么)
    • [1. 多轮执行趋势](#1. 多轮执行趋势)
    • [2. 去掉 Remember 或 Reflect](#2. 去掉 Remember 或 Reflect)
    • [3. 只使用成功轨迹](#3. 只使用成功轨迹)
  • 十一、效率分析:更强是否也更快
    • [1. 复杂度](#1. 复杂度)
  • 十二、错误分析与反例
    • [1. 导航错误明显减少](#1. 导航错误明显减少)
    • [2. R2D2 剩余执行失败的类型](#2. R2D2 剩余执行失败的类型)
    • [3. 错误分类本身也可能出错](#3. 错误分类本身也可能出错)
  • 十三、定性案例
    • [1. 查询最早完成订单的账单姓名](#1. 查询最早完成订单的账单姓名)
    • [2. 查询商店搜索量最高的两个关键词](#2. 查询商店搜索量最高的两个关键词)
  • [十四、与 Agent Memory 系列方法的横向比较](#十四、与 Agent Memory 系列方法的横向比较)
    • [1. R2D2 与 A-MEM/MAGMA](#1. R2D2 与 A-MEM/MAGMA)
    • [2. R2D2 与 CoM](#2. R2D2 与 CoM)
    • [3. R2D2 与 ReMemR1](#3. R2D2 与 ReMemR1)
    • [4. R2D2 与 Mem²Evolve](#4. R2D2 与 Mem²Evolve)
  • [十五、对 Coding Agent 的启发](#十五、对 Coding Agent 的启发)
    • [1. 把代码仓库交互构造成状态图](#1. 把代码仓库交互构造成状态图)
    • [2. 区分定位失败与实现失败](#2. 区分定位失败与实现失败)
    • [3. 失败轨迹中的正确前缀很有价值](#3. 失败轨迹中的正确前缀很有价值)
  • [十六、对 Tool Agent 与 Multi-Agent 的启发](#十六、对 Tool Agent 与 Multi-Agent 的启发)
    • [1. Tool Agent:构建工具状态转移记忆](#1. Tool Agent:构建工具状态转移记忆)
    • [2. 对副作用操作尤其有价值](#2. 对副作用操作尤其有价值)
    • [3. Multi-Agent:共享环境图,保留角色反思](#3. Multi-Agent:共享环境图,保留角色反思)
  • 十七、局限性
    • [1. 只在 WebArena 上验证](#1. 只在 WebArena 上验证)
    • [2. 只研究英语环境](#2. 只研究英语环境)
    • [3. 实验成本高](#3. 实验成本高)
    • [4. Replay Buffer 面临动态网页失效](#4. Replay Buffer 面临动态网页失效)
    • [5. Known MDP 是近似而非真正已知](#5. Known MDP 是近似而非真正已知)
    • [6. LLM 启发式不保证 A* 最优性](#6. LLM 启发式不保证 A* 最优性)
    • [7. 错误分类缺少独立评价](#7. 错误分类缺少独立评价)
    • [8. 基线设置并非完全统一](#8. 基线设置并非完全统一)
    • [9. 反思仍可能产生错误知识](#9. 反思仍可能产生错误知识)
  • 十八、我的理解与启发
    • [1. R2D2 的本质是把记忆从"上下文"变成"环境模型"](#1. R2D2 的本质是把记忆从“上下文”变成“环境模型”)
    • [2. 记忆系统应该围绕失败结构设计](#2. 记忆系统应该围绕失败结构设计)
    • [3. "先消除前置瓶颈"会改变错误分布](#3. “先消除前置瓶颈”会改变错误分布)
    • [4. 失败经验需要结构化切割](#4. 失败经验需要结构化切割)
    • [5. 双记忆结构比单一向量库更合理](#5. 双记忆结构比单一向量库更合理)
    • [6. 下一步应该加入验证与时间](#6. 下一步应该加入验证与时间)
  • 十九、总结
  • 参考资料

前言

在 Agent Memory 的演进中,一个非常明显的趋势是:记忆系统正在从"保存对话内容",逐步转向"保存能够直接影响后续决策的经验结构"。

早期方法更关心两个问题:哪些内容值得记住,以及当新任务到来时,如何把相关内容检索回来。A-MEM 试图让记忆形成带有语义联系的动态网络;MAGMA 从多图视角组织不同关系;CoM 更强调记忆形成、巩固与调用的完整过程;ReMemR1 让 Agent 在阅读和记忆更新时能够主动回看历史信息;Mem²Evolve 则进一步讨论记忆系统如何随经验持续演化。

这些方法共同推动了 Agent Memory 从"文本仓库"走向"可演化的认知结构"。但当 Agent 真正进入网页、代码仓库或工具环境时,还会遇到一个更具体的问题:

Agent 记住了过去发生过什么,是否就等于它知道下一步应该怎么走?

答案并不是。

对于 Web Agent,一次失败通常包含两类完全不同的问题:

  • 导航失败:Agent 根本没有到达完成任务所需的页面;
  • 执行失败:Agent 已经到了正确位置,却没有正确操作页面、理解数据或完成计划。

如果把这两类错误都交给一个通用的"反思模块"处理,Agent 很容易产生一种模糊的总结,例如"下一次应当更仔细地检查页面"。这种反思听起来合理,却没有告诉 Agent 从首页到目标页面究竟应该经过哪些状态,也无法避免下一次重新试错。

R2D2 的出发点正是这里。它没有把所有历史轨迹都压缩成几条自然语言经验,而是把网页访问历史组织成一张由页面状态与动作构成的有向图,并在图上使用 A* 搜索找到更可靠的导航路径。只有当 Agent 已经到达正确页面、但仍然执行失败时,系统才进入反思流程,定位第一个错误动作并保存修正经验。

因此,这篇论文的唯一核心增量可以概括为:

R2D2 将历史网页交互轨迹重组为可搜索的 Replay Buffer,把原本每轮都要从未知环境中重新探索的 Web Agent,转变为能够在已观测状态图上规划的 Agent;同时以错误类型为路由,将导航失败交给图搜索,将执行失败交给反思记忆。

这里真正新颖的并不是 Replay Buffer、A* 或 Reflection 中的某一个单独组件,而是三者之间的职责划分:先用结构化经验解决"去哪里",再用反思经验解决"到了以后怎么做"。

零、论文基本信息

  • 论文名称:R2D2: Remembering, Replaying and Dynamic Decision Making with a Reflective Agentic Memory
  • 发表平台:ACL 2025 Main Conference,Long Papers
  • 代码仓库 :论文未提供 R2D2 官方代码仓库;实验中的检索组件使用 retriv
  • 作者:Tenghao Huang、Kinjal Basu、Ibrahim Abdelaziz、Pavan Kapanipathi、Jonathan May、Muhao Chen

一、背景:为什么 Web Agent 仅靠即时推理不够

1. Web Agent 的任务不是一次普通问答

Web Agent 面对的不是一个静态输入,而是一个持续变化的交互过程。给定用户查询 q q q 和首页观察 o 0 o_0 o0,Agent 需要反复执行动作、接收新页面状态,并最终得到答案或完成操作。

一次长度为 H H H 的轨迹可以写成:

t = { a 1 , a 2 , ... , a H } t=\{a_1,a_2,\ldots,a_H\} t={a1,a2,...,aH}

执行每个动作 a h a_h ah 后,环境返回观察 o h o_h oh,于是形成观察序列:

O = { o 1 , o 2 , ... , o H } O=\{o_1,o_2,\ldots,o_H\} O={o1,o2,...,oH}

这里的关键困难是:Agent 在当前时刻通常只能看到当前页面,并不知道某个按钮会通往哪里,也不知道目标信息藏在哪一个页面之后。

2. Unknown MDP 带来的局部决策问题

论文把传统 Web Agent 的交互视为 Unknown MDP。所谓"未知",并不是 Agent 完全没有语言知识,而是它缺少环境转移结构:

  • 当前页面有哪些可用动作;
  • 点击动作之后会到达什么状态;
  • 哪些路径曾经走过;
  • 哪些页面更可能包含完成当前任务所需的信息。

ReACT 通常根据当前观察和推理选择眼前最合理的动作。Tree Search 或 LATS 可以尝试多条分支,但这些分支仍然需要在线访问真实网页才能知道结果。也就是说,它们的搜索成本主要消耗在环境交互上。

论文 Figure 1。建议放在此处。图中对比传统方法所处的 Unknown MDP 与 R2D2 构建的 Known MDP。

3. 两种失败不能用一种方式修复

论文定义完成查询所必需的关键观察集合为 O ∗ O^* O∗。

如果执行完轨迹后,Agent 观察到的页面不包含全部关键观察:

O ∩ O ∗ ≠ O ∗ O\cap O^*\neq O^* O∩O∗=O∗

则属于导航失败。Agent 没有获得回答问题所需的信息或工具,即使后续推理再强,也很难正确完成任务。

如果:

O ∩ O ∗ = O ∗ O\cap O^*=O^* O∩O∗=O∗

说明 Agent 已经到达了正确位置,但仍未完成任务,这属于执行失败。原因可能是点错控件、没有排序数据、误解用户要求,或者无法完成复杂的多步操作。

这种划分很重要,因为二者需要的"记忆"不同:

失败类型 真正缺少的信息 合适的修复方式
导航失败 页面之间如何连接、哪条路径可到目标 Replay Buffer + 图搜索
执行失败 哪一步做错、为什么错、应该如何改 错误定位 + Reflective Memory

4. 为什么只保存成功轨迹仍然不够

很多 Workflow Memory 方法倾向于保留成功轨迹,因为成功轨迹可以直接作为示范。但 Web Agent 的成功样本往往稀疏。如果失败轨迹全部被丢弃,其中已经验证过的页面转移关系、正确前缀和错误边界也会一并消失。

R2D2 的观点是:失败轨迹并不等于无价值轨迹。

  • 导航失败仍然探索了网页的一部分结构;
  • 执行失败可能包含一段完全正确的导航前缀;
  • 第一个错误动作之前的步骤可以成为可靠经验;
  • 对错误动作的解释可以用于避免重复犯错。

二、相关工作:R2D2 位于哪条技术路线

1. 感知对齐

这类方法通过截图、DOM、视觉定位和多模态模型提升 Agent 对网页控件的理解。它主要解决"Agent 是否看懂当前页面",但不一定解决"Agent 是否知道整个站点应该怎么走"。

2. 事后反思

Reflexion、AutoEval、Anticipatory Reflection 等方法从失败中产生语言反馈,让后续尝试避免同类错误。它们擅长总结执行层问题,但如果失败原因是 Agent 根本没有进入目标页面,单纯反思通常缺少可操作的路径信息。

3. 在线搜索

Tree Search、LATS 等方法在推理时扩展多条候选路径。优点是探索更充分,缺点是必须反复与真实环境交互。在网页环境中,打开页面、等待响应和恢复状态往往比调用一次模型更慢,因此在线分支搜索成本很高。

4. Workflow 与持续探索

SteP 使用人工设计的工作流,Agent Workflow Memory 从轨迹中提取可复用流程。这类方法能够把经验转成策略,但人工工作流成本高,而只抽象成功流程又可能忽略失败中包含的环境结构。

5. R2D2 的位置

R2D2 同时借用了三条路线:

  • 从 episodic/replay memory 中获得可重放经验;
  • 从启发式搜索中获得路径规划能力;
  • 从 reflective memory 中获得执行纠错能力。

它的区别在于:没有把三者平铺叠加,而是依据失败类型进行分工。

论文 Figure 2。图中分别展示 ReACT 的贪心决策、带反思的 Tree Search,以及 R2D2 在 Replay Buffer 中搜索的方式。

三、方法总览:Remember、Reflect 与 Retrieval 如何协作

R2D2 包含两套记忆结构:

  1. Replay Buffer:以有向图保存网页状态及动作转移,主要服务导航;
  2. Reflective Memory:以 Key-Value 形式保存修正后的轨迹和反思,主要服务执行。

整体过程分为探索阶段和推理阶段。

1. 探索阶段

Agent 使用 ReACT 与 WebArena 环境交互,积累多个查询的轨迹。对于 N N N 个查询,对应观察序列为 O 1 , O 2 , ... , O N O_1,O_2,\ldots,O_N O1,O2,...,ON,系统将它们合并为:

O a l l = ⋃ i = 1 N O i O_{all}=\bigcup_{i=1}^{N}O_i Oall=i=1⋃NOi

然后系统判断失败属于导航错误还是执行错误:

  • 导航错误进入 Remember,由 Replay Buffer 和 A* 生成修正路径;
  • 执行错误进入 Reflect,定位第一个错误动作并产生反思;
  • 修正后的轨迹与反思被写入 Reflective Memory。

2. 推理阶段

新查询被编码为向量,从 Reflective Memory 检索相似经验,作为 in-context demonstration 提供给 Agent。Agent 执行后产生的新失败还会再次进入分类、修正和更新流程。

因此,R2D2 不是一次性构建静态记忆,而是形成"探索---诊断---修正---检索---再更新"的闭环。

论文 Figure 3。图中是 R2D2 完整架构:Remember 使用结构化 Replay Buffer 与 A* 搜索修复导航,Reflect 诊断执行错误并生成反思,最终通过 Reflective Memory 支持未来决策。

四、Remember Paradigm:把历史轨迹变成可搜索地图

1. 动机:轨迹列表无法显式表达环境结构

如果记忆只是若干独立轨迹,Agent 很难看到不同任务共享的页面节点。例如,两条轨迹可能都经过"Orders"页面,但从不同入口进入。将它们合并成图之后,"Orders"会成为共享节点,已有动作也会成为可复用边。

2. 构建 Replay Buffer

R2D2 将 Replay Buffer 表示成有向图:

G = ( O , E ) G=(O,E) G=(O,E)

其中:

  • O O O 是网页观察节点集合;
  • o 0 o_0 o0 是首页根节点;
  • E E E 是页面之间的动作转移;
  • 每条边写成 ( ( o i , o j ) , a ) ((o_i,o_j),a) ((oi,oj),a),表示在页面 o i o_i oi 执行动作 a a a 后进入 o j o_j oj。

网页存在噪声和动态内容,例如时间、推荐项或列表数据会变化。若保存完整页面,几乎相同的页面可能被误判为不同状态。论文因此在节点中保存连续观察之间的差异,而不是反复保存完整网页状态。

这一设计的价值有两点:

  • 减少重复信息;
  • 更突出动作真正造成的状态变化。

不过论文没有充分说明页面等价判断的具体规则。这意味着在高度动态的网站中,状态合并质量可能成为实际系统的关键瓶颈。

3. 为什么需要 A*,而不是遍历整张图

Replay Buffer 建好以后仍可能很大。若每个任务都遍历所有页面,虽然不再在线探索,但检索和模型评估成本仍然较高。

R2D2 为每个节点 o o o 维护两部分信息:

  • 已付出的路径成本 g ( o ) g(o) g(o),例如从首页到该节点的步数;
  • 启发式估计 h ( o ) h(o) h(o),表示从该节点继续探索、找到查询相关页面的可能性。

标准 A* 的综合评分可以理解为:

f ( o ) = g ( o ) + h ( o ) f(o)=g(o)+h(o) f(o)=g(o)+h(o)

论文中的 h ( o ) h(o) h(o) 不是手工规则,而是由 LLM 判断"以当前页面为根的子树是否可能包含与查询 q q q 有关的信息"。优先队列按照综合评分选择下一节点。

需要注意,论文 Algorithm 1 第 14 行写作 f ( o j ) = f ( o i ) + h ( o j ) f(o_j)=f(o_i)+h(o_j) f(oj)=f(oi)+h(oj),这与标准 A* 常见的 g + h g+h g+h 表达并不完全一致。结合正文,它想表达的仍是路径成本与启发式估计共同决定扩展优先级,而不是给出新的 A* 理论。

4. 搜索过程

A* 搜索可以拆成四步:

  1. 从首页 o 0 o_0 o0 开始,将其放入优先队列;
  2. 取出当前优先级最高的节点,判断页面是否与查询相关;
  3. 若相关,则加入候选节点队列;若尚未访问,则继续扩展可用动作;
  4. 搜索结束后,从候选节点沿父指针回溯到首页,生成候选轨迹集合,再由 LLM 排序并选出最优轨迹 P ∗ P^* P∗。

形式化地,候选轨迹集合可写成:

T = { t 1 , t 2 , ... , t K } T=\{t_1,t_2,\ldots,t_K\} T={t1,t2,...,tK}

最终选择:

P ∗ = RankAndSelectOptimal ⁡ ( T , q ) P^*=\operatorname{RankAndSelectOptimal}(T,q) P∗=RankAndSelectOptimal(T,q)

5. 一个直观例子

假设用户要求"找出最早完成订单的账单姓名"。普通 Agent 可能从 SALES 直接点击某个订单,看到一个姓名后停止。R2D2 的图中已经记录了:

Home → Sales → Orders \text{Home}\rightarrow\text{Sales}\rightarrow\text{Orders} Home→Sales→Orders

并知道 Orders 页面还有 Purchase Date、Filters、Status 和 View 等动作。搜索会优先找到包含订单管理信息的页面路径,而不是重复点击一个偶然出现的订单。

6. Algorithm 1 应该如何理解

论文的 Algorithm 1 并不是直接在真实网页上做一次完整 A*。它首先利用历史观察构建可复用图,再在图中筛选相关节点和候选路径。真正昂贵的在线页面跳转被尽量替换成离线记忆搜索。

*图片占位符:论文 Algorithm 1(Optimized Web Search Using A and Language Model)。建议放在本节末尾。该算法支持的结论是:R2D2 先在 Replay Buffer 中用 LLM 启发式筛选相关节点,再回溯并排序候选路径,而不是让 Agent 在线盲目尝试每一条分支。**

五、Reflect Paradigm:反思第一个执行错误

1. 动机:完整失败轨迹会污染示范

若把整条失败轨迹直接存入记忆,后续 Agent 可能模仿其中的错误动作。若只保存一句抽象反思,又会丢失错误之前已经验证正确的步骤。

R2D2 的处理方式是找到第一个错误动作 a i a_i ai,仅保留之前的正确前缀:

t c o r r e c t = { a 1 , a 2 , ... , a i − 1 } t_{correct}=\{a_1,a_2,\ldots,a_{i-1}\} tcorrect={a1,a2,...,ai−1}

然后针对 a i a_i ai 生成具体反思,包括:

  • 该动作为什么失败;
  • 它违反了什么任务条件;
  • 下一次应该尝试什么替代操作。

这样,记忆中同时保留了"已经走对的部分"和"从哪里开始出错"。

2. 为什么只在执行失败时使用这种反思

对于导航失败,Agent 并没有获得关键观察,此时很难准确判断某个执行动作是否正确。先通过 Replay Buffer 补全路径,再判断操作层错误,能够避免让反思模块在信息不足时编造原因。

这是 R2D2 相比通用 Reflection 方法最值得借鉴的地方:反思不是默认动作,而是错误路由之后的专用修复器。

六、Reflective Memory:存什么、如何查、何时更新

1. Key-Value 结构

Reflective Memory 使用 Key-Value Store:

  • Key:用户查询的向量表示,用于表达语义意图;
  • Value:截断并修正后的轨迹,以及对应的反思内容。

给定新查询 q ′ q' q′,系统计算其向量 e ( q ′ ) e(q') e(q′),再通过向量相似度找到历史查询:

q ∗ = arg ⁡ max ⁡ q i sim ⁡ ( e ( q ′ ) , e ( q i ) ) q^*=\arg\max_{q_i}\operatorname{sim}(e(q'),e(q_i)) q∗=argqimaxsim(e(q′),e(qi))

对应的轨迹和反思被取回,作为 Agent 当前推理的示范。

实验实现使用 retriv 作为索引框架,使用 sentence-transformers/all-MiniLM-L6-v2 作为稠密向量模型。

2. Lookup 操作

Lookup 根据新查询向量寻找最接近的历史 Key,并返回相应的修正轨迹和反思。这里检索的是"如何完成相似任务的经验",而不仅是包含相似关键词的文本事实。

3. Update 操作

当新轨迹为已有查询提供了更准确或更丰富的修正经验时,系统需要决定是否替换当前 Value。R2D2 让 LLM 对两条轨迹进行比较,选择更适合完成该查询的一条。

这使记忆具备最基本的演化能力,但也存在三个边界:

  • 更新判断依赖 LLM,本身可能不稳定;
  • 论文主要描述替换,没有深入研究合并多条互补经验;
  • 语义相似查询未必具有相同的网页操作路径。

论文 Figure 8。该图给出 Reflective Memory 的 Update Prompt,要求 LLM 比较两条轨迹并判断哪一条更适合解决用户查询。

七、探索与推理如何形成闭环

R2D2 的运行可以概括为:

探索 → 错误分类 → 导航或执行修正 → 写入记忆 → 检索示范 → 再次执行 \text{探索}\rightarrow\text{错误分类}\rightarrow\text{导航或执行修正}\rightarrow\text{写入记忆}\rightarrow\text{检索示范}\rightarrow\text{再次执行} 探索→错误分类→导航或执行修正→写入记忆→检索示范→再次执行

1. Exploration Phase

系统使用 ReACT 收集页面观察,构建 Replay Buffer。失败轨迹经过分类后分别由 Remember 或 Reflect 修正,修正结果进入 Reflective Memory。

2. Inference Phase

系统为新查询检索相似的修正轨迹,把它们作为上下文示范。若新执行仍失败,记忆继续更新。

3. R2D2 实际上有两种时间尺度

  • 慢时间尺度:跨任务积累环境地图和错误经验;
  • 快时间尺度:面对当前查询时检索路径、选择动作并完成任务。

Replay Buffer 让环境结构跨任务复用;Reflective Memory 让策略修正跨任务复用。二者分别承担"世界模型记忆"和"行为经验记忆"的角色。

八、实验设置

1. Benchmark

论文使用 WebArena。该基准包含 812 个用户查询,覆盖 CMS、Reddit、Shopping、Map 和 GitLab 等真实风格网站,并提供程序化验证器判断任务是否成功。

2. 基础模型与实现

  • 主模型:GPT-4o;
  • Agent 基础范式:ReACT;
  • 反思记忆索引:retriv;
  • Embedding:sentence-transformers/all-MiniLM-L6-v2
  • 评价指标:Success Rate;
  • 效率指标:完成任务所需的在线动作步数。

3. Baselines

论文比较了 ReACT、Tree-Search、AutoEval、LATS、Anticipatory Reflection 和 BrowserGym。

需要注意,表中并非所有方法都使用完全相同的模型和交互设置:ReACT、Tree-Search 与 R2D2 标注为 GPT-4o,部分其他方法使用 GPT-4。论文也排除了依赖人工工作流或更大自定义动作空间的方法,因此主表适合观察总体趋势,但不能把所有差值都严格归因于记忆设计。

九、主实验:R2D2 到底提升了什么

1. 总体结果

方法 CMS Reddit Shopping Map GitLab Total SR
ReACT --- --- --- --- --- 13.1%
Tree-Search 17% 11% 28% 26% 13% 19.0%
AutoEval --- --- --- --- --- 20.2%
LATS 15% 25% 30% 27% 17% 22.5%
Anticipatory Reflection 16% 24% 32% 27% 18% 23.4%
BrowserGym --- --- --- --- --- 23.5%
R2D2 30% 21% 36% 28% 28% 27.3%

R2D2 的总体成功率为 27.3%,相对 ReACT 的 13.1% 超过两倍。论文摘要所说的"三倍提升"更接近特定设置或实验轮次的概括;若只依据 Table 1 的总成功率,严格计算约为 2.08 倍,而不是 3 倍。因此阅读时应把摘要表述与主表数字区分开。

相对 Tree-Search,R2D2 从 19.0% 提升到 27.3%,绝对提升 8.3 个百分点,相对提升约 43.7%。

2. 哪些领域提升最明显

CMS

R2D2 达到 30%,Tree-Search 为 17%,提升 13 个百分点。CMS 通常包含层级菜单、筛选、排序和表单等复杂交互,历史页面图能显著减少走错入口的问题。

GitLab

R2D2 达到 28%,Tree-Search 为 13%,提升 15 个百分点。GitLab 的页面层级和功能入口较多,因此已知路径复用的价值更大。

Reddit

R2D2 为 21%,低于 LATS 的 25% 和 Anticipatory Reflection 的 24%。这说明 R2D2 并非每个领域都占优。对于导航结构较浅、任务更依赖内容判断或局部交互的场景,结构化页面地图带来的优势可能较弱。

3. 结果说明了什么

主实验最有力的结论并不是"反思有效",因为已有基线已经证明反思可以提升 Agent。真正有区分度的是:

当一个基准中大量失败来自找不到正确页面时,先复用环境状态转移,再进行执行反思,比只在当前轨迹上扩大搜索或增加反思更有效。
表格占位说明:论文 Table 1。建议将原表截图放在上述重制表之后。原 caption 为多种 Web 任务上的性能比较,并以 SR 报告结果;上标区分 GPT-4o 与 GPT-4。该表支持 R2D2 总体成功率领先,但也显示 Reddit 并非最优。

十、消融实验:Remember 与 Reflect 各自解决什么

1. 多轮执行趋势

论文 Figure 4。图中比较不同反思方法在多轮执行中的成功率变化。

Figure 4 比较了 R2D2、Anticipatory Reflection 和 LATS 随 episode 增加的表现。R2D2 在第一轮之后就出现明显提升,人工检查认为其中 75% 的初期增益来自导航失败的修复。到第五轮,R2D2 与反思基线之间的差距进一步扩大。

这说明 Replay Buffer 带来的是较快的前期收益:只要页面路径被探索过一次,之后就可以直接复用。反思收益则需要更多错误经验逐渐积累。

2. 去掉 Remember 或 Reflect

论文 Figure 5。图中比较完整 R2D2、移除 Navigation 和移除 Reflection 的变体。

Figure 5 在 CMS 领域比较完整 R2D2 与移除不同模块的变体。

  • 去掉 Reflection 后仍有早期提升,说明导航地图本身有效;
  • 但后期增长趋于平台,说明仅知道怎么到页面,不足以持续修复操作错误;
  • 去掉 Navigation 后只有有限改善,说明只靠反思难以突破"没有到达关键页面"的前置瓶颈;
  • 完整模型表现最好,表明两个模块具有互补性。

论文正文有一句表述称这一现象"强调 navigation 对持续性能提升的关键作用",但结合前一句"去掉 Reflection 后后期平台",更准确的解释应是:Navigation 提供早期基础,Reflection 支持后期持续改进,二者缺一不可。

3. 只使用成功轨迹

当推理时只提供成功轨迹、不使用失败轨迹时,成功率从完整 R2D2 的 27.3% 降至 20.5%,绝对下降 6.8 个百分点。

这个消融直接支持了论文关于失败经验的核心判断:失败轨迹中的正确前缀、页面转移以及错误解释都具有训练和推理价值。只保存成功案例,会因为样本过少而无法覆盖复杂导航。

十一、效率分析:更强是否也更快

方法 Accuracy 平均在线动作步数
Tree-Search 19.2% 33.8
AutoEval 20.2% 29.2
R2D2 27.3% 13.1

相较 Tree-Search,R2D2 的在线动作步数从 33.8 降到 13.1,减少约 61.2%;相较 AutoEval,减少约 55.1%。同时,成功率反而更高。

原因是 R2D2 把大量试错转移到了缓存图上的离线搜索。网页交互通常需要页面加载和环境同步,因此减少在线动作比少调用几次 LLM 更能降低端到端延迟。

论文说明,离线记忆构建对每个任务最多使用五个动作,Replay Buffer 的构建基于规则,额外开销较轻。

表格占位说明:论文 Table 2。建议放在此处。原 caption 比较任务准确率和动作数量。该表支持 R2D2 在提高成功率的同时显著减少在线交互步骤。

1. 复杂度

附录认为 Replay Buffer 的大小受网站页面数量约束,并通过删除最近最少或最不常访问节点维持固定上限,因此在固定容量设定下将空间复杂度写为 O ( 1 ) O(1) O(1)。

这个说法需要谨慎理解:

  • 如果把缓存上限视为常数,空间确实是 O ( 1 ) O(1) O(1);
  • 如果分析随网站状态数增长的自然复杂度,图存储更合理的表达应与节点和边数量相关,即 O ( ∣ O ∣ + ∣ E ∣ ) O(|O|+|E|) O(∣O∣+∣E∣);
  • 动态页面可能产生大量状态变体,实际容量并不会天然恒定。

A* 使用高效优先队列时,附录给出的时间复杂度为:

O ( N log ⁡ N ) O(N\log N) O(NlogN)

其中 N N N 是一次搜索中扩展的节点数量。

十二、错误分析与反例

1. 导航错误明显减少

论文人工检查相同的 60 个查询。Vanilla ReACT 约 60% 的轨迹停滞在导航阶段;R2D2 显著减少了导航失败,使更多任务能够到达真正的执行阶段,并获得更高通过率。

这里有一个容易误读的现象:R2D2 的执行错误比例可能看起来上升。这不一定表示执行能力变差,而是过去很多任务在导航阶段就已经失败,根本没有机会暴露后续执行问题。R2D2 修通导航以后,剩余瓶颈才被显现出来。

论文 Figure 6。图中比较 Vanilla ReACT 与 R2D2 的成功、导航失败和执行失败分布。

2. R2D2 剩余执行失败的类型

附录对执行失败给出三类主要原因:

悲观反思:30.3%

Agent 发生错误后,有时会过早断言服务不可用、页面损坏或任务无解,而不是尝试其他按钮、重新检查信息或轻微调整动作。这说明自然语言反思并不天然可靠,错误反思甚至会阻止继续探索。

缺乏 GUI 理解:24.2%

Agent 已经进入正确页面,却无法找到正确输入框、提交按钮或交互控件。这类问题不是路径记忆能够解决的,需要更强的视觉定位、DOM grounding 或可验证的控件引用。

复杂计划执行困难:20.2%

当任务要求遍历列表、逐个添加项目、校验细节并完成结账时,Agent 仍可能在长链条中失败。Replay Buffer 能告诉它去哪里,却不能自动保证长程计划的每一步都正确。

3. 错误分类本身也可能出错

R2D2 先用 LLM 判断导航失败还是执行失败。若分类错误,后续修复器也会选错:

  • 把导航失败判成执行失败,会在缺少关键观察时生成空泛反思;
  • 把执行失败判成导航失败,会重新搜索已经正确的路径,却不处理真正的操作问题。

论文给出了分类 Prompt,但没有单独报告分类准确率。这是实验链条中一个未被充分量化的变量。

论文 Figure 7。该图展示轨迹错误类型判断 Prompt。它支持 R2D2 依赖显式错误分类来路由 Remember 与 Reflect,但论文没有单独评估该分类器的可靠性。

十三、定性案例

1. 查询最早完成订单的账单姓名

GPT-4o 的失败轨迹进入 SALES 后直接打开某个订单并返回 Grace Nguyen,没有先确认该订单是否是最早的已完成订单。

R2D2 的最终轨迹为:

  1. 进入 SALES;
  2. 打开 Orders;
  3. 按 Purchase Date 排序;
  4. 打开 Filters;
  5. 选择 Status;
  6. 输入 Complete;
  7. 应用筛选;
  8. 查看订单;
  9. 返回 John Lee。

这不仅是"多点几次"的区别,而是从随机命中一个页面,转向按照任务约束构造可验证路径。

2. 查询商店搜索量最高的两个关键词

普通 GPT-4o 能进入相关区域,却没有排序数据,因此答案不完整。R2D2 在多轮经验中先学会进入 Reports → Search Terms,再通过反思意识到需要按 Hits 排序,最终得到 hollister(19 hits)和 Joust Bag(10 hits)。

这个案例准确展示了两种记忆的分工:

  • Remember 找到 Search Terms 页面;
  • Reflect 发现"仅到达页面还不够,需要按 Hits 排序"。

表格占位说明:论文 Table 3。建议放在此处。原表对比 GPT-4o 失败轨迹、R2D2 中间轮次和最终轨迹。该表支持结构化导航与执行反思在真实任务中分别发挥作用。

十四、与 Agent Memory 系列方法的横向比较

以下比较包含基于各方法设计目标的归纳,不代表 R2D2 论文直接进行过这些实验。

方法 主要记忆对象 核心组织方式 主要解决问题 与 R2D2 的差别
A-MEM 文本记忆项及语义属性 动态链接的记忆网络 记忆之间如何建立关联 R2D2 的图是环境状态转移图,边具有可执行动作语义
MAGMA 多类型记忆关系 多图/多视角结构 单一相似度难以表达复杂关系 R2D2 关系类型更单一,但可以直接用于路径搜索
CoM 经历、抽象与巩固后的记忆 类认知记忆过程 如何形成更稳定、可调用的长期记忆 R2D2 更工程化,重点是网页导航与错误修复
ReMemR1 阅读过程中的历史记忆 主动 callback 与可回访记忆 写入时不可逆的信息遗漏 R2D2 的回访发生在环境状态图上,目标是恢复可执行路径
Mem²Evolve 记忆系统自身的变化经验 记忆与元记忆协同演化 记忆策略如何持续改进 R2D2 只有较基础的 Lookup/Update,尚未演化记忆管理策略
R2D2 页面状态、动作边、修正轨迹、反思 Replay Graph + Reflective KV Memory 导航失败和执行失败的分治修复 把记忆直接接入 A* 规划,并显式区分两种失败

1. R2D2 与 A-MEM/MAGMA

A-MEM 和 MAGMA 更关注记忆内容之间的语义、时间或因果关系。R2D2 的图则更接近环境模型:节点是页面,边是可执行动作。前者回答"哪些记忆彼此相关",后者回答"执行什么动作能从这里到那里"。

2. R2D2 与 CoM

CoM 更关心长期记忆如何形成和巩固,R2D2 更关心已有经验如何立即改变下一次行动。R2D2 的优势是可操作性强,局限是对记忆压缩、遗忘、冲突消解与跨域迁移讨论较少。

3. R2D2 与 ReMemR1

两者都反对一次写入后不可回看。ReMemR1 的 callback 让 Agent 在记忆更新过程中主动找回历史信息;R2D2 则让 Agent 在规划时重新访问过去观察到的环境结构。一个偏向记忆构建过程,一个偏向行动路径规划。

4. R2D2 与 Mem²Evolve

R2D2 会更新轨迹 Value,但它的记忆操作规则本身基本固定。Mem²Evolve 更关注系统是否能从使用效果中调整记忆策略。若两者结合,可以让 Agent 不仅更新网页路径,还能学习何时建图、何时合并状态、何时触发反思以及何时遗忘。

十五、对 Coding Agent 的启发

以下内容是基于 R2D2 机制的工程推演,并非论文原实验。

1. 把代码仓库交互构造成状态图

Coding Agent 的"页面"可以替换为代码状态:

  • 节点:文件、符号、测试结果、构建状态、Git diff;
  • 边:搜索、打开文件、修改代码、运行测试、回退修改;
  • 路径:从需求到定位模块、修改实现、验证修复的操作序列。

相比只保存最终补丁,状态图还能保留"如何定位到这个文件"和"哪条调查路径被验证无效"。

2. 区分定位失败与实现失败

Coding Agent 的错误也可以分成两类:

  • 定位失败:没有找到真正相关的模块、调用链或测试;
  • 实现失败:找到了正确位置,但补丁逻辑错误或引入回归。

定位失败适合通过仓库结构图、调用图和历史搜索轨迹修复;实现失败适合通过测试日志、错误定位和补丁反思修复。若不区分,Agent 可能在错误文件上反复修改。

3. 失败轨迹中的正确前缀很有价值

一次失败修复可能已经正确完成了环境检查、复现问题和锁定函数,只在最后修改时出错。截断到首个错误动作,就可以保留高质量调查路径,而不会让未来 Agent 模仿错误补丁。

十六、对 Tool Agent 与 Multi-Agent 的启发

以下同样属于延伸判断。

1. Tool Agent:构建工具状态转移记忆

Tool Agent 可以记录:

( 前置状态 , 工具调用 , 后置状态 ) (\text{前置状态},\text{工具调用},\text{后置状态}) (前置状态,工具调用,后置状态)

例如"先创建草稿,再上传附件,最后发送"是一条具有依赖关系的工具路径。下一次面对相似任务时,Agent 不必仅凭工具描述重新猜测调用顺序。

2. 对副作用操作尤其有价值

网页环境的在线探索很慢,而真实工具环境中的盲目探索还可能产生副作用。将已经验证过的安全路径写入 Replay Graph,可以减少重复创建、误发送或错误修改。

3. Multi-Agent:共享环境图,保留角色反思

多个 Agent 可以共享环境状态图,让探索结果被团队复用;同时为不同角色保留独立 Reflective Memory。例如检索 Agent 共享"在哪里找到数据",执行 Agent 保存"如何正确提交操作"。

但共享记忆需要额外记录来源、时间和可信度,否则一个 Agent 的过时路径可能误导整个系统。

十七、局限性

1. 只在 WebArena 上验证

论文只使用一个基准和 GPT-4o。WebArena 虽覆盖多类网站,但仍不足以证明方法能够泛化到移动端 GUI、桌面应用、代码环境或开放互联网。

2. 只研究英语环境

页面文本和任务均为英语。多语言网站可能带来不同的菜单语义、页面结构和检索偏差。

3. 实验成本高

论文称一次完整 WebArena 运行约消耗 200 美元 GPT-4o 费用,这限制了大规模重复实验、多模型对照和统计显著性分析。

4. Replay Buffer 面临动态网页失效

网页结构可能更新,旧动作边会失效;登录状态、用户权限和个性化内容也会使同一 URL 对应不同观察。论文提出差分存储和淘汰策略,但没有系统评估记忆过期与冲突问题。

5. Known MDP 是近似而非真正已知

R2D2 只知道历史上访问过的局部状态与转移,并不知道未探索区域,也不能保证相同动作总产生相同结果。因此"从 Unknown MDP 转成 Known MDP"更准确地说,是把已探索子图转成局部已知的经验模型。

6. LLM 启发式不保证 A* 最优性

经典 A* 的最优性依赖 admissible heuristic。论文用 LLM 估计页面相关性,没有证明启发式满足可采纳性或一致性,因此 P ∗ P^* P∗ 应理解为模型排序后的最佳候选,而非理论保证的全局最短或最优路径。

7. 错误分类缺少独立评价

Remember 与 Reflect 的效果依赖前置分类,但论文没有报告导航/执行错误分类的准确率,也没有消融错误分类对最终性能的影响。

8. 基线设置并非完全统一

Table 1 混合了 GPT-4o 与 GPT-4 结果,部分系统还使用不同动作空间。结果能够证明 R2D2 有竞争力,但不足以形成完全受控的组件级公平比较。

9. 反思仍可能产生错误知识

30.3% 的剩余执行失败与悲观反思有关,说明 Reflective Memory 可能把错误判断长期保存并在相似任务中传播。系统需要置信度、验证器或多次证据来控制错误记忆。

十八、我的理解与启发

1. R2D2 的本质是把记忆从"上下文"变成"环境模型"

很多 Agent Memory 方法最终仍把记忆拼回 Prompt。R2D2 虽然也会检索示范,但它首先让记忆参与搜索:页面状态是节点,动作是边,查询决定启发式方向。此时记忆不再只是模型阅读的材料,而是决策算法直接操作的数据结构。

2. 记忆系统应该围绕失败结构设计

R2D2 先研究失败分布,发现约 60% 的问题来自导航,再设计 Replay Buffer。这种思路比先造一个通用记忆模块再寻找应用更扎实。

一个值得推广的原则是:

不要先问 Agent 应该记住什么,而要先问它为什么失败,以及哪一种可复用信息能够消除这类失败。

3. "先消除前置瓶颈"会改变错误分布

修复导航以后,执行失败会变得更显眼。这不是系统退步,而是瓶颈发生迁移。未来评估 Agent Memory 时,不应只比较某一类错误的比例,还应观察任务推进到了哪个阶段。

4. 失败经验需要结构化切割

失败轨迹最危险的处理方式有两种:全部丢弃,或者原样保存。前者浪费正确前缀,后者传播错误动作。R2D2 的"定位首错并截断"提供了一个简单而通用的中间方案。

5. 双记忆结构比单一向量库更合理

页面路径适合图结构,行为经验适合语义检索。将所有信息压进同一个向量数据库,会丢失动作转移的精确关系;将所有反思塞进图中,又不利于按语义查找相似任务。R2D2 说明记忆结构应该服从信息类型,而不是为了架构统一强行使用一种存储。

6. 下一步应该加入验证与时间

如果继续扩展 R2D2,我认为最关键的不是再增加一个反思 Prompt,而是加入:

  • 节点与边的时间戳;
  • 路径成功次数与失败次数;
  • 页面变化检测;
  • 反思置信度与验证证据;
  • 多条互补轨迹的合并;
  • 对错误分类器的独立监督。

这样 Replay Buffer 才能从"历史地图"升级成"带可靠性和时效性的环境模型"。

十九、总结

R2D2 面向 Web Agent 中最常见的两类失败,设计了具有明确分工的双记忆系统:Remember 将历史页面与动作构造成 Replay Buffer,并通过 LLM 引导的 A* 搜索寻找导航路径;Reflect 则处理已经到达目标页面后的执行错误,保留首个错误之前的正确轨迹并生成修正反思。最终,这些经验通过 Reflective Memory 被检索为新任务的上下文示范。

实验中,R2D2 在 WebArena 上达到 27.3% 的总体成功率,高于 Tree-Search 的 19.0% 和 Anticipatory Reflection 的 23.4%;平均在线动作步数仅为 13.1,显著低于 Tree-Search 的 33.8。只使用成功轨迹会使成功率下降 6.8 个百分点,进一步证明失败经验经过正确切割和结构化后同样具有价值。

一句话总结:

R2D2 的核心贡献,是把 Agent 过去走过的网页轨迹从"可回忆文本"变成"可搜索地图",再把导航修复与执行反思分开处理,让记忆真正参与下一步行动。

参考资料

相关推荐
M78佐菲13 分钟前
Linux学习笔记:网络通信
linux·笔记·学习·算法
Asa1213814 分钟前
Science Advances|大语言模型增强宏基因组酶功能注释
人工智能·语言模型·自然语言处理
OsDepK14 分钟前
OSMDE移动AI.编程工具,现已支持添加ollama本地模型
人工智能
TechEdu20260615 分钟前
[人工智能]MiniMax(上海稀宇科技):模型、智能体与多模态应用工程实践
人工智能·ai
启芯硬件18 分钟前
《硬件电路设计实战100例》专栏核心信息,定位及设计案例分享
人工智能·经验分享·嵌入式硬件·硬件工程·高速仿真
m4Rk_20 分钟前
【论文阅读】Agent 记忆机制(58):Amory——把长期对话从记忆碎片组织成会生长的故事
论文阅读·人工智能·学习·开源·github
智讯阁23 分钟前
能直接操作电脑的AI助手有哪些?AiPy、QoderWork、TRAE Work、WorkBuddy深度实测
大数据·人工智能
科技拓维者24 分钟前
从听懂宠物到复刻声音:宠物AI声音识别与克隆技术解析
人工智能·宠物
空堂与归25 分钟前
南大 AI 课 Token 自费:用缓存命中率算一学期账单
人工智能·缓存·ai·deepseek