为什么 GUI Agent 离线动作准确率高,闭环任务成功率仍可能很低?
未标记
考查重点:单步准确率与闭环误差累积。单步正确率不衡量恢复与状态累积,连续小错可放大;闭环还受页面变化、延迟和错误动作后的偏离影响
本题目录
参考答案
核心回答
因为两者衡量的对象不同:离线动作准确率通常是在给定截图和历史下,判断下一步动作是否正确;闭环成功率要求 Agent 在自己的操作结果上持续决策,最终真正完成任务。 定位按钮准确,只解决了链路中的一部分。
主要差距有四个:
- 测试状态不同。 离线样本常来自正确轨迹;闭环中一次误操作会改变后续页面,模型可能进入没有见过的状态,还要知道怎样恢复。
- 长链路会累积风险。 一个任务需要多次定位、输入、等待和跨页操作,任何关键步骤失败都可能阻断任务。
- 动作正确不代表状态变化符合预期。 点击可能被遮挡、页面尚未加载、输入进入错误页面,或者请求已发出但结果还没落地。
- 结束判断也是能力。 表单填写正确却没保存、只完成部分要求,或模型过早宣布完成,都能得到不错的局部动作分数,却无法通过任务验收。
因此要同时看单步、错误恢复和最终结果,并沿执行轨迹定位第一次使任务偏离的动作,不能直接用离线动作准确率推算闭环成功率。
为什么一个小错会影响后面很多步
离线动作评测可以在每道样本重新给出正确截图和历史;模型即使答错上一题,下一题也不一定承受它造成的页面变化。闭环执行则不同:误点到另一条记录后,后续所有“正确填写”都可能发生在错误对象上。
只作概率说明:假设每步独立、成功率都是 95%,并且任意一步失败都会导致整个任务失败,那么连续 20 步全部成功的概率约为 $0.95^{20}=35.8%$。真实任务中错误相关、路径长度不同,而且有些错误可以恢复,所以这个算式不能作为实际成功率估计;它只说明单步指标不能替代整条轨迹的验收。
恢复能力还依赖任务状态:哪些要求已完成、当前页面属于哪个对象、刚才的动作是否生效、重复操作会不会产生副作用。只训练或评估理想轨迹,会漏掉误操作后怎样回到目标路径的问题。
应该怎样评测和改进
固定任务、初始页面与数据状态、模型及工具版本、步数和时间预算,从同一初始状态执行完整任务。闭环评测可以在本地可重置环境中进行,并不要求访问公网。
分别记录:
- 单步能力: 目标元素定位、动作类型、参数和输入内容是否正确。
- 过程可靠性: 页面切换后是否重新观察、动作是否实际生效、遇到超时或错误页面能否恢复,是否出现重复点击与无效循环。
- 任务结果: 对象、字段、保存状态与全部约束是否满足;优先检查页面最终状态、业务记录或实际产物,而非仅凭 Agent 的完成声明。
- 代价与限制: 总步数、耗时、调用成本、转人工情况,以及任务长度或动态页面变化带来的退化。
复盘时找第一次关键偏离:若元素定位错,就改感知与定位;若点击正确但页面未就绪,就改等待与重观察;若所有局部动作都对却没完成要求,就查规划、状态记录和验收条件。对于允许多条正确路径的任务,不能只因轨迹与标准答案不同就判失败。
对应教程
- 《AI Agents 从零到一》:Agent 智能体:回看根据工具结果继续决策的
ReAct循环;本文进一步区分静态动作匹配与整条交互任务的验收。
参考资料
- 国内:Guide / JavaGuide:Loop Engineering:采用读取状态、执行、反馈和外部结果验证的分工,解释为什么一次动作输出还不足以证明任务完成。
- 国内:Onefly / zero2Agent:评估与全局观:借鉴任务成功、成本、鲁棒性和失败归因分层记录的方式,组织正文中的评测与排查方法。
- 国内:字节跳动 Seed、清华大学:UI-TARS:依据离线单步与在线任务评测的区别,以及理想轨迹缺少错误恢复样本的分析,解释状态偏离和恢复能力带来的差距。
- 国内:阿里巴巴、北京交通大学:Mobile-Agent-v2:采用比较动作前后状态、区分错误操作与无效操作的思路,说明动作执行后仍要核对效果和任务进度。
- 国外:Zhou 等:WebArena:借鉴按任务所需信息、页面状态和底层记录验证功能结果的方法,解释为什么不应只匹配动作序列或完成文本。
- 国外:OpenAI:Computer-Using Agent:采用感知、推理、行动的迭代方式,说明多步任务需要利用当前与历史反馈调整后续操作。
browser-usePython
核心回答
browser-use 用 Python 将浏览器状态、模型决策和工具执行组成循环:每轮读取页面截图、DOM 等状态,结合前一轮动作结果生成下一步,再执行动作并把结果送回后续观察。模型选对一个元素,并不代表整批动作仍然适用于执行后的页面,更不代表任务已经完成。
以一次报价采集为例,模型根据当前页面规划“输入产品型号、筛选、打开报价详情”;筛选或打开详情可能导致导航或切换活动页面,原页面中的元素索引随之不再适用。此时应先确认目标供应商和产品规格,再决定下一步。
动作批次为什么要提前停止
multi_act() 支持一轮模型输出多个动作,但会在两类情况下停止剩余队列:
- 动作声明会改变页面。 导航、返回、切换页面等动作标有
terminates_sequence=True,执行后不再继续这一批后续动作。 - 执行后发现页面上下文改变。 比较动作前后的
URL和agent_focus_target_id;URL 或活动页面目标改变,就停止剩余动作。这里的焦点指浏览器活动页面目标,不是某个输入框获得键盘焦点。
此外,动作返回错误、任务结束或出现执行异常,也会结束当前批次;此前已经得到的部分结果会保留。具体机制见批次执行与页面变化保护。
停止批次意味着剩余动作没有执行。进入后续步骤时,Agent 根据新状态与已有结果重新决策,代码没有承诺把被截断的整批动作原样自动重试。当前实现也没有“页面新增任意元素就停止批次”的判断;新元素的 is_new 标记用于后续页面描述,不能替代批次中的变化检测。
因此,弹窗或局部重绘即使没有改变 URL、活动页面目标,也可能使后续动作依据过期。批量动作减少模型往返,但会扩大两次观察之间的状态变化窗口;需要按任务中页面变化的频率选择动作批次,而非只追求一次生成更多操作。
错误反馈能帮助继续,不能保证恢复成功
每轮 step() 先准备浏览器状态和前步结果,再请求模型、执行动作和后处理。工具超时或异常会转成 ActionResult,供后续决策使用;普通动作异常会保留先前部分结果,连接异常则交给外层处理。循环仍受步数、超时和失败条件约束,不会无限尝试。见观察与执行循环。
工具结果还需要按含义判断。例如点击索引已失效时,工具会返回“页面可能已经改变,请刷新状态”的内容提示,并不总是设置 error。因此不能用“没有异常”统计所有点击成功;更应该核对所需页面状态是否发生变化。超时也不保证前一个动作没有产生任何副作用,决定重试前还需观察结果。
完成声明怎样与真实结果核对
当前默认启用的 judge 会查看任务、轨迹和截图,把评判附到结果中;它不会覆盖 Agent 自报的 success。发现 done 后,执行循环运行 judge 并结束,并没有“judge 判失败就自动重做”的分支。见完成后的 judge 调用与评判结果的作用。
评测时应分别保存 Agent 自报、judge 判断和业务验收结果。例如确认报价页中的目标产品、价格字段、币种与附件内容,而不是看到“点击成功”或 done 就计为任务成功。对同一组任务再比较动作批次、等待策略和错误恢复后的成功率,才能判断问题主要在模型定位能力,还是执行循环与结果确认。
相关面经
1 篇作业帮
AI 应用算法工程师为什么 GUI Agent 在离线动作准确率很高,闭环任务成功率仍然可能很低?