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 在退化,是工程在收敛。

相关推荐
全栈技术负责人22 分钟前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
智码看视界32 分钟前
Apodex-1.1-mini 部署实测:Int4 量化 18GB 单卡跑通 Agent Team,35B 开源逼近 1T Kimi
开源·agent·模型量化·智能体·开源大模型·大模型本地部署·apodex
夏文强39 分钟前
DeepSeek Harness 底层探秘:Cordis 元框架与「一切皆插件」的实现
人工智能·开源·大模型·agent·deepseek
岁月宁静1 小时前
四、《从零手撸 Agent》 — 流式输出:接住 AI “一个字一个字” 想出来的过程
python·agent
岁月宁静1 小时前
三、《从零手撸 Agent》 · system prompt 与核心参数:调好你的旋钮
后端·python·agent
夏文强1 小时前
DeepSeek Harness 可追溯性实战:会话日志的 resume、fork 与 replay
人工智能·开源·大模型·agent·deepseek
学者猫头鹰2 小时前
Spring AI 教程
ai编程
烬羽2 小时前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent
枫叶丹42 小时前
小模型与本地 Agent:不是更小的替代品,而是新的系统分工
人工智能·chatgpt·agent·codex