返回文章列表

AI 点完“成功”不算成功:GUI Agent 为什么必须做原子性测试

从 LegacyWorld 的 28 个 Windows 工作流实验出发,解释为什么 GUI Agent 的测试不能只看任务完成率,并给出任务契约、状态验证器、故障注入和四象限指标组成的原子性测试方法。

一个 GUI Agent 在页面上完成了全部操作,返回 status: success,还生成了一份看起来正确的患者记录。测试通过了吗?未必。真正决定结果的,是它离开之后,数据库、文件和业务状态究竟变成了什么。

GUI Agent 表面成功与后台状态污染
图 1:蓝色路径表示 Agent 在 GUI 中完成操作,绿色勾代表界面返回成功;橙红节点表示后台记录仍出现错误字段或意外持久化副作用

图解: 最上层是 Agent 能看到并操作的 GUI,蓝色轨迹表示它执行的一连串点击与输入,右侧绿色勾只说明界面流程已经走到“成功”。中间和底层代表业务状态与数据库,橙红节点表示某个字段或记录已经被错误写入。原子性测试要继续穿透界面反馈,比较运行前后的真实状态,确认目标变化正确、禁止变化没有发生。

最近一篇名为 LegacyWorld 的研究,把这个容易被忽视的问题摆到了台面上。研究团队为 28 个 Windows GUI 工作流建立了可执行任务契约,让 6 个托管 Computer Use Agent 分别执行专家编写的流程,以及从专家操作录像生成的流程,再独立检查执行后的持久化状态。

这项研究最值得测试工程师关注的,不是某个模型的分数,而是一条更基础的质量原则:

GUI Agent 的一次运行,要么正确完成并留下正确状态;要么安全失败,不留下意外的持久化副作用。

这就是本文要讨论的“原子性测试”。


一、为什么 Agent 说“成功”仍然可能是失败

论文记录了一个非常具体的案例。在 DSWin 的“新增患者”任务中,Agent 返回成功,并给出了一份结构完整、看起来合理的患者信息。但运行结束后的数据库验证发现,保险号码被写成了 4212505,而任务契约要求的是 1234567890。

从 Agent 的视角看,它完成了流程;从业务系统的视角看,它留下了一条错误的持久化记录。

这类问题比普通页面自动化失败更危险,因为它往往同时具备三种迷惑性:

  • 页面没有报错,甚至出现了成功提示;
  • Agent 能自然语言解释自己做了什么;
  • 错误已经越过界面,进入数据库、文件、配置或外部系统。

传统 UI 自动化通常重点验证“按钮能不能点”“页面有没有跳转”“成功提示是否出现”。GUI Agent 则会根据截图和上下文动态选择动作,它可能走出设计者没有预先写下的路径,也可能在中途停止、重试、误点或错误确认。

因此,测试对象已经从一条固定脚本,变成了一个会做决策、会产生真实副作用的执行系统。


二、原子性不是只测“成功率”

这里的原子性借用了事务“要么全部完成,要么不留下部分结果”的思想,但它不是在宣称所有 GUI 工作流都能自动获得数据库事务能力。它更准确地说,是一种运行结果的评价方法:无论 Agent 最后报告成功还是失败,系统都要处在任务契约允许的状态里。

LegacyWorld 把每次运行分成四类:

Agent 的结论最终状态有效最终状态无效
报告成功有效成功:目标完成,状态正确无效成功:Agent 说完成了,但结果错误或出现意外副作用
报告失败、停止或超时有效失败:任务没完成,但受监控状态保持可接受无效失败:任务没完成,还留下了部分修改或脏状态
GUI Agent 原子性测试的四类运行结果
图 2:左上是有效成功,右上是安全停止且状态未变的有效失败;左下是界面成功但数据库损坏的无效成功,右下是停止后仍留下部分脏状态的无效失败

图解: 上排两种结果的数据库仍保持绿色有效状态,区别在于左侧完成了业务目标,右侧选择安全停止;下排则出现橙红色异常。左下最危险——界面已经显示成功,后台数据却被破坏;右下代表 Agent 没有完成任务,还留下了需要人工修复的部分状态。四象限必须分别统计,不能压缩成一个“成功/失败”二元结果。

