跳到主要内容

点对了按钮但点错了屏幕的 GUI Agent

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个计算机使用智能体拍摄了一张截图,对其进行推理,决定点击像素点 (840, 612) 处的“确认”按钮,并发送了点击指令。当光标落下时,一个弹窗出现了。三秒钟前还是“确认”的像素点,现在变成了“删除”。该智能体完全按照计划执行了操作。但它的计划是针对一个已不再存在的屏幕制定的。

这不是定位(grounding)错误。模型正确识别了按钮。这也不是推理错误,计划本身是合理的。这是一个时序错误(timing error)——这是 GUI 自动化中监测最不足的失败类别——而你的测试套件几乎肯定没有覆盖它,因为你的测试环境在观察和行动之间从未发生过变化。

一个令人不安的测量结果:最近一项针对真实 Ubuntu 工作负载下的桌面智能体的研究发现,从智能体观察屏幕到基于该观察采取行动之间,平均存在 6.51 秒 的间隔。对于 UI 来说,6.5 秒是漫长的永恒。通知会弹出,懒加载列表完成加载,动画趋于稳定,焦点发生转移。智能体对屏幕的心理模型是有保质期的,但几乎没有智能体框架会这样对待它。

计划是针对不断变化的余额开出的支票

标准的计算机使用循环看起来具有极高的原子性:观察、思考、行动、重复。写出来就像一个事务。但它并不是。

观察是一张截图——在 T 时刻捕获的冻结伪像。“思考”是一个视觉语言模型对百万像素图像进行推理,这需要消耗数秒的实际计算时间。而行动是在 T+n 时刻发送的物理鼠标事件。在 T 到 T+n 之间,操作系统并没有暂停。智能体推理的屏幕和点击落下的屏幕是两个不同的屏幕,只是恰好共享一个坐标系。

一个有用的类比:计划是针对银行账户开出的支票。当智能体观察屏幕时,账户里有一定的余额——这些按钮、这些坐标、这些含义。支票随后被兑现。如果其间余额发生了变化——弹窗抢占了焦点、插入了一行、弹出式提示(toast)顶开了布局——支票仍然会针对当前在那里的任何内容进行兑付。像素坐标不会退票。它们总会击中 某些东西

这就是屏幕状态漂移的核心。智能体不会收到错误提示。它得到的是一个“错误的成功”。点击落下,动作“完成”,轨迹继续——现在是在一个智能体从未真正见过的屏幕状态上运行。随后的每一步都会加剧这种偏离,因为每一个新计划都是建立在前一个动作按智能体预期执行的假设之上的。

为什么基准测试隐藏了这一点

如果屏幕状态漂移很常见,你可能会期望基准测试数据会对此发出警示。但它们大多没有,其中的原因极具启发性。

大多数智能体基准测试在冻结的环境中运行。受测页面在智能体观察和行动之间是静态的,因为那台机器上没有发生其他任何事情——没有真实的通知,没有后台同步,没有 A/B 测试变体切换,也没有同事的 Slack 消息滑出面板。基准测试是在真空中衡量定位和计划能力,而定位确实很难:在 OSWorld 上,计算机使用的完全成功率在 38% 左右,而人类约为 72%,分析一致认为不准确的点击定位是主要的失败模式。仅通过改进定位能力,就将 OSWorld 的得分从 20 多分提升到了 50 分以上。这是在一个真实问题上取得的真实进展。

但这是在 静态 问题上的进展。那些故意扰动环境的基准测试则揭示了一个更糟糕的情况。TimeWarp 重建了跨越六个不同设计时代历史 UI 版本的相同 Web 任务,它显示出在单一界面版本上微调的智能体在布局改变的那一刻就变得非常脆弱——而这种脆弱性在你进行专门测试之前是不可见的。空间推理探测发现,在标准定位基准测试中得分超过 85% 的模型,一旦任务需要推理布局关系而非记忆中的元素外观,其得分就会下降 27 到 56 分。

教训并不是说基准测试毫无用处。而是一个高分的冻结基准测试只能证明智能体在静止的世界中是可靠的。生产环境不会静止不动。这两个数字之间的差距就是你的屏幕状态漂移风险暴露,而没有人报告它,因为没有人的基准测试是为了揭露它而构建的。

屏幕在脚下移动的三种方式

屏幕状态漂移不是单一的 Bug。它是一个家族,其成员的失败方式各不相同。

中断弹窗。 一个对话框、一个权限提示、一个系统通知,或是一个“你的会话即将过期”的横幅。它出现在观察到行动的间隙,要么抢占焦点,要么重绘智能体目标所在的区域。这是最危险的变体,因为弹窗通常就是 被设计为 捕获点击的——它的主要按钮就位于用户(和智能体)反射性点击的地方。安全研究人员已经证明,能够在正确时刻触发通知的攻击者,可以近乎完美地重定向智能体的点击,而在智能体推理的截图中看不到任何攻击证据。漂移不仅是一个可靠性错误;它还是一个攻击面。

懒加载列表。 智能体看到五个结果的列表,计划点击第三个,并发送点击。在间隙中,又有三个结果流式加载到首屏上方,列表重新排序。第三行现在变成了第六项;而原来的第三个 位置 现在变成了其他内容。无限滚动、骨架屏加载器和异步搜索结果都会产生这种情况。智能体的计划参考的是位置;而在点击落下时,该位置已经参考了不同的内容。

