跳转至

AutoRPA: Efficient GUI Automation through LLM-Driven Code Synthesis from Interactions

会议: ICML2026
arXiv: 2605.21082
代码: 无
领域: LLM Agent
关键词: GUI自动化, 机器人流程自动化, 代码合成, LLM Agent, 轨迹蒸馏

一句话总结

提出 AutoRPA 框架,通过翻译器-构建器流水线将 ReAct 风格 GUI Agent 的交互轨迹自动蒸馏为可复用的 RPA 函数,结合混合修复策略迭代优化代码,在保持甚至超越原始 Agent 成功率的前提下减少 82%~96% 的 token 消耗。

研究背景与动机

领域现状:基于 LLM 的 GUI Agent(如 SeeAct、M3A)已经能够通过 ReAct 范式在多步交互中完成各种 GUI 任务。然而这类方法在每个任务实例上都需要调用 LLM 进行推理,token 消耗高、运行慢。

现有痛点:在实际部署场景中,大量 GUI 任务是重复性的——同一用户每天提交报告、不同用户订购机票。对这类重复任务反复调用 LLM 推理既昂贵又低效。传统 RPA 虽然运行高效,但依赖人工编写脚本,开发维护成本高且对 GUI 布局变化脆弱。

核心矛盾:LLM Agent 灵活但昂贵(每次都要推理),传统 RPA 高效但僵硬(人工编写、难以泛化)。直接让 LLM 生成完整代码又往往因缺乏环境知识而失败;技能学习方法虽存储成功轨迹但泛化能力有限。

本文目标:自动将 LLM Agent 的决策逻辑蒸馏为可泛化、低 token 消耗的 RPA 函数,使其能在不同环境状态和任务指令下稳健执行。

切入角度:作者观察到 ReAct Agent 虽然推理成本高,但其成功轨迹蕴含了完成任务的完整决策逻辑。如果能将这些硬编码动作转化为软编码、再合成为带条件逻辑的 RPA 代码,就能兼顾灵活性和效率。

核心 idea:用翻译器将 ReAct 的硬编码动作转为基于语义属性的软编码动作,再由构建器从多条翻译后轨迹合成鲁棒的 RPA 函数,并通过混合修复策略迭代优化代码质量。

方法详解

整体框架

AutoRPA 把 GUI 环境建模成 POMDP \((\mathcal{S}, \mathcal{A}, \mathcal{T}, \mathcal{G}, \mathcal{O})\),要为某一类任务 \(\mathcal{G}^k\) 蒸馏出一个能反复复用、token 几乎为零的 RPA 函数 \(F_k\)。整条流水线靠三个 Agent 接力跑:ReAct Agent 先在环境里探索拿到成功轨迹,翻译器把这些硬编码动作改写成靠语义属性定位的软编码版本,构建器再从多条软编码轨迹合成带条件和循环的 RPA 代码;代码在已见任务上验证,一旦失败就由分析器定位断点、ReAct 回真实环境补一段修正轨迹,构建器据此迭代改写,循环最多三轮。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
    A["任务类 G^k(POMDP GUI 环境)"] --> B["ReAct Agent 探索真实环境<br/>产出成功轨迹(click(index) 式硬编码动作)"]
    B --> C["翻译器:硬编码 → 软编码<br/>按语义属性 find_element 定位 + 插断言"]
    C --> D["构建器:合成带条件/循环的 RPA 函数 F_k"]
    E["树结构轨迹库<br/>fetch_info 按需逐层拉多模态细节"] -.->|RAG| D
    D --> F{"已见任务验证"}
    F -->|通过| H["零推理 RPA 函数 F_k<br/>反复复用,token ≈ 0"]
    F -->|失败| G["分析器定位断点 → ReAct 回真实环境补修正轨迹"]
    G -->|"混合修复,每任务最多 3 轮"| D

关键设计

1. 翻译器-构建器流水线:把"探索"和"写代码"拆给两个 Agent

