Plan-and-Act
Paper · arXiv 2503.09572 · 2025-03

Plan-and-Act:把规划从执行里拆出来,瓶颈就变成了给规划器造数据

网页智能体既要定战略又要管细节,单模型扛不住,这是公认的结构性难题。Plan-and-Act 把职责拆成 Planner 与 Executor 两个 LLM, 再用「从成功轨迹反向标注计划 → 合成扩展 → 按失败定向补数据」三段流水线把规划能力练出来。 只做监督微调,不做 RL;最终 57.58% 来自每一步都重规划、再加 CoT 的 70B 模型。

Lutfi Eren Erdogan, Nicholas Lee, Sehoon Kim, Suhong Moon, Hiroki Furuta, Gopala Anumanchipalli, Kurt Keutzer, Amir Gholami · UC Berkeley arXiv 2503.09572 ↗
TL;DR · 30 秒抓住核心

主方法很朴素:Planner 读用户请求和 HTML,输出带「## Step N / Reasoning / Step」格式的高层计划;Executor 把当前那一步翻译成 do(action="Click", element="13") 这样的动作,并顺手清理冗余 HTML。动作执行后,Planner 每一步都重新规划,把新观察吸收进后面的计划——论文说这样就不需要显式记忆模块。

真正的贡献在数据侧。直接让教师模型凭用户请求「猜」计划,计划会偏离网站实际;作者改成给它看成功的行动轨迹,让它反向标注出计划,并要求把每个计划步骤映射到轨迹里的具体动作,计划因此「接地」。再以这些计划为种子,用 GPT-4o 一小时内生成 10,000 条新的查询-计划对;最后按验证集暴露的失败模式,再定向生成 5,000 条。

Executor 的收益很快见顶:把执行器训练从 1,113 条加到 2,036 条轨迹,ReAct 式执行器只从 36.36 涨到 36.97;真正拉开差距的是规划质量。但规划器只在 1,113 条数据上朴素微调反而回退,说明这个任务对数据量和多样性极其敏感。

57.58%
WebArena-Lite 成功率(Llama-3.3-70B + CoT)
原 SOTA WebRL-3.1-70B 为 49.1%
53.94%
仅加动态重规划时的成功率(Table 1 第 12 行)
静态规划器最好成绩 43.63%
81.36%
WebVoyager text-only SOTA(QWQ-32B)
GPT-4-Turbo 的 Wilbur 为 52.6%
01

一个模型同时管战略和细节,遇长任务必然顾此失彼

先分清两种失败:模型根本没被训练过做网页规划,和把规划与执行压进同一个模型。

论文把规划难拆成三件事:把「帮我订一张去纽约的机票」拆成可执行步骤;任务一长就忘了做到哪、还剩什么;环境会变,计划得跟着改。三者之外还有一条最硬的约束——没有训练数据。LLM 预训练时没见过「给一个网站、给一个请求、输出一份计划和一串网页动作」这种格式的任务。

论文开篇用一组消融数字把这两种失败分开摆出来(Table 1,指标是 WebArena-Lite 成功率):

失败一

没训练过,拆也拆不动

完全零样本的 LLaMA-3.3-70B-Instruct 加 ReAct 提示,只有 9.85%。提示和 in-context 示例对简单任务有帮助,对 WebArena-Lite 这种非平凡查询基本无解。

同一个模型在 1,113 条 WebArena-Lite 训练数据上做完 ReAct 微调,能到 36.36%——说明能力不是学不会,只是没被教。

失败二

挤在一个模型里,认知负载过重

引用的先前工作(Sridhar et al. 2023;Yang et al. 2024a)认为,单模型同时做长程规划与逐步执行,容易丢失最终目标、行为不一致。

这一点论文用「零样本规划器 + 零样本执行器」的消融来间接说明:加上一个未训练、不接地的规划器,基础执行器能从 9.85% 升到 14.21%,但对已训练的执行器反而是负担。

Planner : (user query, state) → plan   |   Executor : (plan, HTML) → action
职责拆分后的形式:规划器不接触「element 13 是哪个按钮」,执行器不操心「下一步该不该换网站」

还有一个反直觉的数字:执行器的数据加倍几乎没用。在没有 Planner 的 ReAct 设置下,执行器从 1,113 条轨迹扩到 2,036 条(再加 923 条合成轨迹),成功率只从 36.36% 到 36.97%,涨 0.61 个百分点。执行器越训越顺,天花板却卡在「它不知道整体该往哪走」。