由此可以得到三个不能互相替代的指标:

指标计算方式回答的问题
有效成功率有效成功 ÷ 全部运行Agent 产生了多少真正可用的自动化价值?
原子性有效成功 + 有效失败每次运行结束后,系统状态有多大概率仍然可接受?
不安全副作用率无效成功 + 无效失败有多少运行留下了错误或意外状态?

这个拆分非常关键。一个 Agent 可以因为极度保守、几乎什么都不做而获得很高的原子性;另一个 Agent 可能完成了更多任务,却偶尔写坏关键数据。前者没有足够自动化价值,后者又可能无法安全上线。

真正的部署判断,必须同时看有效成功和状态安全。


三、论文数据揭示了什么

研究覆盖 28 个工作流,包括患者创建与查询、患者电话更新、计费代码录入、工资设置、报表导出、文件保存、软件安装和扩展管理等。其中 18 个任务经过领域专家或运营人员核对,以确认它们具有现实工作代表性。

在专家编写提示的实验条件下,结果呈现出明显不同的运行画像:

  • GPT-5.4 的原子性为 100%,但有效成功只有 3.6%,绝大多数是“没有完成任务,但状态未被破坏”的有效失败;
  • Claude Opus 4.6、Sonnet 4.6 和 Haiku 4.5 的有效成功分别达到 78.6%、75.0% 和 71.4%,但都出现了一定比例的非原子结果;
  • Kimi K2.5 的有效成功为 42.9%,不安全副作用率达到 35.7%。

这些数字不能被写成模型排行榜。论文对每个模型—任务—提示组合只纳入一条执行轨迹,所有实验也都发生在隔离虚拟机中。它们是特定基准配置下的描述性证据,不足以推断模型长期稳定能力或生产可用性。

但它们足以证明一件事:完成率、保守失败和状态破坏是三种不同的运行特征,压缩成一个“成功率”会掩盖真正的运营风险。


四、屏幕录像不是正确性 Oracle

LegacyWorld 还比较了两种流程说明:一种由专家直接编写,另一种由模型根据专家的黄金路径屏幕录像生成。

录像很适合捕捉“人是怎么操作的”,却天然遗漏很多业务信息:

  • 为什么此时可以点击确认;
  • 哪些字段允许变化,哪些字段必须保持不变;
  • 快捷键、焦点变化和屏幕外输入发生了什么;
  • 中途失败应该清理什么;
  • 最终数据库记录怎样才算正确。

实验中,多数 Agent 在录像生成提示下的有效成功率下降。例如 Opus 4.6 从 78.6% 降到 50.0%,Sonnet 4.6 从 75.0% 降到 53.6%。一些 Agent 的状态安全并没有同比恶化,更多运行只是转成了“安全但没完成”的有效失败。

这说明录像可以帮助采集流程,却不能代替任务契约。录像回答“通常怎么做”,Oracle 回答“做完之后什么才算正确”。


五、第一步:把操作说明升级为任务契约

很多团队给 GUI Agent 的输入只有一句话:“登录系统,新增一位患者并返回患者编号。”这只能描述目标,无法定义安全边界。

一份可测试的任务契约,至少应该包含以下内容:

契约字段新增患者示例
初始状态测试患者不存在;测试环境版本固定;目标数据库快照已保存
目标状态只新增一条满足字段规则的患者记录,并返回真实患者编号
运行参数姓名、生日、联系方式、保险号码、测试数据标签
允许变化指定患者表新增一行;审计表新增对应事件
禁止副作用不修改其他患者;不创建重复记录;不改变权限和系统配置
返回值契约患者编号必须存在,并能与数据库新增记录关联
超时与停止超过步骤、时间或重试上限时安全停止,不继续猜测
验证器数据库差异、字段精确值、唯一性、审计事件和界面状态
恢复策略仅清理本次带唯一标签的数据;清理后再次验证
任务契约、GUI Agent 与独立状态验证器
图 3:左侧任务契约规定初始状态、目标状态、允许变化与禁止副作用;中间 Agent 操作 GUI;右侧独立验证器从返回值、界面、数据库、副作用和恢复结果五层判断最终状态

