我们如何为浏览器使用构建可扩展的长时程强化学习环境
浏览器智能体基准测试正在趋于饱和。这就是我们如何利用真实用户流量针对真实网络构建强化学习环境。
浏览器智能体基准测试正在趋于饱和。一年前还能区分模型优劣的任务集,如今通过率已超过90%。一个好的强化学习环境与一个好的基准测试任务所需条件相同,而两者都不易构建。
任务必须是真实的。合成网站克隆易于复现和验证成本低,但它们剥离了使真实网络难以应对的特性。两者也都需要一个公平且稳定的奖励机制:一个能分辨好坏工作的评判者。
本文介绍我们如何基于真实用户流量针对真实网络构建强化学习环境。我们持续生成这些环境,开源的200个只是其中的样本。源数据源自我们生产环境中浏览器智能体任务语料库的匿名版本,因此每个任务都是某人真正想要完成的事情,而非作者想象中人们可能想要的。
问题更难的部分是奖励机制。下文我们将描述如何从针对每个任务的全部尝试中构建评分标准、针对真实网络进行验证,然后通过重新评分冻结的轨迹来衡量其稳定性。
1. 筛选任务
源语料库是生产环境的浏览器智能体流量,在收集期间包含数亿次任务提交。其中大部分是重复的,因此我们将相似任务合并至约一千万个不同的任务。我们剔除任何第三方无法运行或不应看到的任务:涉及本地网络地址或本地文件的任务、无法确认为英语的任务、长度不在25到20,000字符之间的任务,以及与已知公开基准测试内容匹配的任务——后者会污染我们报告的任何结果。
每个任务都来自我们拥有使用和销售内容权利的来源,受限制数据使用协议约束下的流量根本不会进入语料库。
2. 适用性
大多数真实用户任务无法构成可用的环境,原因仅从文本中即可看出。有些太简单,搜索引擎或模型自身知识即可回答,根本不需要浏览器。有些包含个人信息。有些在真实网站上执行破坏性或不可逆的操作,例如提交表单或进行购买,这在每次评估运行中都无法重复。有些按字面描述无法完成,有些则过于模糊,任何评分者都无法判定。在投入任何执行成本之前,我们需要一个廉价的过滤器,能够在语料库规模上复现专家对适用性的判断。
2.1 人工标注
我们首先在十二小时的冲刺中人工标注了900个任务,利用我们在基准测试方面的经验挑选出既适用又困难的任务。每个任务都获得了“适用”、“不适用”或“不确定”的标记,并附有标记的书面理由。这些理由是本节其余部分构建的参考依据。
2.2 对齐标注智能体
我们通过任务文本的哈希值进行了一次确定性划分:80%用于开发,10%留出用于验证,10%封存用于最终测试。该划分已冻结,从未重新计算。
我们还自动化了提示词的编写。一个基于Claude Fable 5构建的自动研究智能体获得了我们书面的理由和开发集划分,它只有一项任务:为Gemini 3 Flash生成一个单次调用的提示词,以复现我们的标注。它提出了变体、对它们进行评分并保留有效的版本,共迭代了21个提示词版本。
在固定提示词下的模型对比确认了选择小模型的决定。Gemini 3 Flash 达到了最高的一致率,成本约为较大候选模型的五分之一,而这些较大模型系统性地过于保守:它们丢弃了我们已经接受的合适任务。
部署的提示词在 77% 的条目上与我们的标签一致,在它从未见过的密封测试集上一致率为 81%,每发现一千个合适任务的成本约为 $20。在整个候选样本上运行时,它标记了约 13% 的任务为合适。
3. 个人数据替换
真实用户任务包含真实的个人数据,而这些数据都不能出现在我们发布的任何内容中。天真的做法是检测并丢弃,但这种做法在实质上是错误的,且在产出上代价高昂。在很大一部分真实任务中,个人数据与工作本身无关。丢弃这样的任务,是为了移除一个它并不依赖的细节而将其整个丢弃。
因此我们使用不同的标准。如果一个任务可以在将每一段个人数据替换为我们自己的标准虚拟人物后运行并成功,那么它就是合适的。这个问题有一个可判定的答案,它将个人数据问题从一个过滤问题变成了一个重写问题。
我们只在重写无法保留工作内容时,或当特定个人事实的组合能够识别出某个人时才丢弃任务,因为字符串替换无法中和这种情况。
替换必须保持对真实站点的可用性。当任务不是基于美国的,我们会将虚拟人物调整为任务所在国家。每次替换都是在代码中进行的逐字字符串替换,且在我们验证目标字符串确实存在之后进行,因此模型永远不会重写周围的文本,也永远不会改变任务的含义。
4. 可行性与难度
通过前两个过滤器的任务是格式良好的。我们仍然不知道它是否可以运行,或者它是否困难。
一个任务现在可能因为与智能体能力无关的原因而变得不可能。它可能依赖于上一阶段移除的账户或个人物品。它可能已经过时,这是曾经可能而现在不可能的任务的最大单一来源。它可能从来就不可能。而与所有这些无关的是,它可能只是太简单了,在这种情况下,它是格式良好的、可能的,但对于区分模型毫无用处。
这些都没有出现在任务文本中,这就是它们通过第 2 节的原因。所有这些都会在少量真实尝试中显现,因此筛选必须运行该任务。我们使用部署在 Fireworks 上的 MiniMax M3 来运行它。参考模型不需要强大。它需要一致、足够便宜以运行多次,并且足够好,使其失败能告诉我们一些信息,而不是看起来都一样。在到达此筛选的格式良好的任务中,略超过 40% 通过了它,既可能又足够困难以保留。
5. 判断力的问题
通过执行进行筛选需要一个评分器,而这个要求看起来不可能。当今的前沿模型完成这些任务的完美率不到 10%。那么,一个运行同样前沿模型的评分器如何决定完美的完成是什么样子的?这就是大多数 LLM 评分器陷入的陷阱:评判者并不比智能体更聪明。
可以,因为评分和解题是不同的问题。评分者不需要更聪明,它需要看到更多。人类评分者本来就是这样工作的。负责一道考题的评分者会阅读该题的每一次作答,在看过足够多的作答之后,就知道了正确答案、常见的错误思路,以及那些看起来正确但实际错误的答案。这些都不需要成为房间里最出色的数学家。这来自于看过针对同一道题的全部作答分布,而这是任何单个学生都做不到的。
语言模型在两次调用之间不保留任何东西,所以我们必须手动积累这种接触。模型在推理时能获得的最佳学习材料就是它自己的上下文,因此我们为每个任务提供一个文件,评分者从中写入和读取。该文件保存了我们针对那一个任务所确立的内容:正确答案是什么,哪些路径能到达它,哪些失败会反复出现以及它们在轨迹中是什么样子,以及智能体提出了哪些不真实的主张。该文件只提供给评分者,绝不提供给智能体。
我们把这个文件称为评分标准(rubric),以模仿它所效仿的人类产物。本报告的其余部分主要讨论如何构建一个正确且稳定的评分标准,因为一个既不正确也不稳定的评分标准比没有评分标准还要糟糕:它会产生自信、可复现的错误分数。
6. 难度估计
在确定任务难度时存在一个先有鸡还是先有蛋的问题。对运行进行评分需要完成的评分标准,而创建评分标准又需要已评分的运行。等到评分标准成熟后再进行筛选,就意味着要为每个候选任务支付完整的运行成本,包括那些极其简单或极其损坏的任务。
因此,我们必须接受在仍在收集轨迹时做出的难度估计。每次判断之后,评分者会将其学到的内容写入该任务的评分标准文件,而对该任务的下一次判断会读取它。评分标准始终是迄今为止的运行所能支撑的对该任务的最佳描述。早期的判断是在几乎空白的评分标准上进行的,其可靠性无法匹配。后期的判断则是在已经收集了真实失败模式的评分标准上进行的。这对于筛选决策来说已经足够了,筛选只需要区分“所有人都能完成这个”和“没人能开始这个”,而且运行成本足够低,可以应用于每个候选任务。
筛选本身是一个带有提前停止的序贯检验,因为大多数候选任务可以在少于最大运行次数的情况下做出判定。
通过率为零的任务会被升级给更强的模型 Claude Opus 4.8,以区分“困难”和“不可能”。在这样一轮中,更强的模型完成了大约三分之一的升级任务,这些任务随后作为困难但可完成的任务进入任务池。大约一半显示出实质性的部分进展,其余的要么被确认为不可能,要么被搁置。
7. 评分标准构建
我们在筛选期间迭代开发的评分标准并不是我们最终发布的评分标准。本节解释了原因,以及发布的评分标准是如何构建的。我们用个人请求的语言重写用户任务,在保留所有任务指令的同时,对格式细节进行标准化和匿名化处理。
7.1 为什么迭代式评分标准不会收敛
人们自然会期望第 6 节讨论的迭代完善评分标准的循环,在经过足够多的循环后收敛到一个完美的评分标准。每次判断都会增加信息,因此评分标准应该接近对任务的正确描述,然后停止变化。实际上它并没有,原因是结构性的。
该循环中的每个评审者只看到一条轨迹。它无法将一个智能体的主张与另一个智能体的主张进行比较,也没有办法对照实际网站来核查主张。当某个智能体自信但错误地声称某页面有七条列表时,评审者没有理由怀疑它,而这个数字可能被写入评分标准,成为既定事实。之后的每一次评判都会将其当作既定真相。如果它是错的,循环不会纠正它,会一直惩罚所有后续正确的答案,直到评分标准被改回来。
我们用数据观察到了这一点。在我们关心的任务上,编辑率并没有趋于平缓:在困难任务上,到第九轮运行时编辑率仍为 59%。评分标准在不同的解释之间来回摆动,无休止地自我纠正。
7.2 我们改用的并行评分标准
在估计出难度并选出有挑战性的任务后,我们需要大量多样的尝试来探索每个任务的解空间。我们运行了 9 个模型的集群,每个运行两次:Claude Opus 5、GPT-5.6 Sol、GPT-5.6 Luna、GPT-5.5、Gemini 3.1 Pro、Gemini 3.7 Flash、Gemini 3 Flash、Grok 4.5 和 MiniMax M3。
随后,一个基于 Claude Fable 5 构建的智能体撰写每一份评分标准。众多轨迹作为文件与迭代评审者的发现一同保存。该智能体可以在轨迹中进行选择性搜索,检索相关上下文,对照真实网络进行验证,并确定既定真相和有效路径。
筛选评判是入口。作为评分标准它们并不稳定,但它们是轨迹间疑似问题的丰富历史。智能体取一个声称的缺陷,打开产生它的轨迹,并判断它是否真实。这些评判中的任何内容都不会被信任地沿用,其中的任何分数或裁决也不会被复用。
经由轨迹存活下来的线索随后会与现实世界进行核对。智能体打开一个实时浏览器,对照实际网站、在今天验证它打算依赖的事实。它记录的每一条事实都带有被核查的日期。形如“该值在网站上任何地方都不出现”的事实会被单独标记,因为全称否定只能被证伪而永远无法被证明。
7.3 优秀评分标准的特性
我们如何定义一个好的评分标准?以下是我们得出的结论。
每一条主张都必须易于验证,并且主张按提出者进行划分。评分标准对任务和网站做出主张。这些是关于世界的主张,它们已在记录的日期对照实际网站进行过核查,任何人都可以打开网站进行验证。评分者陈述发现,即关于智能体轨迹的主张,每一条都必须引用证据出现的步骤。人类应该能够看到评审者的主张,并直接在智能体的轨迹中验证它们是否属实。
评分标准和评分者都不输出分数。分数由代码根据发现计算得出。这就是使该产物能够端到端审计的原因:流水线中语言模型的每一个输出都是一个具体的、有定位的主张,人类可以确认或反驳,其中没有一个是必须被信任地接受的主观判断。
条目是原子的。每个条目只在一个范围内检查一件事,因此任何单一缺陷都不会被重复扣分。权重总和为100,得分等于已满足条目权重之和,条目之间没有最差者胜出规则,也没有负分,因此部分得分来自条目的粒度,而绝不会来自单个条目内部的算术运算。
正是这种排序使得奖励难以被钻空子。捏造的工作得不到任何分数,因为每个条目都要求在轨迹中有佐证证据,而诚实但不完整的工作则获得其应得的部分。除了条目之外,评分器还会报告是否发生了奖励作弊、说谎或捏造。条目得分首先按正常方式计算,如果出现正面标记,则将其归零,因此不诚实永远不会被定价为损失一个加权条目。
7.4 稳定性作为模糊性的度量
对于基准测试而言,对于奖励来说更是如此,同一条轨迹每次评分都必须获得相同的分数。语言模型不是确定性的,因此我们预期会有一些变化。有用的观察是,这种变化并非均匀分布。大多数条目在冻结轨迹的重新评分中完全稳定,而不稳定性集中在少数条目上。
当我们阅读不一致的配对时,通常会发现同一评分器的两次运行对条目措辞的理解不同,并在不同位置划定了边界。因此,我们将不稳定性视为评分标准中模糊性的信号,而不是模型的噪声,而发生翻转的条目则告诉我们需要查看哪句话。
这是一种可衡量的方法,用于识别任务和评分标准中哪些部分存在歧义。条目按其在相同输入下在“满足”和“违反”之间翻转的频率进行排序。对于每个超过阈值的条目,我们回到原始的评分标准编写代理(它仍然保留着轨迹和实时网络访问权限),向其并排展示不一致的发现配对,并要求它将该条目重写为一个足够清晰的决策规则,使得两个独立的评分器得出相同的状态。该循环最多运行三次。
7.5 筛选
并非每个任务都能保留下来。我们按顺序移除了三类缺陷。
未能解决的评分标准模糊性。我们删除了任何在三轮修订后条目仍在翻转的任务。如果三轮完全访问轨迹和实时验证都无法使标准变得可判定,那么问题在于任务本身,而非措辞,该任务将永远无法产生可用的奖励。
任务解释的分叉。不同的代理阅读相同的任务文本,却追求截然不同的目标。并非所有分叉都是缺陷。两个代理可能采取不同的路径得到相同的答案。但当两个代理对所要求的内容存在分歧时,没有任何评分标准能同时对两者正确,此时任务文本就是缺陷。唯一的补救措施是澄清任务,这会使现有运行失效,意味着需要重新收集。澄清只能说明什么算完成,绝不能说明如何完成,因此不会泄露解决方案。处理得当,这可以挽救许多具有挑战性和价值的任务,否则它们将被丢弃。
时间衰减。我们移除了那些正确答案取决于尚未发生的事件、或取决于比发布周期更迭更快的数据的任务。一个固定在未来日期的任务日后注定会出错,而这种失败比现在就出错更缓慢、也更具破坏性。我们保留了实时市场类任务,但降低了其优先级,因为它们的波动性是需要用带日期的事实来管理的成本,而非缺陷。
由此得到的任务集中,每个任务都附带一份原子化、加权、有据可依的评分标准,其事实均标注日期并已针对实时网站进行核验,且在对冻结轨迹的重复评分中,其条目已被驱动至低于百分之一的判定翻转率。
8. 数据可用性
其中200个任务及其评分标准的样本已开源,地址为 github.com/browser-use/benchmark。