所以问题的形状变了:不是「再做点提示工程」,而是「怎么在没有人工标注、也不需要沙箱的前提下,造出足够多的高质量计划数据」。这就引出后面两条已有的数据路线,以及论文的三段式流水线。

02

显式规划早有人做,缺的是能训开源模型的计划数据

已有工作分两族:一族的规划靠闭源大模型逐层提示,一族的数据只有轨迹、没有计划。

路线 A:分层规划,但都是在提示闭源模型

AgentOccam 用「planning via generation」把计划塞进行动空间、树式规划;WebPilot 是比较重的多智能体系统;AdaPlanner 带 In-Plan / Out-of-Plan 两套 refiner 做重规划;ADaPT 在执行失败时递归分解任务。论文对它们的评价很直接:都是 prompting 方法,底座是 GPT-4o 这类闭源模型,靠提示叠出来的性能,没有让开源模型真正学会规划。

路线 B:有数据,但只有轨迹、没有计划

WebRL、DigiRL、AutoWebGLM、NNetNav 都能采到多样的轨迹。论文承认这些采集技术与自己互补、可以直接替换,但指出它们只产出轨迹、不产出计划;而且都依赖外部模拟器,每个步骤都要真的在环境里跑一遍网页动作。WebRL 还要 on-policy 自演化课程。路线 B 里 NNetNav 的思路最接近——它从交互里反向标注,但标出来的是用户指令,不是高层计划。

方案规划训练数据来源底座卡在哪
ReAct 单模型隐式1,113 条训练轨迹LLaMA-3.3-70B数据加倍只 +0.61;36.97% 到顶
AgentOccam / ADaPT / WebPilot显式,提示驱动无(零样本)GPT-4o / GPT-4-Turbo闭源提示;开源模型学不到
WebRL隐式 + 自演化课程on-policy 轨迹 + ORMLlama-3.1-70B依赖模拟器;只有轨迹没有计划
Plan-and-Act显式,Planner 微调轨迹反向标注 + 合成扩展 + 定向增强LLaMA-3.3-70B执行器仍是 WebArena-Lite 风格;见 07

还有一个不同的切面:WebRL 靠 RL 提升,论文引用 Rafailov et al. 2024、Furuta et al. 2024 指出这类方法对超参和奖励设计高度敏感、容易不稳定。Plan-and-Act 的姿态是反过来的——把难题全部搬进数据里,训练只剩监督微调。

03

Planner 写计划,Executor 接地;行动之后每一步都重新规划

运行时的机制只有这三件,真正的工程都在第四节的数据流水线。

以论文 Figure 2 的 GitHub 例子:用户输入 Follow the top contributor of this GitHub project。Planner 读初始 HTML,产出 ## Step 1 导航到 Contributors 页面、## Step 2 identify the top contributor and follow them。Executor 只做第一步:在 HTML 里找到 Contributors 链接,输出 do(action="Click", element="13")。执行完它做一次「垃圾回收」,丢掉冗余 HTML,再接下一步。

计划长什么样:硬格式,且 reasoning 与 step 分离

## Step N
Reasoning: [为什么把这几个动作归成一组]
Step: [这一步要达到的结果]
Appendix A.3 的 Planner 系统提示规定了逐字格式;Guidelines 要求「说 what 不说 how」,例如写「Input 'New York' as the arrival city」,而不是「Input the arrival city」

格式本身是约束而不是装饰:Reasoning 解释分组逻辑、给执行器战略上下文,Step 只给结果;提示明确要求把逻辑相关的动作聚成一步(把点击搜索框、输入、点搜索合成「Search for X」),并按「每个计划步骤可能对应多个底层动作」来设计。计划步骤数因此远少于动作数——论文说一条成功轨迹平均有 8 个步骤,而为执行器提供 8 个训练点、为规划器只提供一个计划。

动态重规划:计划是活的,而且顺便当了记忆

静态计划的死角在 Figure 2 的后半段:初始计划不可能知道 top contributor 是谁,只能写「identify the top contributor」。点击 Contributors 后,HTML 里出现了 John Doe;Planner 读完这个状态和已有计划,把剩余计划改写成 ## Step 1 Follow "John Doe"。

机制要点

重规划 = 把关键发现写进计划文本