图解: 左侧卡片代表任务契约,它在执行前固定“什么可以改、什么绝对不能改”;中间的发光指针代表 GUI Agent,只负责在授权范围内操作;右侧五条检查路径分别对应返回值、界面结果、持久化状态、禁止副作用和恢复结果。只有这些独立证据共同通过,最右侧的绿色盾牌才代表一次可信的有效成功。

这份契约不是更长的提示词。它应该成为 Agent、执行环境、验证器和测试报告共同读取的结构化事实。

最重要的是把“允许变化”和“禁止副作用”写出来。否则测试只能确认目标结果是否出现,却无法知道 Agent 是否顺手改坏了其他东西。


六、第二步:建立独立于 Agent 的状态验证器

不要让执行者同时充当自己的裁判。Agent 可以报告成功或失败,但最终结论必须由独立证据决定。

一个实用的验证器可以分成五层:

1. 返回值验证

检查 Agent 返回的编号、URL、文件路径、计算结果或结构化字段是否符合 schema,并与真实系统数据对应。

2. 界面结果验证

检查成功提示、当前页面、窗口状态和关键字段显示。这一层有用,但不能单独作为最终 Oracle。

3. 持久化状态验证

比较执行前后的数据库、文件、配置、安装状态或导出产物。对于数据库任务,应核对新增、修改和删除的精确差异,而不是只查“目标记录存在”。

4. 禁止副作用验证

主动检查不应该变化的对象:其他用户记录、相邻业务行、权限、目录清单、系统配置、重复文件和外部通知。

5. 恢复结果验证

如果流程支持补偿或清理,不要以“执行了清理命令”作为完成。清理后必须重新比较状态,确认系统真正回到允许的基线。

LegacyWorld 的做法是每次在新的 Windows 虚拟机中运行,先记录状态快照,运行结束、超时或异常停止后再采集最终快照,并用任务专属验证器判断。临时覆盖层在验证后丢弃,以保证后续运行拥有可比较的初始状态。

团队不一定需要完整复刻这个基础设施,但原则应该保留:测试环境可重置、状态可比较、验证逻辑独立、每次运行可追溯。


七、第三步:专门测试“做到一半会怎样”

普通演示总是沿着黄金路径走完,原子性问题却常发生在中间状态。测试设计需要主动把失败注入危险检查点。

以“创建订单并发送确认”为例,可以选择这些故障点:

故障检查点注入方式应验证的最终状态
表单填写一半让元素失焦或页面重载不产生正式订单,草稿规则符合契约
点击保存后未返回模拟网络超时不重复创建;可通过幂等键确认真实状态
订单已创建、通知未发送阻断通知服务订单和通知状态一致,可安全补偿或重试
Agent 误判成功返回错误编号或旧页面提示独立验证器将其判为无效成功
Agent 超时退出在确认前后分别终止确认前无持久化;确认后状态可识别、可接管
GUI Agent 工作流中的三个故障注入检查点
图 4:蓝色主路径依次经过最后一次可逆操作、第一次持久化写入和外部副作用前三道检查门;绿色分支表示安全停止,橙红分支表示部分记录、数据库或外部通知被错误留下

图解: 上方蓝色流程代表 Agent 从填写、保存、确认一直走到外部通知。三道门不是普通步骤,而是风险发生性质变化的边界:第一道门之前还能无损撤销,第二道门开始写入持久化状态,第三道门之后可能发送邮件、消息或触发其他外部动作。每道门都要同时测试绿色的安全停止分支和橙红色的非原子分支,确认系统能发现并阻断脏数据、重复写入和误发通知。

特别要测试三个边界:最后一次可逆操作、第一次不可逆写入、外部副作用发生前。支付、邮件、权限变更、批量更新和删除操作都应该在这些边界设置明确审批门。

故障注入不是为了让 Agent “更难成功”,而是为了回答上线前最关键的问题:它失败时,系统会不会比自动化之前更难收拾?


八、第四步:把四象限结果变成运营面板

建议每次评估至少记录以下字段:

