Agent Loop 越做越像 RPA:浏览器自动化里的五个反直觉

写在前面

最近半年我在做一个基于 CDP 的浏览器自动化 CLI,目标是给 Claude Code 这类 agent 提供"看页面、点按钮、打字"的能力。最初的实现是教科书式的 agent loop:截图 → 多模态 LLM 推理 → 输出动作 → 执行 → 再截图。一年下来,这套循环被砍得越来越薄,核心反而退回到了一个看起来很"古典"的形态 ------ 像 RPA。

下面五条都是从这个项目里硬碰出来的,跟主流叙事里的"agent 越来越自主"反着走。


一、DOM 比视觉更便宜也更准

第一直觉是"页面是给人看的,所以让模型看截图最自然"。错。

document.querySelectorAll 一行 JS 就能拿到全部可交互元素,带 xpath、role、label,精确度远超截图 → 检测 → OCR 这条链。一次 Runtime.evaluate 在毫秒级,一次多模态推理是 1--3 秒、几分钱起步。

在我的 CLI 里,DOM 原语层处理掉 90%+ 的任务,多模态视觉层只在 canvas / shadow DOM / 滑块验证码这种 DOM 拿不到东西的场景出动。视觉 fallback 不是"更聪明",而是"更贵更慢的最后选项"。


二、分层 fallback,不是 multi-agent

业界很流行 planner + executor 两个模型互相调用的设计。我们试过,最后结论是:两个 LLM 比一个 LLM 更脆,而不是更鲁棒。原因不复杂 ------ planner 的输出和 executor 的预期不对齐时,没有第三方仲裁,只能靠 retry 砸钱。

替代方案:一个调度者(外层 agent,比如 Claude Code 自己),两层不同能力 ------ DOM 原语(确定性、零 LLM)+ 多模态 fallback(LLM 推理)。调度逻辑写死在 skill 文件里:默认 A,A 同一子目标失败两次才升级 B,B 一步后立刻回 A 验证

这是分层 fallback,不是多 agent 协作。少一个 LLM,稳两个数量级。


三、录制是一等公民,不是事后日志

我们最初把"录制"当作可选的 debugging 工具 ------ 写在文档里、用户自己开。后来发现这是个错觉:agent 跑成功的那次,就是最值钱的回放素材。下次同样的任务,你不需要 LLM 决策、不需要视觉,把这次的 XML 编排播一遍就行。

所以现在的设计是:browser open 自动启录、browser close 自动停录并返回 XML artifact。录制覆盖整个自动化生命周期,不管中间路径是 DOM 还是视觉。这把 LLM 调用的成本从"每次都要"压成"第一次定型"。

事后看,这就是经典 RPA 的工作模式 ------ LLM 只是录制阶段的一个可选辅助。


四、Skill 是行为契约,不是 prompt 模板

Claude Code 的 skill 系统有个反直觉的用法:别把它写成"使用说明",把它写成"行为契约"。

举个我自己 skill 里的 iron rule:

Layer A is the default. Every browser task begins with snapshot -i + the appropriate primitive. Do not jump to the visual layer because the task "looks visual" --- try primitives first.

这条不是给我自己看的,是给未来 cold-start 的 agent 看的。下次同一个 agent 接到任务,看不到上下文,只能读 skill 决定行为。规则越短、越绝对、越带"why"和"counter-example",越能扛住模型的随机性。

把 skill 当业务文档写,你会得到一堆"这里也行那里也行"的废话;当契约写 ------ 哪些必须做、哪些禁止做、违反就算用错 ------ skill 才有价值。


五、不可逆操作要在 CLI 层打围栏

Agent 升级到能自动操作浏览器之后,第一个翻车场景一定是"它替我点了一个不该点的按钮"。我们的解法:把不可逆性下沉到 CLI,而不是依赖 prompt

比如录制的生命周期管理:browser open 启动时自动启录、所有权归 'browser' 这一层,中途的 GUI 子会话即使被 end,也只能停掉自己的录制(如果是它启动的),外层的录制继续跑。这意味着即使 agent 中途搞砸,任务边界也被"open → close"严格括起来,录制 artifact 永远对应一个完整的自动化片段。

Skill 文档里的"必须 close"是软约束,CLI 里的状态机才是硬约束。两者一起才扛得住 LLM 的不靠谱。


结语

Agent loop 这两年的演化路径,本质上是把 LLM 从"控制流主体"挤回"专家系统的接口"。LLM 决策一次、生成可回放的脚本、之后每次靠脚本。这跟 1990 年代 RPA 的工作方式只差一个录制阶段的智能化。

不是 agent 在退化,是工程在收敛。

相关推荐
沸点小助手7 小时前
「技术er迷惑行为大赏 & 520不拘形式,自在过节」获奖名单公示|本周互动话题上新🎊
openai·ai编程·沸点
guyoung7 小时前
BoxAgnts介绍(1)——开箱即用(Out-Of-The-Box)
rust·agent·ai编程
Keano Reurink7 小时前
SEO数据管道:用Airflow搭建自动化工作流
运维·人工智能·爬虫·搜索引擎·自动化·ai编程·seo
HIT_Weston8 小时前
93、【Agent】【OpenCode】edit 工具提示词(二)
人工智能·agent·opencode
水月沐风8 小时前
把文章发布到掘金,做成一个可复用的 juejin-skill
ai编程
AI原来如此8 小时前
我用AI Agent做产品设计,省了20小时原型时间
人工智能·ai·大模型·ai编程
AI小百科8 小时前
端到端AI编程的核心原理
ai编程
这是谁的博客?8 小时前
AI 领域精选新闻(2026-05-24)
人工智能·ai·大模型·agent·ai安全
Loli_Wolf9 小时前
AI 原生研发闭环:从提需到线上监测,再自动回到提需
人工智能·深度学习·算法·microsoft·ai·ai编程·harness