计划在每一步被重写,所以「搜到了谁」「当前在第几页」这类信息自然沉淀在计划里。论文据此声称:不需要显式的记忆模块,也能应对长程任务里的记忆问题——因为记忆就寄存在 Planner 每步产出的计划中。

代价是每一步都要多调用一次 Planner,论文在 Limitations 里承认这可能慢、可能低效;改进方向是让 Executor 自己判断何时需要重规划,或让 Planner 把任务委派给子智能体。

CoT:Planner 与 Executor 都先写推理,再出结果

Section 3.4 在 Planner 和 Executor 的输出前各加一段链式推理。附录 A.1 的 Planner 示例显示,正式微调后的输出里每个 Step 都带一句 Reasoning(例如先观察「当前在 OpenStreetMap,页面有搜索框和 directions 图标」)。CoT 的数据同样是合成出来的(4.2.2),而不是简单的提示词开关。效果见第六节:叠加 CoT 后 53.94% → 57.58%。

自己动手:同一任务,静态计划与每步重规划

下面是 Appendix A.2.1 的真实任务与计划:用户要问「从 Carnegie Museum of Art 走到 CMU 的某个图书馆要走多久」。静态计划里第二步是看搜索结果、挑一个图书馆;可执行器按计划搜索 "Library at CMU",页面返回 No results found。点下方按钮切换执行方式,看计划如何演化。

Pt+1 = Planner( query, st+1, Pt, H≤t )
st+1 是动作之后的 HTML 状态,Pt 是上一步的计划,H≤t 是已执行的动作历史
第 0 步 · 执行前

计划的步骤与重规划后的新计划取自论文 Appendix A.2.1 的原始输出;执行器动作与 HTML 反馈取自同一附录。静态模式里的「执行器不知所措」是对论文描述的模拟,不是逐字原文。

04

造计划数据:反向标注 → 合成扩展 → 按失败补数据

Section 4 全部是数据工程:每一段都回答「为什么不能更简单一点」。

第一段:先造轨迹,用 ORM 筛成功

沿用 Alpaca / Self-Instruct 的做法:从训练数据随机抽查询当种子,让 LLM 生成相似的新查询,再让 LLM 先筛掉网页智能体不可能完成的;然后交给演示智能体(actor)在环境里跑,得到轨迹;最后用 ORM 打分,只留成功轨迹。这条轨迹就是后面所有计划数据的原料。

第二段:为什么不能直接让教师模型「写计划」

最直接的做法——教师模型拿着用户请求直接生成分步计划——会失败。原因很具体:教师模型看不到网站,也没在这种任务上预训练过,生成的计划往往和网站的实际情况对不上。作者改用它擅长的 in-context 能力:把成功轨迹交给它,让它从动作序列「反向工程」出一份计划;并额外要求每个高层步骤都要说明对应轨迹里哪些底层动作,这就把计划和真实可执行序列绑在了一起。

τ = [ a1, …, aT ]  ⟶
Plan = [ Step1→{ai…j},  Step2→{ak…l}, … ]
接地(grounding)的定义:每个 Step 都指回轨迹里的动作区间;论文 §4.2,Figure 3 第二行

同一套标注思路还用于两份派生数据:重规划数据(额外给出原计划和走到这一步的轨迹,§4.2.1)和 CoT 追溯数据(§4.2.2)。

第三段:数据不平衡是主要矛盾

成功轨迹来之不易——ORM 会筛掉大量不可接受的轨迹。更糟的是比例:一条成功轨迹平均约 8 个动作,对执行器是 8 个样本,对规划器只有 1 份计划。所以第三段做合成计划扩展:从已有查询-计划对随机抽种子,让教师模型生成结构一致、内容多样的新对。

论文给出的规模数字,前后口径略有差别,按原文照列:

定向增强:有了数据生成的控制权,就能对着失败补

大规模扩展提升了多样性,但它是盲目的。作者把模型跑在一个留出的验证集上,归纳出各网站上的失败模式,再用 LLM 对训练点分类(Appendix A.7 为每个网站准备了失败类别,例如 CMS 后台的失败类),把相关训练点当种子,定向再生成 5,000 条。这一步在 Table 1 里换来 4–5 个百分点。

合成计划到底合成了什么:没有模拟器,也能扩

