青雲的博客

Article

Computer Use 每轮 40 个工具错误,都出在哪里

· 13 分钟阅读

Orca 的 computer use 第二阶段在 v0.5.11 发布:模型可以观察和操作 macOS 上的其他 app,用的是 AX 树和窗口截图。用了一阵子,我觉得它还不够流畅,不够稳定,交互也比不上 Claude 的 computer use,还得接着打磨。

问题是「不够稳」没法验证。修一个点,自己试两次,感觉好了一点,换个 app 又不行。在动手之前,我先写了一套真机验收,后面每一个改动都拿它来量。

15 个任务

任务分两档。单步 8 项,S1 到 S8:用计算器算 1234 × 5678、在 Finder 里找某个目录按名称排序的最后一个文件、看系统设置里外观是浅色还是深色、用预览数一个 PDF 有几页、列出 Cherry Studio 侧边栏的入口、在 Chrome 里点一个按钮再读结果。多步 7 项,M1 到 M7:用文本编辑写一个三行的待办清单存到指定位置、在 Safari 里填表提交、在 Finder 里新建文件夹再改名、在系统设置里查芯片型号、先在工作区写一个计数器页面再用 Safari 点三次。

每一项都起一个新的 Orca 进程,跑的是真实的 TUI,模型是 deepseek-flash,默认的 auto-edit 模式。

一项任务怎么跑:preflight 记下已经开着的窗口、前台 app 和指针位置;启动 Orca,真实的 TUI 跑在 PTY 里,把任务原文输进去;审批面板从屏幕上渲染出来的面板读,只批准任务允许的 app 和窗口;独立核验读文件、AX 树和 OCR 等真实状态;指标来自会话 JSONL;最后清理核查,关掉新开的窗口,退出启动的 app,恢复前台 app 和指针

有几条规矩是写 harness 时就定下的:

  • 授权只从面板读。 harness 解析 TUI 渲染出来的审批面板,按任务允许的 app 回答,从不根据模型说的话推断「它应该已经有权限了」。面板上的窗口标题是用户的数据,不拿来判断,只认面板的目标行和预览末尾括号里的 bundle id。
  • 结果由核验器读真实状态。 文件读内容,界面读 AX 树,读不到 AX 的地方用 OCR。模型说做完了不算数:基线里有一次,S8 的模型点完按钮没有再观察,读了页面源码就说「与截图显示一致」。结果碰巧是对的,但这种「对」不能计入。
  • 收拾干净再跑下一项。 新开的窗口关掉,启动的 app 退出,前台 app 和指针位置恢复原状,偏差不超过 0.85 pt;服务和 TUI 进程退干净之后,下一项才开始。

一轮 15 项大约要 10 分钟的 GUI 时间。这段时间里,屏幕和键盘归 Orca,我得离开电脑。

前五次都死在 harness 上

真正拿到第一份干净的基线之前,前五次运行都中断了,每次中断的原因都是 harness 自己:

次停在原因
1S1 之后关掉计算器的窗口,它就自己退出了,随后的退出调用报错
2S2命令行助手不跑 run loop,读到的前台 app 是旧的;计算器还恢复了上次的显示,让 S1 假通过
3S8Chrome 地址栏的下拉框也是一个 AX 窗口,被当成了第二个新窗口
4S8合成的按键继承了前一个 Cmd+L 的 Cmd,about:blank 里的 n 触发了新建窗口;Chrome 也不接收多字符的按键事件
5S8Chrome 的状态气泡也是 AX 窗口,被当成了任务窗口

这张表我留着,因为它说明了 GUI 自动化难在哪:每一条都不是 Orca 的 bug,可每一条都会让一次验收作废。Orca 自己的驱动后来也踩到了同一类问题,比如 Chrome 新开的窗口和上一扇的尺寸位置一模一样,这个放到窗口边界那篇里讲。

基线

10 月 24 日的两轮完整运行,单步 7/8、7/8,多步 5/7、6/7。

审批已经不是主要摩擦了。第一次跑基线时每轮弹 86 个面板:真实 TUI 里的 computer 审批拿不到解析出来的 bundle id,「本会话允许这个 app」这个选项根本不出现,每一步都要问。修好之后降到每轮 16 个,每个任务对每个 app 只问一次。

两轮的工具错误是 37 个和 40 个,大头集中在三处:

  • GUI 一失败就转去 bash。 两轮一共 35 次失败的 bash 调用,主要是 open、open -a 和 osascript。在 Orca 的沙箱里,这些命令根本够不到别的 app,模型却一次次地试。
  • list_apps 给出的窗口编号用不了。 list_apps 会列出 app 的离屏辅助窗口,没有标题,也没有对应的 AX 窗口。模型选中它去 observe,得到的是 No accessibility window matches the capture window。两轮 15 次。
  • 系统设置的 AXRaise 报 -25205。 驱动在激活 app 之后无条件执行 AXRaise,系统设置的窗口不支持,整个动作就失败了,哪怕这扇窗本来就在最前面。两轮 14 次,第一轮的 M5 就是因此失败的。