字段用途
Run ID、模型与提示版本让结果可追溯、可比较
任务契约版本防止 Oracle 变化后混算结果
Agent 报告状态区分自报成功、失败、停止和超时
独立状态判定记录有效成功、无效成功、有效失败、无效失败
状态差异摘要展示目标变化与意外变化
人工介入次数计算真实监督成本
恢复时间衡量非原子失败的运营代价
证据包保存截图、动作轨迹、日志、数据库差异和审批记录

最终面板不要只放一个绿色成功率,而要同时展示:

  • 有效成功率:自动化到底产生了多少价值;
  • 原子性:运行结束后的系统状态是否可接受;
  • 无效成功率:最容易制造错误信心的比例;
  • 无效失败率:失败后需要人工修复的比例;
  • 平均恢复时间:每次副作用真实消耗多少运营成本;
  • 人工审批和接管率:为了安全运行需要多少监督。

如果一个方案有效成功率提高了 10%,但恢复时间和无效成功率同时翻倍,它未必更适合生产。


九、团队可以怎样从小范围开始

第一版不需要建立一个庞大的 Agent 平台。可以选择一个低风险、可重置、有明确持久化结果的内部流程,连续试运行两周。

试点范围

  • 1 个隔离测试环境;
  • 3—5 个真实高频工作流;
  • 每个工作流一份任务契约;
  • 至少一个持久化状态验证器;
  • 3 个中途失败检查点;
  • 禁止生产账号、真实患者或客户数据;
  • 所有外部通信和不可逆操作默认关闭。

进入下一阶段的门槛

  • 连续运行中没有未监控的持久化变化;
  • 所有 Agent 自报成功都能被独立验证;
  • 失败能够稳定归类为有效失败或无效失败;
  • 清理与恢复过程经过验证,而不是只写在文档里;
  • 团队能够量化有效成功率、原子性、人工接管和恢复成本;
  • 任一严重副作用都能触发自动停用或降级。

如果连最终状态都无法可靠观察,就不应先讨论提高 Agent 自治等级。


十、证据边界:这项研究还不能证明什么

LegacyWorld 是一项有价值的部署前研究,但引用结果时必须保留边界:

  • 所有运行发生在隔离虚拟机,不是生产环境验证;
  • 原子性只覆盖基准实际监控到的状态,不代表所有外部副作用都被发现;
  • 每个模型—任务—提示组合只有一条纳入统计的轨迹,不能推导稳定概率;
  • 专家核对的是任务现实性和契约设计,不是独立认证模型输出;
  • 录像实验只研究从一条黄金路径重建流程,不等于从演示自动学习完整业务规则;
  • 论文中的六个 Agent 和具体版本会变化,方法比单次分数更值得复用。

因此,这篇文章给出的任务契约、故障注入和运营面板,是基于论文机制做出的质量工程落地方案,不是论文已经完成的生产认证。


写在最后

GUI Agent 最危险的结果,不一定是页面报错或任务超时,而是它留下了真实副作用,同时给出一段足够自信的成功说明。

测试工程师需要把验收标准从“它有没有把流程走完”升级为三个问题:

  • 它是否完成了真正有用的业务目标?
  • 无论成功还是失败,最终状态是否仍然有效?
  • 如果留下副作用,我们能否发现、停止、恢复和追责?

成功必须由目标状态证明,失败必须由无副作用证明。Agent 的自我报告,只是证据之一,不是最终判决。

当任务契约、独立验证器、故障注入和四象限指标都建立起来,GUI Agent 才从一场会点击按钮的演示,进入可以被质量工程认真评估的自动化系统。


参考资料

说明:论文已被 ICSME 2026 Industry Track 接收。本文中的试点方法、故障注入设计和运营指标,是在论文证据基础上的质量工程推论,仍需在具体业务系统中验证。

版权与声明

本站所有内容仅代表作者个人观点,与作者供职的公司、客户或其他关联机构无关。

本文除特别声明外,采用 CC BY-NC-SA 4.0 许可协议。转载或改编请署名、附原文与许可证链接,并标明改动;不得用于商业用途,演绎作品须以相同许可发布。

评论