Section 2 说论文的流水线可以在没有模拟器的情况下生成规划数据。Appendix A.6 的合成计划生成器提示显示了做法:每一条合成样本都由三部分组成——新的用户查询、从种子示例里选一个初始 HTML 状态(写示例编号)、对应的高层计划。也就是说,合成不凭空发明网页,而是围绕已有网站的 HTML 状态,重新组合「能在这些页面上做的事」。提示还要求:不要照抄示例,也不能生成网站上不可能完成的请求。

对照

同一条流水线,在 WebVoyager 上为什么换了老师

WebVoyager 没有训练数据,拿不到「种子轨迹」的现成来源。论文的做法是:用 text-only WebVoyager + GPT-4o 先采 1,500 条合成轨迹,再让 QWQ-32B 标注计划、CoT 推理,并生成 10k 条合成计划。这说明整条流水线可拆可换,也说明它依赖一个「能先把任务做成的底座」。这一点在 07 节作为边界展开。

05

三条流水线合起来,才是一套完整的数据源

Figure 3 的三行对应三段数据;训练时 Planner 和 Executor 各拿一份。

§4.1 Action Trajectory Generation 每个成功轨迹 ≈ 8 个动作 种子查询 training data 查询生成 LLM GPT-4o 演示智能体 WebRL-Llama-3.1-70B ORM 过滤 Llama-3.1-8B 成功 轨迹 τ §4.2 Grounded Plan Generation(反向标注) Step → 轨迹里的动作区间 成功轨迹 τ a₁ … a_T 计划标注 LLM GPT-4o 接地计划 Step 1 → {a₁…a₃} · Step 2 → {a₄…} 派生数据 重规划(§4.2.1) CoT 追溯(§4.2.2) §4.3 Synthetic Plan Expansion 1 条轨迹 : 8 个动作样本 : 1 份计划 接地计划 种子示例 合成计划生成 LLM GPT-4o · <1h 计划扩展 +10,000 重选初始 HTML 状态,不凭空造网页 验证集失败分析 LLM 分类训练点(A.7) 定向 +5,000(A.8) τ → Executor 训练样本(每动作一条) · Plan → Planner 训练样本(每条请求一份)
图 1:按论文 Figure 3 与第 4 节重绘的数据流水线。虚线箭头表示定向增强依赖一次「训练后验证、再回头补数据」的循环。
展开说明 ▸
  • 三个阶段的输入输出不对称:第一阶段产出的轨迹对执行器是 8 个左右的动作样本,对规划器只有 1 份计划。第三阶段就是专门补这个缺口。
  • 「接地」是第二阶段的全部目的:计划标注器同时输出步骤到动作的映射,计划因此可以被执行器落地,而不是一段漂亮的空话。
  • 定向增强不是新模型:它先训练一版、在留出验证集上看失败,把失败归到网站与任务类型,再挑相关训练点当种子重新生成。它是有反馈的数据闭环,不是盲目扩量。
  • 训练侧没有 RL:两个模型都是监督微调,Appendix A.12 给出统一超参(LR 2e-5、AdamW、cosine、batch 32、1 epoch、8×A100、torchtune);推理用 vLLM、temperature 0。

训练数据的三种来源在 Table 1 里被分开计:+ Finetuning(1,113 条 WebArena-Lite)、+ Synthetic Trajectories(再加 923 条 §4.1 轨迹)、+ Plan Expansion(再加 10,000 份计划)、+ Targeted Augmentation(再加 5,000 份)。第六节按这四级看涨幅。

06

路径是「先补规划、再补重规划、最后补推理」,每一步都有大台阶

数字全部来自 Table 1–4 与 Figure 4;切换执行器,看同一套规划数据对三类执行器的效果。

无 Planner 或基座规划器 规划器已微调 重规划 / CoT(本文结论)

按 Table 1 第三列(+ Synthetic Traj. 执行器)读,台阶是这样的:

Base Executor 那一列最能说明规划本身的价值:执行器完全没微调,光靠更好的计划,就从 9.85% 到 29.63%(静态规划器)再到 44.24%(动态重规划),论文称后者相对最基础设置提升了 34.39%。

CoT 的价值:8B 打平 70B 的不带 CoT 版本

底座模型CoTWebArena-Lite 成功率说明
Llama-3.3-70B✗53.94Table 1 第 12 行
Llama-3.1-8B✓53.33同一份数据,参数少近一个数量级
QWQ-32B✓54.88
Llama-3.3-70B✓57.58Final Plan-and-Act