直接让 LLM 凭空生成整段 GUI 代码几乎必败,因为它不知道目标界面长什么样;而 ReAct 探索出来的轨迹虽然带了完整环境知识,却是 click(index=2) 这种钉死在具体位置的硬编码,界面一改就废。AutoRPA 让翻译器 Agent 逐步接管:它读每一步动作及其前后观测,先做一次鲁棒性分析,再把硬编码动作翻成靠语义属性定位的软编码——比如把"点第 2 个元素"改写成"用 find_element 按文本内容和元素类型去找那个按钮",必要时还顺手插一句断言来校验这步是否真的生效。构建器 Agent 拿到的是简化后的翻译轨迹 \(\psi(\tau'_{\text{ReAct}}(g))\)(扔掉原始观测、只留动作和执行摘要),在此基础上合成带条件判断和循环的完整 RPA 函数。这样"先探索拿环境知识、再翻译解耦位置、最后合成逻辑"的分工,既保住了 ReAct 的探索能力,又靠软编码让代码能跨不同界面状态稳定运行。

2. 基于树结构的轨迹检索增强生成:构建器按需拉细节,而不是一次性塞满 prompt

构建器要写对代码就得知道界面真实状态,但把每步的截图和 DOM 全塞进 prompt 会瞬间爆长度,只给简化轨迹又会让它对界面凭空假设、写出错代码。AutoRPA 把轨迹库 \(\mathcal{D}_\tau\) 组织成三层树:底层是每步完整交互块 \((o_t, a'_t, \rho_t, o_{t+1})\)(含截图与 DOM),中层是只剩动作摘要的简化轨迹,顶层是一句结论摘要。构建器平时只看上层摘要,真需要某一步的具体界面时才调 fetch_info(traj, step) 逐层往下拉对应的多模态观测。让构建器自己决定何时取什么细节,就在"信息完整"和"prompt 不爆"之间找到了平衡。

3. 混合修复策略:代码错了不让 LLM 闭眼调,而是回真实环境重探一段

合成出来的代码难免在某些任务上跑挂,常见做法是把报错丢回 LLM 让它静态调试,但 LLM 没看到真实界面,调起来基本靠猜。AutoRPA 改成"在环修复":对一个已见任务执行 RPA 代码,跑到第一次失败就停,分析器 Agent 诊断这个断点——它读已执行的轨迹和当前观测,输出失败原因、已经完成了哪些子任务、以及可行的续行方案;接着 ReAct Agent 从断点处(或干脆从头)回到真实环境继续把任务做完,产出一段修正性示范轨迹 \(\tau'_{\text{hybrid}}(F_k, g_*) = F_k(g_*) \oplus (A, o_{t*}, a'_{t*}, \rho_{t*}, \ldots, C)\)。构建器拿着这段"真的能走通"的轨迹去改代码,依据是实测而非臆测,每个任务最多改 \(M=3\) 次。正因为修正信号来自真实环境探索,修复成功率比纯静态调试高得多。

一个完整示例

以一个移动端"提交报告"任务为例,看三个 Agent 怎么接力。ReAct Agent 先在 App 里一步步点完整个流程,留下一条成功轨迹,其中有一步是 click(index=2)(点了那个"提交"按钮)。翻译器扫到这步,发现按索引定位很脆,于是改写成"按文本 提交、类型 buttonfind_element 定位后点击",并补一句断言确认页面跳转到了成功页。构建器拿到整条软编码轨迹后,注意到不同用户的报告条目数不一样,便合成了一段带 for 循环的 RPA 函数来逐条填写,循环体里某一步它拿不准弹窗长什么样,就调 fetch_info 把那一步的 DOM 拉下来再写。代码生成后在几个已见任务上验证,某个任务因为多了一步确认弹窗而失败——分析器定位到"卡在弹窗确认",ReAct 回到环境把弹窗点掉、走完剩余步骤,构建器据此在循环后补上处理弹窗的分支。三轮内代码稳定通过,之后这类任务就直接跑这个零推理的 \(F_k\),不再调用 LLM。

实验关键数据

主实验

实验在三个 GUI 基准上进行:AndroidWorld(116 个任务类型,20 个真实 App)、WebArena(Reddit 域 19 个任务类型)、MiniWoB++(53 个任务类型)。

方法 模型 时间 (min) ↓ Tokens (k) ↓ 成功率 (%) ↑
SeeAct GPT-4.1 5.14 58.8 25.4
M3A GPT-4.1 2.23 103.4 48.3
ReAct† GPT-4.1 3.91 68.7 50.0
AutoRPA (code only) GPT-4.1 1.42 2.7 47.2
AutoRPA GPT-4.1 1.81 12.8 51.7
ReAct† GPT-5 8.57 142.5 74.1
AutoRPA (code only) GPT-5 2.72 6.2 70.7
AutoRPA GPT-5 4.35 30.6 75.9

在 MiniWoB++ 上(GPT-4.1):

方法 9 类困难任务 Tokens (k) ↓ 成功率 (%) ↑ 全部 53 类 Tokens (k) ↓ 成功率 (%) ↑
AdaPlanner 15.1 74.1 6.1 90.3
AutoManual 23.2 91.1 4.6 95.2
ReAct† 16.2 84.4 9.2 92.8
AutoRPA (code only) 1.0 80.0 0.9 92.5
AutoRPA 1.4 91.1 1.4 95.4

消融实验

配置 成功率 (%)
AutoRPA (完整) 51.7
构建阶段去掉 ReAct 32.5
构建阶段去掉翻译器 40.2
代码修复去掉 ReAct 45.5
构建器去掉 RAG 48.8

关键发现

  • 去掉 ReAct 探索后成功率从 51.7% 暴跌至 32.5%,说明直接让 LLM 生成 GUI 代码是不可靠的,ReAct 探索提供的环境知识至关重要
  • 翻译器的贡献显著(去掉后降 11.5%),软编码动作对代码泛化性至关重要
  • 仅靠 RPA 代码执行(code only)就能达到与 ReAct 接近的成功率,同时 token 消耗降至原来的 4%~7%,说明大部分任务的决策逻辑确实可以被蒸馏为确定性代码
  • 随着构建任务数 \(N\) 增加,AutoRPA (code only) 的成功率持续逼近 ReAct,验证了更多样本能帮助生成更鲁棒的 RPA 代码
  • 在 WebArena 等高度多样化的真实 Web 环境中,AutoRPA 虽然在成功率上与现有方法持平,但 token 消耗大幅降低

亮点与洞察

  • 轨迹蒸馏范式:将 LLM Agent 的在线推理转化为离线代码,本质是一种"推理时计算"到"编译时计算"的转换。这个思路可以迁移到任何重复性 Agent 任务场景(如数据处理流水线、测试自动化)
  • 软编码翻译:通过语义属性定位 GUI 元素而非硬编码位置/索引,巧妙解决了 GUI 布局变化导致脚本失效的经典 RPA 痛点。这个设计理念适用于所有需要跨环境泛化的自动化脚本
  • 混合修复 = 代码调试 + 环境探索:不是让 LLM 纯靠想象调试代码,而是让 Agent 在真实环境中探索获取修正轨迹。这种"在环调试"策略比纯静态代码修复更可靠

局限与展望

  • 构建阶段仍需消耗大量 token(每个任务类型需要采样 \(N\) 个任务 + 反复验证修复),作者未充分讨论构建成本与测试阶段节省的平衡点
  • 对于高度多样化的任务类型(如 WebArena),单一 RPA 函数难以覆盖所有情况,仍需回退到 ReAct,AutoRPA 的优势有所减弱
  • 依赖 GUI 元素的语义属性进行定位,但对于属性信息贫乏的界面(如纯图像 UI)可能不适用
  • 未来可以探索自动判断何时值得为某类任务构建 RPA(投入-产出分析),以及将 RPA 函数的局部更新与增量验证结合以降低维护成本

相关工作与启发

  • ReAct 范式 (Yao et al., 2023):交替推理-行动的基础范式,AutoRPA 的探索和修复阶段都基于此
  • AutoManual (Chen et al., 2024):从交互中归纳环境规则指导后续任务,与 AutoRPA 的技能蒸馏思路互补
  • AdaPlanner (Sun et al., 2023):Plan-and-Execute 范式中的技能学习方法,但依赖人工示范
  • 启发:对于任何需要重复执行的 LLM 推理任务,都可以考虑"先用高成本方法探索并收集轨迹,再蒸馏为低成本确定性流程"的策略