两轮之间的差别也很大。S1 一轮用了 13 次调用,另一轮用了 23 次,区别是模型有没有逐个去点数字键;S4 一轮 2 次,另一轮 25 次,看系统设置那一次 AXRaise 成没成。所以后来定了一条规矩:一个改动至少跑两轮,才下结论。

除了错误,还有几件让我不太舒服的事:模型接管了我自己开着的 Finder 窗口(S3 两轮都是);系统设置的 AXRaise 反复失败之后,它执行了 killall "System Settings",auto-edit 下 bash 免审批,是沙箱让它没生效;M4 点名要用计算器,它直接用 python 算出了 368。

改了什么

可靠性这个子项目对着上面三处错误来,驱动协议从 1 升到 2:

错误从哪来、改了什么:list_apps 列出离屏辅助窗口,改成只列 observe 能用的窗口,逐个和 AX 窗口核对,核对有时间上限;GUI 一失败就转去 bash 的 open 和 osascript,工具说明写明这条路走不通,打开文件和网址用 launch_app 的 open;系统设置的 AXRaise 报 -25205,改成窗口已经在最前就继续,否则 150 毫秒后再试一次;app 刚启动没有窗口时,Command、Control 组合键和 Esc 直接发给 app;每种窗口错误单独一类并带上下一步;同一 app 连续失败 3 次提示停下来汇报,6 次本轮不再操作它

  • list_apps 只列 observe 真能用的窗口:逐个和 AX 窗口核对,核对有时间上限,app 不回应 AX 时退回可见的、文档大小的窗口。
  • 工具说明直接写明:shell 的 open、osascript 这类命令在 Orca 的沙箱里够不到别的 app,打开文件和网址请用 launch_app 的 open。
  • AXRaise 失败时先看这扇窗是不是已经是主窗口或焦点窗口,是就继续,不是就等 150 ms 再试一次,还不行才报错。
  • app 刚启动、还没有窗口时,Command、Control 组合键和 Esc 直接发给 app,模型可以用 Cmd+N 开第一扇窗。
  • 每种窗口错误单独一类,消息里带上下一步,比如没有窗口时提示用 Cmd+N 或者 launch_app 打开文件。
  • 失败预算:同一个 app 在一轮里连续失败 3 次,结果里加一句提示,让模型停下来告诉用户哪里失败了;连续失败 6 次,本轮不再操作这个 app。

结果

每轮的工具错误:基线两轮 37 和 40 个,其中 bash 绕路 10 和 9 个、没有对应 AX 窗口的窗口 10 和 5 个、AXRaise 失败 6 和 8 个;可靠性修复之后两轮 9 和 8 个;窗口边界验收两轮 14 和 13 个,其中 8 和 9 个是窗口边界按设计给出的拒绝。六轮的单步分别是 7/8、7/8、7/8、7/8、8/8、8/8,多步是 5/7、6/7、5/7、6/7、6/7、7/7

可靠性修复之后的两轮,工具错误降到 9 个和 8 个。bash 绕路、对不上 AX 窗口、AXRaise 失败,三类都是 0;每项任务的工具调用中位数从 9 次降到 7 次和 6 次。剩下的错误全是参数小错:键名写成 esc、backspace,list_apps 带了 query,scroll 缺了 target。

成功率却一点没变,还是单步 7/8,多步 5/7 和 6/7。没过的任务换了一批原因:S3 四轮全挂,是模型用了我自己的 Finder 窗口;M3 有一轮,模型中途要求改用 Safari,被拒;M5 有一轮,另一个 app 的窗口盖住了系统设置,遮挡检查正确地拒绝了点击,模型随后要求去操作那个 app,也被拒。

这个子项目的 spec 里,验收标准是写代码之前定好的:工具错误不超过 15 个、AXRaise 错误不超过 2 个、bash 绕路不超过 5 次、多步至少 6/7。没达到的是两条:第 1 轮的多步只有 5/7,M5 没能两轮都过。原因一个是桌面上的遮挡,一个是模型越过了 app 边界,都不是这个子项目改的代码,我没有接着修,验收报告里照实写了这两条没达标。

剩下的失败几乎都出在边界上,所以下一个子项目做窗口边界。那次的第三次验收,单步两轮都是 8/8,多步 6/7 和 7/7。工具错误回到了 14 个和 13 个,多出来的是窗口边界按设计给出的拒绝,其余的只有 6 个和 4 个。

还没做的

计划里还剩两个子项目:速度(计算器这种场景鼓励一次 type 而不是逐个点键,动作之后自动附带精简的观察,少一来一回)和界面(叙述、截图缩略图、屏幕上的指示)。M3 那一轮失败暴露的 Finder 改名,也留给了速度和可靠性这一边。

每次改动之后,我还是会跑两轮这 15 项任务。

Keep Reading

相关文章

评论