Table 2。论文的解读是「8B + CoT 与 70B 不带 CoT 打平,说明 CoT 有多重要」——对长程规划,推理过程带来的收益可以与 9 倍参数相当。

两个泛化基准:模拟器之外与全量 WebArena

Table 4

WebVoyager(真实网站,text-only)

Plan-and-Act 8B:58.08,超过所有开源模型;QWQ-32B:81.36,刷新 text-only SOTA。

同表里 GPT-4-Turbo 的 Wilbur 为 52.6,Agent-E 为 73.1。论文在结论里说「超过所有先前工作」——严格地说,Agent-E 是用截图等多模态输入的,text-only SOTA 的限定才成立。

Table 3

全量 WebArena

Llama-70B 版本 45.7,与 GPT-4-Turbo 的 AgentOccam-Judge 持平;QWQ-32B 版本 48.15,超过所有列出的方法。

这是论文「performs better or on-par」的出处:在全量 WebArena 上,优势并不像 WebArena-Lite 那样悬殊。

按网站拆开:Multi-site 与 Map 是短板

网站任务数平均步数(成功)平均步数(失败)成功率
Overall1657.5213.4353.9
GitLab305.9820.3553.3
Map(OpenStreetMap)2610.379.1046.2
Shopping Admin(CMS)358.6514.4148.6
Shopping(OSS)457.1110.6655.6
Reddit198.319.9284.2
Multiple Websites106.0017.8330.0

Figure 4。失败轨迹明显更长(13.43 vs 7.52 步),唯一例外是 Map:失败的平均步数(9.10)比成功的(10.37)更短——在 OpenStreetMap 上,模型是过早放弃或过早给出错误答案,而不是绕远路。GitLab 则相反,失败轨迹平均 20.35 步,像是一直在页面里乱转。Reddit 最简单(84.2%),Multi-site(30.0%)和 Map(46.2%)是短板。注意 Figure 4 的 Overall 53.9 是四舍五入后的展示值,Table 1 对应设置是 53.94。

07

它的收益来自「数据工程 + 每一步重规划」,也受制于这两件事

论文自己承认两条边界,另外三条可以从数据与消融里读出来。

边界一

流水线需要底座能先把任务做成

§4.1 采轨迹依赖演示智能体;§4.2 反向标注依赖成功轨迹。在没有任何训练数据的领域(WebVoyager),只得先借 GPT-4o 的 text-only 版本采 1,500 条轨迹。论文在 Limitations 里明说:这限制了方法进入全新领域的能力。这一点也写在结论的规模数字里——WebVoyager 的合成计划只有 10k,而在 WebArena-Lite 上是 10k + 5k。

边界二

每一步重规划,慢且贵

每个动作后 Planner 都要重读 HTML、生成新计划,推理调用翻倍。论文承认可能低效,建议未来让 Executor 自己决定何时重规划,或让 Planner 委派子任务——但都只是方向,没有实验。用户白皮书里 57.58% 的轨迹平均也就 11.12 步(Figure 4),成本仍可接受;真实场景里更长的任务,代价会线性增长。

边界三

执行器没有实质升级

论文刻意保持「标准 WebArena-Lite 风格」的执行器,只提升规划。执行器基线 36.97% 的瓶颈里,有一部分是执行能力本身——例如失败轨迹里在 GitLab 绕了 20 步,不一定是计划的问题。结论里提到的改进方向之一就是给执行器加 CoT。也就是说,57.58% 不是「这套框架的上限」,而只是「规划部分修好时」的成绩。

边界四

规划器对数据量和多样性非常敏感

同样 1,113 条规划数据,朴素微调让执行器从 36.97% 掉到 20.60%。要拿到收益,得配上 10k + 5k 的合成计划。这对中小团队意味着:方法可以复现,但成本主要在数据生成与筛选,不在训练算法。

边界五

成绩只覆盖网络导航

全部实验都在 WebArena / WebArena-Lite / WebVoyager 上。框架本身面向「各种结构化决策环境」,但没有跨域实验——代码编辑、桌面软件、具身任务都未验证。论文的 future work 把多模态输入、基于 RL 的计划优化、记忆增强推理列为方向,说明三者都还没做。

一句话:Plan-and-Act 把「长程任务」这个抽象难题,拆成了「规划器数据要多、要好、要贴失败」这个具体的工程问题。它赢在数据,而不是在算法复杂度——整套训练只是 SFT。