尚未稳定的动画。 一个面板在 300 毫秒内滑入。一个下拉菜单展开。一个页面切换正在淡入淡出。智能体在动画进行中截屏,针对仍在移动的元素进行定位,并点击了元素 曾所在 的位置,而不是它 停止 的位置。这是最细微的变体,因为屏幕并不是在响应任何外部因素而变化——它只是还没有完成对智能体自身上一个动作的渲染。

总结这三者的共同点:智能体将截图视为真相(ground truth),而它实际上是一个 预测——即声称当动作触发时,屏幕仍然会是这个样子。这个声称经常是错误的,而智能体没有任何机制来察觉。

重新定位:验证目标依然是你所认为的那个

修复方法在概念上很简单,但在操作上很烦人,这也是为什么大多数框架都会跳过它的原因:永远不要信任来自上一次观测的坐标。 在执行每项操作之前立即重新定位。

重新定位意味着在发出点击指令之前,智能体(agent)会获取一次新的观测,并确认目标元素仍然是计划中所预期的那个元素。这不仅仅是“在 (840, 612) 位置是否有一个可点击的东西”——那里几乎总会有 某些东西。这种检查是语义层面的:目标位置的东西是否仍然是那个“确认”按钮,并且具有计划中所确定的标签、角色和周围上下文?

在实践中,这看起来像是决策与执行之间的一个验证层。一种桌面智能体防御机制会在每次操作前使用三个低成本信号重新检查 UI 状态:对点击目标周围的掩码区域进行像素相似度检查;通过全局截图差异对比来检测 任何 变化;以及通过窗口系统快照差异对比来捕捉像素本身无法察觉的焦点变化。如果目标区域发生了变化,操作将被终止,智能体将重新观测并重新规划,而不是触发一个过时的点击。其原则可以概括为:用廉价、快速的变化检测来守卫昂贵且不可逆的操作。

认真对待重新定位会带来一些设计上的结果:

  • 只要平台允许,优先选择语义定位器而非原始坐标。 无障碍树节点、DOM 选择器或稳定的元素 ID 在布局偏移中能够幸存,而像素坐标则不然。像素是最后的定位手段,而非首选。
  • 缩小从观测到操作之间的时间间隙。 你从模型延迟中节省出来的每一秒,都为屏幕移动减少了一秒的时间。运行在靠近操作循环的小型、快速的定位模型不仅是成本优化,更是对正确性的提升。
  • 让破坏性和不可逆的操作付出额外成本。 提交支付、删除记录或发送消息的点击,其重新定位的阈值应该比滚动页面的点击更严格。一个过时的良性点击的代价是重试;而一个过时的破坏性点击的代价则是一起事故。

将动态屏幕视为常态进行设计

更深层次的转变在于架构。大多数智能体循环的编写方式都好像静态屏幕是常态,而模态框是需要修补的边缘情况。生产环境则恰恰相反。中断通知、流式列表、未停止的动画——这些都不是边缘情况。它们是家常便饭。

为动态屏幕构建的智能体看起来会有所不同。它默认假设其观测是过时的,并将“新鲜度”视为需要重新建立的东西,而非预设的前提。它能区分“操作失败”和“针对非预期屏幕的操作成功”——并对第二种情况进行检测,因为隐形的错误成功比明显的失败更糟糕。它内置了显式的稳定点(settle points):在触发过渡的操作之后,它会等待屏幕停止变化后再进行下一步的定位,而不是在动画过程中截屏。对于高风险环节——任何不可逆的操作、任何涉及财务的操作、任何用户不希望出错的操作——它宁愿确认也不愿猜测,当对屏幕新鲜度的信心较低时,会将操作提交给人工检查。

这会带来延迟成本。在每次操作前重新定位意味着每一步都要进行第二次观测。等待稳定意味着刻意不行动几百毫秒。面临快速交付压力的团队可能会倾向于削减这些步骤。这种权衡是真实的,但这与任何分布式系统中的输入验证或乐观并发检查是一样的:通过一笔小额的、可预测的税收,来避免罕见、昂贵且难以调试的损坏。GUI 智能体 本质上 就是一个分布式系统——智能体和 UI 是两个进程,它们在没有锁的情况下共同更改共享状态。截图是你的“读”操作;点击是你的“写”操作;而现在,大多数智能体在执行“读-改-写”时,都没有验证之前的“读”是否依然有效。

总结

下次当计算机操作智能体在生产环境中做出一些莫名其妙的事情时——买错了商品、归档了错误的线程、确认了错误的对话框——请抵制住责怪定位能力或推理能力的本能。调出轨迹,查看观测时间戳与操作时间戳之间的间隙,并询问屏幕在那个窗口期内正在做什么。很大一部分“智能体失控”事件根本不是失控行为。它们只是智能体在一个已经发生移动的屏幕上,忠实地执行了一个正确的计划。

定位准确性之所以受到研究关注,是因为它在静态基准测试中是可以衡量的。屏幕状态漂移被忽视也是出于同样的原因——它在静态基准测试中是不可见的。但交付到真实软件中的智能体并不是在静态屏幕上操作。它们是在真实的屏幕上操作,充满了模态框、消息提示(Toasts)和懒加载。区分可靠的计算机操作智能体与演示原型(demo)的准则,并不是更好的定位能力,而是永远不要信任截图在你采取行动时依然有效。

References:Let's stay in touch and Follow me for more thoughts and updates