这四个里有两个根本不拥有自己的校验器——而这正是让它们的分数不可比的那个事实,也是没有任何一篇对比提到的事实。WindowsAgentArena 把 OSWorld 的指标库整套搬了过来;BrowserGym 是一个 harness,导入的是被包装基准各自写的那一套。所以决定一个数字能不能迁移到你产品上的那条轴,不是操作系统、也不是任务数量——而是那个检查读的是什么。请挑那个「校验器所读的东西与你对完成的定义所读的东西相同」的基准,对比的其余部分可以不看。
一览
四个都被称作「GUI 智能体基准」的项目,按「谁写了那个检查」来读。
| 项目 | 许可 | 默认题集 | 谁拥有校验器 |
|---|---|---|---|
| OSWorld(xlang-ai) | Apache-2.0 | 368 道题,10 个领域 | 它自己——225 个指标函数 |
| WindowsAgentArena(微软) | MIT | 154 道题,12 个领域 | OSWorld——那个库是搬过来的 |
| AndroidWorld(google-research) | Apache-2.0 | 116 道手写题,20 个应用 | 它自己——每题一个成功函数 |
| BrowserGym(ServiceNow) | Apache-2.0 | 8 个基准,含 WebArena 的 812 道 | 没有谁——它导入各自的那一套 |
最后一列请读两遍。它就是整个对比。这里面三个是环境、一个是 harness;而那三个环境里只有两个写了自己的评分器——因为第二个抄了第一个。
把它们分开的那个问题
对任何一个智能体基准都该问一句:运行结束时,评分器看的是什么?其余一切都由此而来。这里的四个答案是真正不同类的东西——一个文件的字节、一台设备的状态、一个网页加一个输入的答案,以及其中一例里一袋经过规范化、按部分得分来评的词元——而再多的共享词汇(「成功率」)也不能让它们可通约。
这不是在抱怨基准的设计。每一个选择对它的作者所要测的东西来说都是对的。问题在下游:一个标题写着「成功率」的排行榜列,邀请你把一个的 38% 与另一个的 41% 读成一次对比,而它不是——就像单元测试通过率与客户满意度分数都是百分数一样。
真正决定该用哪个的那个测试:用一句话写下你的产品是怎么知道一个任务成功了的。如果答案是「数据库里有一行变了」,你要的是一个读状态的校验器。如果是「用户拿到了正确答案」,你要的是一个评答案的。然后挑那个已经这么做的基准,并把另外三个当作关于另一个问题的证据。
OSWorld——校验器是一个库,而它会动手
机制
一道题是一个 JSON 文件,有三部分:一段 config 用来把机器布置好、一条自然语言的 instruction,以及一个 evaluator——点名一个函数,加上它的期望输入与实际输入。desktop_env/evaluators/metrics/ 里有跨十五个模块的 225 个函数——libreoffice.py、chrome.py、pdf.py、vlc.py、vscode.py 等等。在那些任务文件里,用得最多的校验器是 compare_table(56 道题),其后是 infeasible(26)、compare_pptx_files(23)与 check_include_exclude(15)。
团队会漏掉的那一部分
这个 evaluator 不是一次读取。它有一段 postconfig,会先去操作那个桌面。下面是一个真实的例子,来自一道要求智能体加一列到期日的 LibreOffice Calc 题:
activate_window window_name: "MaturityDate.xlsx - LibreOffice Calc", strict: true
sleep 0.5
execute python -c 'import pyautogui; pyautogui.hotkey("ctrl","s")'
sleep 0.5
func compare_table
expected cloud_file # fetched from a HuggingFace dataset repo
result vm_file /home/user/MaturityDate.xlsx
在智能体的成果被看上一眼之前,有四件事必须顺利:窗口标题必须精确匹配、不能有保存对话框截走那次击键、半秒必须够那次写入落盘,以及那份标准文件必须下载成功。以上任何一条不成立,一个正确的智能体就在这道题上失败了。在整个题集里,评分路径对着 368 道题发出了 358 次 execute、307 次 sleep、293 次 download 与 200 次 activate_window——这给这个基准自身的可靠度设了一条下限,而没有任何公开分数会报出它。这个问题的一般版本在当检查本身必须动手里。
诚实的那些地方
test_infeasible.json 里有 25 道「正确答案是拒绝」的题,这是一个确实不错的设计决定,而多数题集跳过了它。另外,2025 年 7 月宣布的 OSWorld-Verified 修掉了社区报告的若干问题、加上了 AWS 并行化,并重跑了模型结果——项目还明确告诉你去和新数字比、而不是和旧的比。请把任何不带版本的 OSWorld 数字当作「无从识别」。
WindowsAgentArena——同一个评分器,另一台机器
机制
微软这个项目是 OSWorld 移植到 Windows 11,而它并不隐瞒这件事。src/win-arena-container/client/desktop_env/evaluators/metrics/ 就是 OSWorld 的模块清单,只是在 chrome.py 的位置加了一个 edge.py。任务文件的词汇也一样:在它的例子里,这些 func 是 exact_match(92)、compare_table(48)、infeasible(26)、check_json_settings(20)。test_all.json 里有跨 12 个领域的 154 道题。
团队会漏掉的那一部分
任务文件有两套而不是一套:examples/ 与 examples_noctxt/,154 道题对应 308 个文件。那就是那个在 2024 年 11 月加上的难度开关——把 diff_lvl="hard" 打开,智能体就必须自己去找到并打开对的程序,而不是由任务配置替它把场面布好。这是在报一个 WindowsAgentArena 数字时最该一并说明的那一件事,而它是一个 start_client.sh 里的变量、不是一个题集名字,所以它传播得很差。
成本的形状
重置的单位是一个 30 GB 的 Windows 11 标准镜像,由你自己从一份评估版 ISO 构建出来,里面托着一个接收智能体命令的 Python 服务器。好处是 Azure ML 的并行化把几百道题从几天变成几分钟。坏处是你的结果是「你构建的那个镜像」的一条性质,而两支团队的镜像并不是同一个产物。
AndroidWorld——唯一一个没有两次运行共享同一道题的
机制
一道题是一个类,带一个 template 字符串、一份用于参数的 JSON schema、一个 generate_random_params() 类方法,以及 is_successful(env) -> float。目标字符串是用参数格式化出来的模板,于是跨 20 个应用的 116 道手写题实例化出项目所称的数百万种独特变体。成功是在运行之后从设备状态里按程序读出来的——跨 96 个 task-eval 模块的 57 个 is_successful 实现。MiniWoB++ 搭在同一个 harness 里一起跑。
团队会漏掉的那一部分
随机实例化是这一组里最强的抗记忆性质、也是最弱的可复现性质——而它们是同一个设计选择。一个分数是在「别人没抽到过的那些实例」上的平均值,于是两篇论文的 AndroidWorld 数字是同一分布里的样本、而不是同一张卷子上的成绩;而这意味着的那份方差通常不会被报出来。这在成为一个能力问题之前,先是一个统计功效问题。
那个安静的参数
步数预算在 2024 年 11 月被重新校准为「每道题约人类平均完成时间的两倍」。这是一个站得住脚、也记录清楚的选择,而它同时是一个旋钮:一个本来会在 2.5 倍人类时间内做完的智能体会得零分,而一个按别的倍数调出来的题集会把系统排出不同的次序。那个预算该放在分数旁边——就像在预算对齐评估里那样。
BrowserGym——一个 harness,却被当作基准来卖、来读
机制
每道题都实现 AbstractBrowserTask:setup(page)、validate(page, chat_messages) -> (reward, done, message, info)、一个可选的 cheat(),以及 teardown()。那个接口背后坐着八个基准——MiniWoB(105 个任务类)、WebArena(812)、WebArena-Verified(812)、WebArena-Lite(165)、VisualWebArena(910)、WorkArena、AssistantBench 与 WebLINX——每个都作为自己的包安装。
团队会漏掉的那一部分
BrowserGym 不评分。它的 WebArena 任务从上游包里导入 webarena.evaluation_harness.evaluators.evaluator_router 并调用它;那个包还会在 import 时去拉 NLTK 的 punkt_tab 分词器,因为 WebArena 自己的评分做的是文本匹配。所以一个「BrowserGym 结果」继承了底下那个基准的每一条性质,包括它评分器的那些怪癖;而统一的 reward: float 把这些差别藏了起来:
# same interface, incompatible semantics
WebArena task -> reward from the upstream evaluator_router
(page state + answer matching, essentially pass/fail)
AssistantBench -> reward from a token-bag F1 over normalised spans
(articles stripped, punctuation stripped, numbers
normalised, then per-span F1 aligned greedily)
-> 0.63 is a real value here, and meaningless above
于是跨 BrowserGym 的各个基准做平均,就是把一个通过率与一个部分得分拿去平均。对一个 harness 来说,允许这件事是合理的;而把它放进标题里是不合理的。
它真正擅长什么
一份智能体实现对上八个基准,而观察空间(截图、无障碍树、set-of-marks)在同一个地方配置。如果你在做一个 Web 智能体,那份可移植性比任何单个题集都更值钱,而它是对的默认选项。只是请报逐基准的数字,永远不要报一个 BrowserGym 平均值。
任务数量,以及为什么最长的那根条信息量最小
看这样一张图的诱惑是把任务数量读成覆盖面。它更接近一份重置成本预算。一个 910 道题的 Web 题集跑在重新置备出来的 Web 应用上;一个 154 道题的 Windows 题集跑在一个 30 GB 镜像上;一个 116 道题的 Android 题集跑在一个模拟器上、每次还抽一组新参数。那是每道题相差若干个数量级的基础设施,而这正是为什么大题集都是 Web 题集、而且会一直如此。
更值得追问的那个数字是「有多少个不同的校验器产出了这个分数」,因为那才是「单个评分器的一个 bug 最多能挪动多少」的上界。OSWorld 的 368 道题归结到几十个函数,而仅 compare_table 一个就覆盖其中 56 道——于是一个表格比较器里的回归就能挪动这个题集的 15%。
什么时候选哪个
| 如果你的产品…… | 选 | 因为 |
|---|---|---|
| 产出文档与文件 | OSWorld(Verified) | 它的校验器比对的是产物,而那就是你对完成的定义。 |
| 自动化 Windows 业务线应用 | WindowsAgentArena,hard | 唯一跑在真实 Windows 上的题集;hard 模式撤掉了任务配置那层脚手架。 |
| 驱动移动应用,或需要抗记忆 | AndroidWorld | 随机实例,加上能在 UI 改动后仍然成立的读状态校验器。 |
| 是一个 Web 智能体 | BrowserGym | 一份智能体、八个基准、一处观察空间配置——请逐基准汇报。 |
| 需要一个放进幻灯片的数字 | 一个都别用 | 这里面没有两个在测同一件事;请在你自己的任务上建一个题集。 |
而无论你选哪个,都请加上这些题集都没有附带的那个标准态自检:手工构造出每道题的正确终态、在没有智能体参与的情况下拿校验器去跑它,并把任何在那里就失败的题丢掉。每一个在手工造出的成功上失败的校验器,都代表一道你一直当成模型缺陷在打分的题。
常见问题
我能把一个 OSWorld 分数与一个 WindowsAgentArena 分数作比较吗?
比拿它们中任一个去和另外两个比要靠得住些,因为这两者共享一个校验器库和一种任务文件格式。但不能直接比:题集不同(368 对 154)、应用不同,而 WindowsAgentArena 还有一个难度开关,决定智能体是否必须自己把任务布置好。请把它们当作同一台测量仪器用在了两张不同的卷子上。
BrowserGym 是一个基准吗?
不是。它是一个在八个基准之上提供统一任务接口的 harness,而它不拥有任何校验器——它的 WebArena 任务导入的是上游 WebArena 的 evaluator。一个结果永远是在其中某一个被包装基准上的结果,而跨它们做平均会把通过率与部分得分混在一起。
这里面哪一个的评分最可靠?
AndroidWorld 的校验器最被动——它们读的是设备状态,而不是去操作设备以便让状态可读——所以在「智能体成功了的机器上」它们失败的途径最少。这与「最可复现」是两个不同的主张,而在后者上它的随机实例化是扣分项。
AndroidWorld 的「数百万种变体」是不是意味着它不能被钻空子?
它提高了记住具体实例的成本,这是真的。它并不妨碍去拟合那 116 个任务族、那 20 个应用,或那些模板句式;而步数预算仍然是一个可以针对去优化的固定目标。抗记忆是实例的一条性质,不是任务分布的。
OSWorld 为什么要在一道题运行期间从网络下载文件?
因为初始状态总得从什么地方来,而把那些素材塞进虚拟机镜像里会让镜像变得巨大且无从版本化。这是一个站得住脚的取舍。它同时也意味着有 293 次下载步骤坐在一次被打分运行的关键路径上,而一次 CDN 故障——除非你去查——会被报成一次智能体失败。
延伸阅读
本站:
- 当检查本身必须动手——为什么一个主动校验器的失败会落在你智能体那一栏,以及那个标准态自检。
- 基准全景——这些东西在被测量的一切之中位于何处。
- 读懂智能体基准——对待并非由你产出的分数的一般纪律。
- 计算机使用与 GUI 智能体——去造这些题集所测量的那个东西。
- 浏览器智能体的失败模式——具体在 Web 这条泳道里会出什么岔子。
项目来源:
- xlang-ai/OSWorld——Apache-2.0。
- microsoft/WindowsAgentArena——MIT。
- google-research/android_world——Apache-2.0。
- ServiceNow/BrowserGym——Apache-2.0。