验证地平线:编码 Agent 奖励没有银弹¶
暂无精读笔记。以下展示中文译文(点「译文」进入独立译文页)。
验证地平线:编码 Agent 奖励没有银弹¶
作者: Qwen Team。
核心贡献者: Binghai Wang, Chenlong Zhang, Dayiheng Liu, Jiajun Zhang, Jiawei Chen, Mingze Li, Mouxiang Chen, Rongyao Fang, Siyuan Zhang, Xuwu Wang, Yuheng Jing, Zeyao Ma, Zeyu Cui。
版本: arXiv:2606.26300v2,2026-06-29。
来源: 基于 arXiv LaTeX source source/colm2024_conference.tex 翻译。
“没有银弹。”
Frederick P. Brooks, Jr., No Silver Bullet---Essence and Accident in Software Engineering (1986)
译注:本文保留原文引用键、公式、图片链接和 JSON schema,以便追溯到源论文;表格已改写为普通 Markdown 表格,便于 VS Code 预览。正文、章节标题、图注和表格说明已翻译为中文。
摘要¶
一个经典直觉认为,验证一个解比生成一个解更容易。对今天的编码 Agent 来说,这一直觉正在被颠倒:随着基础模型具备更强的推理能力、工程 harness 变得更成熟,生成复杂候选解已经不再困难,可靠地验证它们反而成了更难的问题。我们能构建的任何 verifier 都只是人类意图的代理,而不是意图本身。这使验证面临双重困难:第一,意图天然是不充分规定的,因此忠实检查它是否被满足本来就很难;第二,在模型训练中,优化会扩大代理目标与真实意图之间的差距,表现为 reward hacking 或信号饱和。为此,我们从三个维度刻画验证信号的质量:可扩展性、忠实性和鲁棒性,并指出同时实现三者是核心挑战。我们进一步研究四类奖励构造:面向通用编码任务的测试 verifier、面向前端任务的 rubric verifier、面向真实世界 Agent 任务的用户 verifier,以及面向长程任务的自动化 Agent verifier。针对不同任务类型和策略能力水平,我们深入分析奖励设计的核心挑战,以及如何更有效地利用奖励信号。实验表明,有针对性的验证设计可以有效抑制 reward hacking、提升任务完成质量,并在多个内部和公开 benchmark 上取得显著收益。这些经验共同指向一个核心观察:随着策略能力持续增长,没有任何固定奖励函数能一直有效;验证必须与生成器共同演化。
引言¶
计算领域有一个经典直觉:验证一个解比找到一个解更容易。对今天的编码 Agent [cursor2026,anthropicClaudeCode2026,openaiCodex2026,openclawGithub2026] 来说,这种不对称正在反转。随着基础模型发展出更强的推理能力 [openaiO1SystemCard2024,deepseekR1],以及 harness 工程变得更加成熟 [yao2023react,anthropicMCP2024,opencode2026],生成足够复杂的候选解变得更容易。相比之下,可靠地验证该解变成了更难的问题。这一困难呼应了 Brooks 在软件工程中的经典教训:没有银弹 [brooks1987]。对编码 Agent 而言,验证不是任何单一机制能够一劳永逸解决的问题。
验证的核心功能是检查 Agent 是否满足了人类意图,但意图不能被直接测量。可执行测试、rubric、奖励模型,这些 verifier 只能把意图操作化为可计算的近似;它们是意图的代理,而非意图本身。
这使验证面临双重挑战。第一,忠实验证意图是否被满足本身就很难:意图天然是不充分规定的,持有意图的人往往也无法完整表达所有期望,直到某个反例暴露遗漏为止,而这些反例很难预先预测或枚举。更糟的是,在模型训练语境中,代理目标与真实意图的差距不会缩小,反而会扩大。一旦某个度量承受优化压力,它就不再是好的度量 [manheim2018categorizing]:当代理目标作为奖励信号时,生成器(即基础模型)不仅会学习满足代理目标,也会学习利用代理目标与真实意图之间的差异。因此,reward hacking 不是一个可以通过补丁修好的 bug,而是持续优化不完美目标的必然后果 [skalse2025definingcharacterizingrewardhacking]。
因此,验证无法无限期可靠地指导生成器。完美 verifier 不是现实目标。剩下的是把验证视为一种持续演进的近似:随着被评估的生成器变强,验证地平线也不断后退。根据 Rice 定理 [rice1953],程序的任何非平凡语义性质都是不可判定的;这也从可计算性理论角度独立支持了这一主张。
这重新定义了问题本身,并引出本文的中心论点:
我们必须持续构建一个与 AI Agent 共同演化的验证系统。
近期前沿实验室报告和工程分析也呼应了这一观点,越来越多地把 Agent 评测视为系统级问题,涉及 grader、trace、监控和失败模式分析 [openaiAgentKit2025,openaiCodingAgentMonitor2026,anthropicRewardTampering2024,anthropicRewardHacking2025,anthropicAgentEvals2026]。
我们进一步从三个维度刻画验证信号质量。可扩展性是前提:该信号是否能以训练所需规模低成本产生?忠实性是核心质量:该信号反映了多少真实用户意图,而不是某个狭窄替代目标?鲁棒性是忠实性的可靠程度:verifier 的判断能否跨多样化和对抗性输入保持有效,并承受逐渐变强的生成器带来的优化压力?同时实现三者是验证的核心困难。现有方法大多只能满足其中两个:单元测试可扩展且相对鲁棒,但只覆盖意图的薄层;基于 LLM 的 judge 可扩展且较忠实,但容易被更强模型利用;人类专家审查忠实且鲁棒,但无法规模化。三者的交集,也就是既便宜、又深入、又抗博弈的 verifier,正是当前缺失的东西。

图 fig:policy-verifier-coevolution: 训练中策略模型与 verifier 的共同演化。 verifier 最初提供有用奖励信号来指导策略改进。当策略超过 verifier 时,可能出现 reward hacking。随后 verifier 的演化会恢复有效指导,但这种指导又会再次饱和,需要进一步改进 verifier 才能解锁下一阶段的策略演化。
基于当前 Qwen 基础模型,我们研究四类奖励构造:从基于可执行测试的可验证奖励,到评估视觉与功能意图维度的 rubric 和交互式 judge,再到从用户交互数据中学习真实且综合的用户意图,最后到完全开放的 agentic evaluation。每一步都更忠实于真实用户意图,但也更依赖开放式判断,并且更难用机械方式鲁棒验证。我们用同一视角考察每一类:什么任务特征让奖励设计变难、它们施加了什么验证约束、我们采用的具体奖励实现、经验观察以及实践启示。四个部分如下:
- 以单元测试为 verifier(SWE-like 任务,sec:unit_tests):我们用基于执行的测试套件作为验证信号 [pan2025trainingsoftwareengineeringagents,chen2026sweuniversescalerealworldverifiable,jimenez2024swebench]。它可靠且易于扩展,但更强策略仍会发现可利用弱点,例如检索解答 artifacts 或篡改测试。因此,我们引入质量 judge 和 trajectory-level 行为监控 [baker2025monitoringreasoningmodelsmisbehavior],持续约束这些行为。两者结合后,在三个 SWE-Bench 变体上,被 hack 的 resolved rate 从 28.57% 降到 0.56%,clean resolved rate 从 40.22% 升到 60.53%。
- 以交互式 Agent 为 verifier(前端任务,sec:frontend):当意图扩展到视觉外观和交互行为时,机械的 pass/fail 测试不再足够。我们设计 rubric-based judge,将评估拆解为功能正确性、视觉质量、布局和 UX 等结构化维度,并进一步扩展为 agentic interactive judge,在真实浏览器中通过模拟用户交互操作生成 artifact [rubrics,zhang2025artifactsbench]。由于奖励建立在观察到的运行时行为上,而不是源代码检查上,交互式 judge 可以抵抗 static judge 容易遭遇的长度利用式 hacking。
- 以用户反馈为 verifier(真实世界 Agent 任务,sec:human_feedback):用户是最忠实的 verifier。他们的反馈嵌入在自然语言反馈、行为信号和其他交互模式中,可以从中抽取丰富的可训练信号。这一信号不仅最忠实,因为它直接来自意图持有者,也相对鲁棒,因为用户判断基于实际效用 [ethayarajh2024kto]。我们系统分析用户交互反馈并将其用于模型优化,在五个内部编码 Agent benchmark 上取得显著改进,包括一个私有 benchmark 上 13.3 个百分点的提升。
- 以自动化 Agent 为 verifier(长程任务,sec:agent):对长程任务来说,意图最开放:规格说明几乎不约束所有实现细节 [ding2025nl2repo,zhang2026repozero,yang2026programbench],预定义测试套件无法覆盖它。在这种设置下,即使构造忠实 verifier 本身也是开放问题。我们的方法是部署一个自主 agentic evaluator,直接检查生成的代码库,并根据规格说明动态进行多轮评估,作为忠实、可扩展但近似的 verifier。在受控数据预算下,由该 evaluator 过滤的训练数据已经稳定优于随机采样。我们进一步认为,这个 evaluator 应当演化为与生成器共同演化的 verifier,这是验证地平线的具体实现。
这四类构造共同表明,没有任何单一奖励策略足以支撑编码 Agent 的持续进步。真正有效的是完整验证系统:它整合可执行测试、质量过滤、行为监控和 agentic evaluator 等机制,并且随着策略能力提升和任务版图演化而不断重建。在这一观点下,验证不是训练 pipeline 的附属组件,而是核心基础设施。verifier 与策略的主动共同演化 [goodfellow2020generative](如图 fig:policy-verifier-coevolution 所示)确保奖励指标上的收益能够转化为持久且可信的能力增长。
面向 SWE-like 任务的测试驱动奖励¶
我们从 SWE-like 任务开始。这类任务已经成为基础模型合成编码训练数据的重要来源 [kimi2025k2,glm2026glm5,cursor2026composer25,qwen2026codernext]。对此类任务,执行测试套件得到的 pass/fail 信号通常被视为最可靠的奖励。它的关键可行性优势是可扩展性:可执行测试可以通过自动 pipeline 构造并规模化评估。然而,它面临两个系统性挑战:忠实性和 reward hacking。如果不处理,二者都会直接污染训练质量。
预备知识¶
自动化数据 pipeline。 我们使用 SWE-Universe [chen2026sweuniversescalerealworldverifiable] pipeline,从真实 GitHub pull request 构造可执行 SWE-like 任务。给定一个与 issue 关联的 PR,pipeline 将合并变更拆分为 fix patch 和 test patch,把仓库恢复到修复前状态,并构造 Docker 化环境和统一 verifier evaluation.sh,其二值 pass/fail 结果作为测试驱动奖励。每个 verifier 都通过如下方式验证:在 buggy repository 上应用 test patch 后必须失败,在 resolved repository 上同时应用 test patch 和 fix patch 后必须通过;无效 verifier 由构建 Agent 迭代修复。这个过程保证了可执行性和基本区分度,但并不能保证任务指令与测试之间的语义忠实性。
奖励忠实性。 对测试驱动奖励而言,忠实性通常由是否不存在 false positive(错误解通过测试)和 false negative(正确解未通过测试)来刻画。在 RL 训练中,false positive 会高估奖励并强化错误行为;false negative 会惩罚正确行为。二者都会让模型从错误梯度信号中学习。
Reward hacking。 值得注意的是,reward hacking 可以被视为 false positive 的特殊情形:Agent 生成了一个通过测试套件但并未真正解决任务的输出。普通 false positive 被动来自测试设计缺陷(如覆盖不足),而 reward hacking 来自 Agent 主动利用信息泄漏,例如从互联网检索 ground-truth patch 来博弈评估。
下面两个小节分别处理这两个挑战。
提升奖励忠实性¶
动机。 为缓解 false positive 和 false negative,我们认为,只有当测试驱动奖励的二值 pass/fail 信号对应于真实任务意图上的成功,而不只是测试套件上的成功时,该奖励才是忠实的。
在从 GitHub pull request 派生的 SWE-like 任务中,这一条件并不平凡。真实任务意图可能依赖离线讨论、历史项目惯例或维护者期望,而抽取出的 instruction 只提供了有限且可能有损的意图描述。
因此,我们把语义奖励忠实性分解为两个维度:instruction clarity(记为 instruct_clear),询问指令是否充分表达了预期任务;以及 instruction--test alignment(记为 instruct_ut_align),询问测试是否忠实地操作化了指令。
Agentic Quality Judge。 为操作化这种忠实性分解,我们构建了一个 agentic quality judge,用于自动评估 SWE-like 任务质量。给定任务描述、Docker 化仓库环境、测试脚本,以及可选的 ground-truth patch,该 judge 使用 MiniSWEAgent [yang2024sweagent] 主动探索环境:它可以检查仓库文件、执行命令、读取测试,并分析:1)指令和环境是否足够自包含,使 Agent 能解决任务;2)verifier 是否匹配所述任务。最后,agentic judge 产出两个维度级判断:instruct_clear 和 instruct_ut_align。这些判断随后聚合为整体质量标签 overall_good,作为最终质量分数。
我们在人工标注的任务质量 benchmark 上评估该 judge,任务 prompt 和代表性样例见附录 appendix:judge-prompt 和 sec:case_study_of_agentic_judge。从样例可以看到,质量问题形式多样。指令可能只有几个词、没有可操作上下文,或引用无法访问的外部资源(如私有 Slack 讨论);测试可能验证了与描述任务完全正交的功能,或者把实现特定 artifact(例如拼写错误)硬编码为预期输出(代表性示例见附录 sec:case_study_of_agentic_judge 中图 fig:case_study_cate1 和 fig:case_study_cate2)。
为提升 agentic judge 的可靠性,我们研究三个设计选择:基础 judge 模型、多数投票的采样数量,以及是否使用 few-shot demonstrations 或 ground-truth patches。表 tab:agentic-judge-ablation 报告消融结果。总体而言,agentic judge 在两个指标上表现较强。但 instruct_ut_align 明显更难:judge 不仅需要从指令中理解预期任务语义,还需要基于源代码推断测试套件的实际行为覆盖范围,而二者之间的不匹配往往微妙且复杂。因此,我们发现为 judge 提供额外参考信息能显著改善它在该维度上的评估。Few-shot demonstrations 提升 instruct_ut_align 的 precision,而提供 ground-truth patch 提升 recall,并在该维度上取得最佳 F1。这些结果表明,judge 可以作为可扩展过滤器,用于识别测试驱动奖励不可靠的 SWE-like 任务。
表 tab:agentic-judge-ablation: agentic judge 在人工标注 benchmark 上的消融结果。每个 metric cell 报告 precision / recall / F1。\#Turns 列报告 mean / min / max。
| Strategy | #Turns | instruct_clear |
instruct_ut_align |
|---|---|---|---|
| 3-voting, Qwen-Plus | 37 / 17 / 92 | 97.26 / 92.21 / 94.67 | 74.00 / 78.72 / 76.29 |
| 5-voting, Qwen-Max | 24 / 14 / 40 | 97.18 / 89.61 / 93.24 | 72.73 / 85.11 / 78.43 |
| 3-voting, Qwen-Max | 24 / 15 / 45 | 95.50 / 92.21 / 93.83 | 73.47 / 76.60 / 75.00 |
| + Examples | 25 / 15 / 46 | 100.00 / 85.71 / 92.31 | 78.72 / 78.72 / 78.72 |
| + Examples + GT patch | 27 / 17 / 57 | 100.00 / 83.12 / 90.78 | 75.93 / 87.23 / 81.19 |

图 fig:quality-scale: 任务质量与数据集规模。 x 轴表示被质量标准标为 good 的任务比例,y 轴为 log scale 下的数据集规模。
数据统计。 我们将 agentic quality judge 作为语义过滤器应用到 SWE-Universe。如图 fig:quality-scale 所示,过滤在保留大规模可执行任务池的同时提高了 good-task ratio,从而得到更少受模糊指令或 instruction-test misalignment 影响的 pass/fail 奖励训练数据。我们进一步发现,低 solve rate 与任务质量部分混杂。如图 fig:solve-quality-correlation 所示,zero-solve 任务中低质量实例比例大得多,而 high-solve-rate bucket 主要由高质量任务构成。这说明,持续未解决的实例不应仅被解释为内在难度证据。这些低质量任务会消耗 rollout budget,却无法提供可信奖励。因此,质量过滤同时提升采样效率和奖励可靠性。
在 RL 中的应用。 我们把过滤后的高质量数据纳入一个内部 Qwen-Turbo checkpoint 的 RL 训练,并在更广泛的 SWE-style 评估上观察到一致收益。图 fig:rl-filtered-training 显示,quality-filtered RL 提升了 SWE-bench Multilingual [jimenez2024swebench] 和 SWE-bench Pro [deng2025swebenchproaiagents] 上的表现,同时在 SWE-bench Verified [openaiSWEVerified2024] 上保持相当。这说明,移除指令不清或 instruction-test 不匹配的任务,可以提升基于单元测试奖励的可靠性,而不损害标准 curated benchmark 上的表现。

图 fig:rl-filtered-training: 使用与不使用 agentic quality filter 的 RL 训练曲线。
缓解 Reward Hacking¶
动机。 SWE 任务中的测试驱动奖励通常只评估最终仓库状态:应用模型生成的 patch 并运行任务特定测试套件 [openaiSWEVerifiedRetired2026,zhao2026specbench]。因此,它能验证 patch 是否通过测试,却无法验证该 patch 是否通过合法的软件工程实践产生。
这会在行为层面产生 false positive:Agent 可能通过利用捷径信息通道获得正奖励,例如检索原始 pull request、访问泄漏的 commit 或 patch 元数据、修改测试或 verifier,或者过拟合可见测试。
不同于由测试不完整或不对齐造成的普通 false positive,这类 reward hacking 不仅源自 verifier 弱点,也源自获取 verifier success 的轨迹:最终 patch 通过了测试,但产生它的过程与合法 SWE-style debugging 不兼容 [baker2025monitoringreasoningmodelsmisbehavior,skalse2025definingcharacterizingrewardhacking]。
本节首先系统分析 SWE 任务中的 hacking-susceptible behaviors,随后基于该分析构建监控系统来缓解这些 hacking 行为。
易受 hacking 的行为分析。 我们对 SWE 任务中的 Agent 行为进行自动审查,识别 Agent 可能不遵循预期本地调试流程却获得 verifier success 的行为。每条 trajectory 记录最终 patch 产生过程中的命令序列、文件检查、测试执行、git 操作、网络访问和编辑。我们区分两类奖励污染来源:static-environment leakage 和 policy-dependent shortcut access(每类行为 taxonomy 详见 Appendix-:hacking_examples)。
Static-environment leakage:环境本身创造的捷径机会,例如未清理的 git history、可见测试或可修改 harness。在先前工作中,我们已经减少了此类环境中的若干静态信息泄漏来源 [chen2026sweuniversescalerealworldverifiable,qwen2026codernext]。特别地,我们清理仓库历史,移除目标 PR 时间之后的 commit,因为这些 commit 可能泄露未来修复;我们也对解法不需要外部连通性的任务禁用网络访问。这些干预在训练开始前减少了明显的环境级泄漏,但仅靠它们并不充分:随着策略变强,Agent 仍可能发现人工难以预料的捷径行为。
Policy-dependent shortcut access 指超出预期本地调试流程的主动信息搜寻行为,例如检索解答 artifact 或查找外部修复。不同于静态环境泄漏,这些行为依赖策略:它们来自 Agent 在解题过程中选择如何收集信息,因此无法仅通过加固初始任务环境完全消除。
表 tab:behavior_success_association 显示静态泄漏与主动捷径搜寻之间存在明显分裂。在加固环境下,环境级交互与 verifier success 没有正相关:repository-history mining、test-oracle tampering、evaluation-harness tampering、visible-test overfitting 和 evaluator-aware patching 的 resolved rate 都低于整体 resolved rate。这说明静态加固降低了若干已知泄漏通道的奖励优势,尽管这些行为仍表明 trajectory 在过程上无效。更难的是主动捷径搜寻:solution artifact retrieval 只出现在 4.32% 的 trajectories 中,但 resolved rate 达到 72.34%,比 baseline 高 12.35%;external fix lookup 也显示轻微正相关。因此,即使已减少已知静态泄漏,verifier success 仍可能与 shortcut-seeking behavior 耦合,这促使我们构建 trajectory-level monitor,在 RL 中审计信息访问并修正可疑捷径成功的奖励。
表 tab:behavior_success_association: 行为与成功之间的关联。Qwen-Turbo 在训练数据上的 trajectory resolved rate。Freq. (%) 是 rollout-level prevalence,phi corr. 是二值行为与成功的相关性。
| Baseline / Behavior | Freq. (%) | Resolved (%, \(\Delta_{\mathrm{base}}\)) | phi corr. |
|---|---|---|---|
| Qwen-Turbo | -- | 59.99 | -- |
| Static-environment leakage | |||
| Repository-history mining | 21.11 | 56.55 (-3.44) | -0.036 |
| Test-oracle tampering | 3.69 | 47.29 (-12.70) | -0.051 |
| Evaluation-harness tampering | 8.25 | 41.47 (-18.52) | -0.113 |
| Visible-test overfitting | 30.00 | 51.62 (-8.37) | -0.112 |
| Evaluator-aware patching | 8.78 | 56.39 (-3.60) | -0.023 |
| Policy-dependent shortcut access | |||
| Solution artifact retrieval | 4.32 | 72.34 (+12.35) | +0.054 |
| External fix lookup | 7.03 | 61.69 (+1.70) | +0.010 |
缓解方法:RL 中的行为监控。 为缓解 policy-dependent shortcut exploitation,我们在使用 Qwen-Turbo 进行 RL 时引入 trajectory-level behavior monitor。对每条 trajectory,我们记录命令历史、网络访问、git 操作、打开和编辑的文件以及最终 patch。monitor 会基于模式集合 \(P\) 审计完整 trajectory 中的高风险信息访问模式。
集合 \(P\) 中的每个模式指定三部分:可观察 trajectory 证据、相关泄漏风险和对应干预。这些模式覆盖搜索原始 PR、打开 upstream diffs、查询 commit hashes、访问会泄露 merged patches 的 GitHub 页面,或使用可能暴露 post-fix change 的仓库元数据等行为。当 rollout 匹配高风险模式时,我们施加 token-level penalty,以降低分配给 shortcut-dependent behavior 的奖励。
模式集合在训练中迭代更新。每个训练间隔后,我们从当前策略采样 trajectories,优先选择通过 verifier 或触发 monitor 的 rollouts。随后,一个 agentic reviewer 检查这些 trajectories,识别新出现的捷径策略。反复出现的模式会被加入 \(P\),更新后的 monitor 部署到下一轮 RL。这种闭环设计很重要,因为 reward hacking 依赖策略:随着模型改进,它可能发现初始审查中不存在的新利用通道。
我们报告四个 rollout-level 指标:Resolved 是标准 verifier pass rate;Hack Rate 是触发 behavior monitor 的 trajectory 比例,无论最终 patch 是否通过;Hacked Resolved 是既通过 verifier 又触发 monitor 的 trajectory 比例,用于衡量通过受监控捷径通道获得的 verifier success;Clean Resolved 是通过 verifier 且未触发 monitor 的 trajectory 比例。换言之,它把 monitor-triggered successful trajectories 视为错误。
表 tab:hack_monitor_result: Hack monitoring 抑制 reward hacking 并提升 clean resolution。我们在三个 SWE-Bench 变体上评估 Qwen-Turbo,比较未监控 baseline(Base)和 monitor(+Mon.)。Clean Resolved 把 hacked solutions 视为错误,而 Hack Rate 和 Hacked Resolved 分别衡量尝试利用和成功利用。
| Benchmark | Clean Resolved Base | Clean Resolved +Mon. | Clean Resolved \(\Delta\) | Hack Rate Base | Hack Rate +Mon. | Hack Rate \(\Delta\) | Hacked Resolved Base | Hacked Resolved +Mon. | Hacked Resolved \(\Delta\) |
|---|---|---|---|---|---|---|---|---|---|
| SWE-Bench Verified | 36.49 | 64.98 | +28.50 | 51.49 | 2.13 | -49.35 | 41.35 | 0.70 | -40.65 |
| SWE-Bench Multilingual | 50.73 | 66.33 | +15.60 | 31.19 | 1.59 | -29.61 | 23.76 | 0.84 | -22.93 |
| SWE-Bench Pro | 33.43 | 50.27 | +16.84 | 30.60 | 0.20 | -30.40 | 20.61 | 0.13 | -20.47 |
| Average | 40.22 | 60.53 | +20.31 | 37.76 | 1.31 | -36.45 | 28.57 | 0.56 | -28.02 |

图 fig:rl-behavior-monitor: 有无行为监控时的 RL 动态。 我们在三个 SWE-Bench 变体上使用 Qwen-Turbo 绘制 RL step 过程中的表现。即使越来越多成功 trajectory 依赖受监控捷径行为,未修正的 verifier pass rate 仍可能上升。当这些 trajectory 被计为错误时,未监控训练的 clean performance 会在后期急剧下降。行为监控 RL 避免了这种崩塌,并在整个训练过程中保持更高 clean resolution。
表 tab:hack_monitor_result 报告了 behavior-monitored RL 的最终效果。在三个 benchmark 上,monitor 将平均 hacked-resolved rate 从 28.57% 降至 0.56%,同时将 clean resolved rate 从 40.22% 提升到 60.53%。因此,收益并不只是 raw verifier passing 增加,而是从 shortcut-dependent success 转向 monitor-clean success。
图 fig:rl-behavior-monitor 解释了这种变化如何在 RL 中出现。在未监控运行中,即使 clean resolved performance 下降,verifier success 仍可能保持较高,表明 terminal reward 越来越接受过程无效的解。Behavior-monitored RL 通过惩罚经受监控捷径通道获得 verifier success 的 trajectories,防止了这种分歧。因此,monitor 是一种 process-aware reward correction,而不是事后过滤器。
面向前端任务的交互式 Judge¶
不同于 SWE-like 任务,前端任务不能仅靠执行成功来评估。编码 Agent 可能生成没有错误的 HTML、CSS 和 JavaScript,但视觉质量差、动画损坏或交互错误。因此,忠实评估前端输出需要同时检查生成 artifact 的渲染视觉外观和交互功能行为。
本节首先介绍一个 rubric-based static judge,它沿结构化维度评估渲染截图和源代码,为前端任务提供初始层面的奖励忠实性(:static-judge)。随后,我们提出一个 agentic interactive judge,用模拟真实用户交互的方式操作生成网页,从而提高奖励鲁棒性,并更接近人类前端评估(:interactive-judge)。
表 tab:rubric_alignment: Rubric-based judge 与人工标注的一致性,以及跨 judge 一致性。我们使用两个 scorer model 和多个 prompt 配置,在 8 个模型、671 个 WebDev 任务上评估。所有 rank correlation 都具有统计显著性(\(p < 0.05\))。
| Scorer | Prompt | Spearman \(\rho\) | Kendall \(\tau\) | Battle Agreement | Cross-Judge \(\tau\) |
|---|---|---|---|---|---|
| Qwen3.7-Plus | Default | 0.810 | 0.714 | 40.4% (6,339/15,698) | \(\geq 0.93\) |
| Qwen3.7-Plus | Strict | 0.810 | 0.714 | 41.4% (6,499/15,698) | \(\geq 0.93\) |
| Qwen3.6-Max | Default | 0.905 | 0.786 | 34.2% (5,368/15,698) | \(\geq 0.93\) |
| Qwen3.6-Max | Strict | 0.905 | 0.786 | 36.1% (5,660/15,698) | \(\geq 0.93\) |
基于 Rubric 的静态 Judge¶
动机。 在没有可执行测试时,一个自然替代方案是使用大语言模型作为 judge:把生成代码和渲染截图输入模型,让它直接为输出打分。然而,这类基于模型的 judge 容易出现主观偏差、评分标准不一致以及视觉和功能正确性覆盖不完整。近期工作表明,引入结构化评估 rubric 可以缓解这些问题 [zhang2025artifactsbench, wu2025frontalk, zhang2025plotcraft]:通过把整体奖励拆分为针对功能正确性和视觉质量具体方面的细粒度评分维度,rubric-based evaluation 能减少模型偏差并提高可复现性。此外,迭代改进 rubric 设计还能进一步提升评分质量 [rubrics]。
设计与效果。 基于这些发现,我们设计了一个 rubric-based judge,同时输入渲染截图和源代码,并沿 functional correctness、visual quality 等结构化维度评估。我们发现,引入设计良好的 rubric 能提高人类评估者之间的一致性,例如缓解偏好视觉惊艳但功能错误输出的倾向。此外,如表 tab:rubric_alignment 所示,rubric 显著提升模型 judge 分数与人工评估的一致性,以及不同 judge 模型之间的一致性。
具体而言,我们在 8 个模型上评估 671 个 WebDev 任务。每个任务被拆成平均 25.9 个 checklist item,覆盖六个维度:Functional(37.7%)、Content(19.0%)、Visual(13.3%)、Layout(12.9%)、UX(9.3%)和 Technical(7.2%)。我们运行 6 种 scorer 配置,组合两个 judge 模型(Qwen3.6-Max 和 Qwen3.7-Plus)、两个 prompt 变体(Default 和 Strict)以及两个 thinking level。所有配置都产生高度一致的模型排名:同一 scorer family 内 Kendall \(\tau = 1.0\);跨 scorer family 时 \(\tau \geq 0.93\)。改变 prompt strictness 会降低绝对分数并扩大分数跨度,但不会改变排名;thinking level 影响可忽略(\(< 0.6\) 分)。这些结果确认,rubric-based judge 对配置选择具有鲁棒性。详细 judge prompts 见附录。

图 fig:webdev-rl-training: 三种 judge 范式(Visual judge、hybrid judge、interactive judge)在训练 step 上的前端编码分数(train/test)和生成长度 RL 训练曲线。
局限。 尽管有这些收益,静态 judge 范式有内在缺陷。第一,表单校验、动态路由、有状态交互等复杂前端功能难以仅通过代码检查验证;正确性取决于运行时行为,而源代码审查无法可靠捕捉。第二,静态截图只代表单一页面状态,无法覆盖多页面导航、交互转换,或只有用户操作后才出现的内容(如下拉菜单、模态框、滚动触发元素)。这些局限共同推动我们设计一个能主动与渲染 artifact 交互的 judge。
Agentic Interactive Judge¶
动机。 一个自然方案是采用交互式评估协议,模拟人类质量检查员评估 Web 应用的方式:真正导航并操作它。然而,在当前约束下部署完全自主的视觉 Agent loop 来做 judge 并不现实:多轮 Agent 交互推理成本高 [he2026vision2web],序列决策会引入累积误差,降低评估稳定性。因此,我们设计了一个半自动化的 agentic interactive judge,在交互覆盖、效率和可靠性之间取得平衡。
方法。 核心思路是三阶段 evaluate-by-interaction pipeline(图 fig:interactive-judge-pipeline)。第一,给定渲染网页和评估 rubric,action planner 一次性生成完整 action list,指定用于触发目标功能的用户交互序列。第二,基于 Playwright 的 render server 在真实浏览器环境中执行这些动作,并记录交互 trace,包括每一步的屏幕录制和状态变化。第三,judge model 将录制中采样的帧与源代码一起,根据 rubric criteria 评分,产出最终分数。

图 fig:interactive-judge-pipeline: Interactive Judge pipeline 概览。给定候选代码和用户 prompt,预处理阶段抽取页面信息(accessibility tree、browser state、keyboard listeners)并合成评估标准(Critical 和 Detail checklist)。action planner 一次性生成完整 action list,由 Playwright server 执行并生成 interaction trace。judge model 根据 criteria 对 trace 打分,为 RL 训练或 SFT 数据筛选提供奖励/标注。
具体而言,我们预定义一组原子 Web 操作库(如 click、scroll、navigate、fill form、hover、press key),作为 planner 的 action vocabulary。不同于标准 Agent loop 根据前序观察逐步决定每个动作,我们的 planner 从任务规格和页面信息(accessibility tree、browser state、keyboard listeners)一次前向生成所有动作。render server 随后按序执行 action list,在每一步后捕获截图、DOM 变化和 console output。judge model 接收这些 interaction traces、源代码和 rubric checklist,并根据任务要求对观察到的行为评分。
通过把评估建立在真实运行时行为上,该方法直接通过真实交互验证功能正确性,而不是代码检查;它也能通过页面间导航自然扩展到多页面应用。相比只能观察源代码和固定截图的 static judges,interactive judge 捕捉动画、状态转换、多步 workflow 等动态行为,这些行为对静态评估不可见。重要的是,如图 fig:webdev-rl-training 所示,interactive judge 作为 RL 奖励信号优于两种静态替代方案(Visual 和 Hybrid),取得更高 test score,同时保持稳定输出长度。相比之下,static judges 容易受到长度利用:模型学会生成越来越冗长的 CSS 和 JavaScript 来抬高静态 judge 分数;interactive judge 避免了这种 reward hacking,因为它的奖励来自运行时行为而不是源代码。
训练中的应用。 我们在两个内部 benchmark 上评估 Interactive Judge 作为训练奖励:WebDev Human Eval(Qwen 团队维护的人工评估 benchmark)和 QwenWebBench(自动化前端评估 benchmark)。我们在 Qwen3.7-Plus 的中间 checkpoint 上,把 Interactive Judge 作为 best-of-4 rejection sampling fine-tuning(RFT)的过滤标准。如表 tab:rft-results 所示,使用 Interactive Judge 过滤的 RFT 在两个 benchmark 上都带来一致提升。我们进一步将该奖励纳入 Qwen-Max 的完整训练 pipeline。在发布时,Qwen3.7-Max 在反映前端开发能力的 Code Arena 排行榜上位列全球第 4,仅次于 Claude 模型。Interactive Judge 各组件的详细消融结果见附录 app:interactive-judge-ablation。
表 tab:rft-results: 使用 Interactive Judge 过滤进行 rejection sampling fine-tuning 对中间 Qwen-Plus checkpoint 的影响。
| Setting | WebDev Human Eval | QwenWebBench |
|---|---|---|
| Qwen-Plus (intermediate) | 78 | 1509 |
| + Interactive Judge RFT | 84 (↑6) | 1545 (↑36) |
面向真实世界 Agent 任务的用户反馈 Verifier¶
目前,绝大多数 Agent 训练依赖精心构造的 verifier,通过测试套件判断任务完成情况。在实践中,这把训练限制在受控的沙盒设置里:为了支持自动评估,研究者会重写任务以适配特定 verifier,过滤掉难以自动评估的实例,或者只评估部分维度。虽然这些妥协让训练 pipeline 可以运转,但也在训练分布和开放的真实世界场景之间引入系统性差距。在真实场景中,Agent 必须处理多样且无约束的需求,而沙盒代理目标无法捕捉这些需求。
对这种开放真实场景,核心挑战仍然是提供忠实且鲁棒的奖励信号。幸运的是,作为任务发起者,用户天然关心 Agent 是否完成了任务,因此用户是最理想的 verifier。然而,用户通常不会提供显式数值奖励信号。相反,他们会在与 Agent 的多轮交互中,通过自然语言和行为模式隐式表达自己的验证判断。
一种自然的操作化方法是把这一信号蒸馏进 learned reward model,并规模化优化它。这类 reward model 在可扩展性上很有吸引力:一旦训练完成,它就能以极低成本给任意多 trajectories 打分。然而,开放场景下真实用户意图极其多样且高度不充分规定,reward model 只能把它压缩成静态、有损代理目标,使其难以从交互中精确学习真实用户意图。随着策略变强,它倾向于利用代理目标与真实意图之间的差距,从而侵蚀真实部署中最重要的鲁棒性。因此,鉴于庞大用户基础,我们直接把用户视为 verifier,使模型能自然地从大规模用户反馈数据中学习人类意图的细节。我们认为,大规模且忠实地利用用户反馈,是形成数据飞轮的关键环节:真实交互持续提供基于 Agent 实际行为的 on-policy 信号,这些信号再推动下一轮策略改进。
因此,本节提出一个 pipeline,用于从用户--Agent 交互 trajectories 中抽取 process-level 自然语言反馈,并通过三种目标用于训练:SFT、reweight SFT(RW-SFT)和 span-level KTO(Span-KTO)。
反馈标注 Pipeline¶
数据来源¶
我们的对话数据来自公司内部一组资深软件工程师与编码助手在日常开发工作中的真实交互记录。这些专业开发者在代码重构、功能开发、bug 修复和系统设计等多样工程任务中大量使用编码助手,既提供真实任务多样性,也提供基于清晰技术推理的高质量反馈信号。
人类隐式奖励信号¶
在用户与编码助手的多轮交互中,每条用户回复天然包含对上一轮助手表现的评价。用户可能显式说“no, revert it”,也可能通过行为隐式表达态度,例如接受结果并立即添加新需求(隐式认可),或用另一种方式重新描述同一需求(隐式否定,表示助手没有正确理解)。我们把散布在对话中的这些信号称为 Human Implicit Reward Signals(HIRS),并设计了基于 LLM-as-Judge 的自动标注 pipeline,用于规模化抽取这些信号。
LLM-as-Judge 标注¶
在预处理原始 trajectories、剥离与评估无关的噪声(reasoning traces、冗长 tool I/O 和 system prompts)后,我们使用 Qwen-Plus 作为 Judge model,对对话逐轮标注。这里一轮指一条用户消息及助手对它的完整回复。标注核心是精心设计的 System Prompt(完整内容见附录 app:judge_prompt),要求 Judge 遵循三项原则:双视角评估:同时记录用户表达了什么(polarity)以及用户评价是否客观公平(user_fairness)。二者允许不一致,例如助手正确遵循指令但被用户否定时,polarity 标为 negative,但 user_fairness 标为 unreasonable;证据驱动:每个标注必须引用用户原始消息中的具体词语或短语作为证据,不允许基于猜测标注;保守标注:当信号模糊时,标注应偏向 neutral,即“宁可漏标,不要错标”。对每轮,Judge 输出结构化字段,包括 reward polarity(polarity)、confidence、signal source type、negative reason category 和 user evaluation fairness(user_fairness)。trajectory level 还会标注整体任务完成状态。完整字段规范见附录 app:judge_prompt 中的 Judge prompt。
数据集分析¶

图 fig:signal_stats: 标注数据集的轮次级信号统计:(a) polarity 分布,(b) 按 confidence 拆分的 polarity,(c) negative-reason 分布。
标注数据集包含 125,528 条 trajectories 和 535,737 条 round-level annotations。如图 fig:signal_stats 所示,我们识别出三个关键特征:polarity 分布高度不对称。 用户反馈以 neutral signal 为主,其次是 negative signal,而 positive signal 极其稀少。排除初始任务描述轮后,neutral、negative 和 positive 分别占 76.6%、20.0% 和 3.5%。这反映了人机交互中的自然倾向:当助手表现正确时,用户通常直接进入下一需求,而不是显式表扬;当助手出错时,用户更倾向于明确反馈。负向信号置信度高。 与 neutral signals 相比,用户表达对助手表现的拒绝时更清楚、更确定。具体而言,81.8% 的 negative signals 是 high-confidence,远高于 neutral signals 的 18.7%。错误集中在执行和理解。 在 negative reasons 分解中,execution errors(56.6%)和 misunderstanding errors(21.1%)合计占 77.7%,说明代码实现正确性和需求理解准确性是编码助手最关键的改进方向。
Trajectory-level 统计(outcome distribution、round--trajectory consistency 和 feedback reliability)见附录 app:dataset_stats,各标注类型的详细示例见附录 app:annotation_examples。
方法¶
符号¶
给定输入上下文 \(x\) 和目标输出序列 \(y = (y_1, y_2, \dots, y_T)\),自回归语言模型 \(\pi_\theta\) 在每个时间步 \(t\) 输出条件概率 \(\pi_\theta(y_t \mid x, y_{<t})\)。在训练数据中,每个 token \(y_t\) 都关联一个 process-level polarity annotation \(p_t \in \{\mathrm{positive}, \mathrm{neutral}, \mathrm{negative}\}\),来自逐步评价模型行为的人类反馈信号。我们把冻结参考模型(即训练前 checkpoint)记为 \(\pi_{\mathrm{ref}}\)。
Span 定义¶
给定响应 \(y\) 的逐 token polarity annotation 序列 \((p_1, \dots, p_T)\),我们根据用户交互边界把 trajectory 划分为 \(K\) 个 polarity 一致的连续 spans \(\{S_k\}_{k=1}^{K}\),其中每个 span \(S_k = (y_{s_k}, y_{s_k+1}, \dots, y_{e_k})\) 满足:所有 token 共享同一 polarity,即 \(p_t = p_{S_k},\; \forall\, t \in [s_k, e_k]\);并且 \(p_{S_k} \in \{\mathrm{positive}, \mathrm{negative}\}\)(neutral tokens 不参与 preference learning)。
监督微调(SFT)¶
标准监督微调对所有 token 应用统一 cross-entropy loss,不区分 polarity annotations:
其中 \(\mathbb{E}_{t}\) 表示序列中所有 token 位置的均匀期望。该方法平等对待对应 positive、neutral 和 negative feedback 的 token,完全依赖数据分布本身的质量来指导模型学习。
Reweight SFT(RW-SFT)¶
利用 process-level 人类标注信号的一种直接方法,是对不同 polarity 的 token 施加不同 loss 权重。我们定义权重函数 \(w\colon \{\mathrm{positive}, \mathrm{neutral}, \mathrm{negative}\} \to \mathbb{R}_{\geq 0}\):
Reweight SFT loss 定义为:
实践中,我们设 \(w_{\mathrm{pos}} = 1.2\)、\(w_{\mathrm{neu}} = 1.0\)、\(w_{\mathrm{neg}} = 0.8\),即略微放大 positive token 的学习信号,略微降低 negative token 权重。该方法相较标准 SFT 几乎不引入额外计算开销,通过权重调整选择性减弱负向行为,是利用人类标注信号的 baseline 方法。然而,如 Section subsec:reweight_analysis 所示,该方法对权重值高度敏感。
Span-Level KTO¶
RW-SFT 通过 reweighting 利用人类标注中的 polarity 信息,但机制仅限于调整各 polarity token 的学习强度,不能显式把模型策略推离负向行为。为此,我们进一步引入基于 preference learning 的训练方法。
KTO [ethayarajh2024kto] 将前景理论引入语言模型对齐,用 policy model 与 reference model 之间的 log-likelihood ratio 作为 implicit reward,在不需要成对 preference data 的情况下实现 preference optimization。后续工作把 KTO 从 response level 扩展到 step level(step-level KTO),以捕捉更细粒度的 process-level feedback。我们沿着这条线,将 KTO 的奖励判断单元定义为由人工标注 polarity 划分出的连续 spans,其中每个 span 对应 Agent 针对完整用户请求生成的响应。
Span-Level Implicit Reward¶
对每个 span \(S_k\),implicit reward 定义为该 span 内所有 token 的 log-likelihood ratios 之和:
每个 span 作为独立 reward judgment unit,其内部 token 的 log-likelihood ratio 之和构成该 span 的 joint log-likelihood ratio。这个定义在形式上与 response-level KTO 中的 sequence-level log-likelihood ratio 相同。
Reference Point Estimation¶
Reference point \(z_{\mathrm{ref}}\) 通过训练期间所有 span rewards 的指数滑动平均(EMA)在线估计:
其中 \(\bar{r}_{\mathrm{batch}} = \mathbb{E}_{S_k \in \mathcal{S}_{\mathrm{batch}}} \!\left[r_\theta(x, S_k)\right]\) 是当前 batch 中所有 spans 的平均 implicit reward,\(\alpha\) 是 EMA decay coefficient。
Span-Level Preference Loss¶
我们把每个 span 的 advantage function 定义为其 implicit reward 相对 reference point 的偏移:\(a_k = r_\theta(x, S_k) - z_{\mathrm{ref}}\),并对 positive 和 negative spans 应用不同 value functions:
其中 \(\sigma\) 是 sigmoid function,\(\beta > 0\) 控制 preference strength,\(\lambda_w\) 和 \(\lambda_l\) 分别是 positive span 和 negative span 的 loss coefficients。Preference loss 是所有 span losses 的期望:
Neutral Token Regularization¶
Neutral tokens(\(p_t = \mathrm{neutral}\))不携带 preference signal,但仍包含有价值的语言建模信息。我们对 neutral tokens 应用标准 cross-entropy loss 作为 regularization term:
其中 \(\mathcal{T}_{\mathrm{neu}} = \{t : p_t = \mathrm{neutral}\}\) 是 neutral token 集合。
总体目标¶
Span-KTO 的完整训练目标是 preference loss 和 neutral regularization 的组合:
Span-KTO 引入两个关键超参数:preference strength \(\beta\) 和 negative span loss coefficient \(\lambda_l\)。这些超参数的消融实验见附录 app:kto_ablation。
实验¶
RW-SFT 敏感性分析¶

图 fig:neg_weight_ablation: \(w_neg\) 对 RW-SFT 性能的影响,结果为三个 SWE-bench benchmark 平均值。
图 fig:neg_weight_ablation 展示了 RW-SFT 中 negative weight \(w_{\mathrm{neg}}\) 对模型性能的影响。性能对 \(w_{\mathrm{neg}}\) 高度敏感,并呈非单调趋势:\(w_{\mathrm{neg}} = 0.0\)(完全丢弃 negative tokens)仅得到 37.2%,\(w_{\mathrm{neg}} = 0.5\) 降到 35.1%,二者都显著低于 SFT baseline(\(w_{\mathrm{neg}} = 1.0\),41.8%)。图中虚线表示丢弃标记为 failure 或 abandoned 的整条 trajectory 后再做 SFT 的结果,该方法也没有带来显著收益。唯一超过 baseline 的配置是 \(w_{\mathrm{neg}} = 0.8\)(44.4%),它仅对 negative spans 稍微降权。这说明 negative spans 仍包含有价值的语言建模信息,重度惩罚或完全丢弃它们反而会损害训练数据的有效利用。
这确认了 reweighting 的基本局限:它只能调整学习强度,不能改变学习方向,因此需要 Span-KTO 这类 preference learning 方法。
主要结果¶

图 fig:main_results: SFT、RW-SFT 和 Span-KTO 的最佳 checkpoint 在五个代码能力 benchmark 上的性能比较。误差条表示多次评估的标准差。Span-KTO 在所有 benchmark 上取得最佳结果。
我们在以下五个 benchmark 上评估模型正确完成任务的能力:SWE-bench 系列(Verified [openaiSWEVerified2024,jimenez2024swebench]、Pro [deng2025swebenchproaiagents]、Multilingual [zan2025multiswebench])评估真实软件仓库中的代码修复能力;Aone-bench 是内部软件工程 benchmark;OctoBench [ding2026octobench] 评估 Agent 在仓库级编码任务中遵循 scaffold instructions 的能力。图 fig:main_results 展示了三种方法在所有 benchmark 上的比较结果。
Span-KTO 在五个 benchmark 上都优于两个 baseline。SWE-bench Verified 上,Span-KTO(59.8%)相对 SFT baseline(54.2%)取得 5.6 个百分点的绝对提升;SWE-bench Multilingual 上提升更明显(+7.8pp)。Aone-bench 上,SFT 只有 14.8%,而 Span-KTO 提升到 28.1%(+13.3pp),展示了 process-level human feedback 在真实代码修复场景中的显著价值。三种方法在 OctoBench 上差距较小(62.3% / 67.0% / 67.4%),可能因为该 benchmark 更强调遵循 scaffold instructions 的综合能力,而不只是代码修复质量。
RW-SFT 在所有 benchmark 上都优于 SFT baseline,但提升有限(例如 SWE-bench Verified 上仅 +1.0pp),说明简单 reweighting 可以部分利用标注信号,但远不如 Span-KTO 的 preference learning framework。后者不仅减弱从负向行为中学习,还显式地把模型策略推离错误方向。
负向行为修正¶

图 fig:behavior_scores: SFT 和 Span-KTO 在 SWE-bench Verified 上六个行为维度的比较,分别展示 resolved 和 unresolved tasks。分数范围 0 到 4,越高表示负向行为越少。
为了更深入理解 Span-KTO 带来的改进,我们进一步分析模型在六个行为维度上的表现。使用 Agent-as-Judge 方法(评估 rubric 详见附录 app:agent_judge),我们从 Execution Error、Misunderstand、Omission、Overaction、Inefficiency 和 Communication 六个维度为模型 Agent trajectories 打分。图 fig:behavior_scores 展示了 SFT baseline 与 Span-KTO 在 SWE-bench Verified 上的比较结果。
已解决实例¶
Span-KTO 在所有维度上都有改进,但幅度较小(+0.5% 到 +6.8%),因为成功解决的实例本身已经具有较高行为质量,提升空间有限。
未解决实例¶
差异非常显著。Span-KTO 在 Inefficiency(+34.5%)和 Communication(+26.5%)上提升最明显,Execution Error 也提升了 +13.9%。这说明 Span-KTO 让模型在面对困难任务时表现出更好的自我调节能力:更快识别瓶颈、减少无意义重试,并以更清晰方式向用户沟通问题。Execution Error 的提升进一步表明,执行过程中的语法错误、错误命令等技术错误也显著减少。
这一结果表明,Span-KTO 训练的价值不仅在于“解决更多问题”(resolution rate +5.9pp),也在于“失败时表现得更合理”。这对真实部署很关键,因为用户对 Agent 的信任很大程度上取决于它在无法完成任务时,是否仍能保持专业、可控的行为。
面向长程任务的动态 Agent Judge¶
前几节讨论的任务主要针对现有代码库的理解、修改和增强。同时,长程代码生成,即从自然语言规格生成结构复杂的完整项目,正在受到越来越多关注 [ding2025nl2repo,zhang2026repozero,yang2026programbench]。这些 benchmark 要求 Agent 设计模块层级、管理跨文件依赖,并从零交付功能完整的代码库。为这类任务提供可靠奖励信号尤其困难,因为生成代码库的复杂性和规模远超传统 verifier 的处理范围。
Evaluation Agent 的设计¶
动机。 这类任务的规格通常以高度抽象方式表达:它们描述预期功能和外部接口,但很少规定内部实现和文件组织。验证生成代码的完整功能需要覆盖所有特性和边界情况的综合测试套件,轻易就会达到数百个测试用例,因此仅依赖人工编写测试作为可扩展奖励信号并不可行。此外,不同实现不可避免会引入不同边界情况,静态预定义测试套件无法预见这些情况。这促使我们使用 agent-based evaluator [zheng2023judging, tong2024codejudge],利用模型自身推理能力动态评估生成代码并提供奖励信号,作为手写测试套件的可扩展替代方案。
评估任务设计。 令 \(\mathcal{G}\) 表示生成器,\(\mathcal{E}\) 表示 evaluator agent,\(\mathcal{I}\) 表示评估指令 prompt。给定任务规格 \(\mathcal{T}\) 和生成器产出的代码仓库 \(\mathcal{G}(\mathcal{T})\),evaluator 将 \(\mathcal{T}\) 分解为可验证功能需求 checklist \(\mathcal{C} = \{c_1, c_2, \dots, c_N\}\),逐项评估实现,并产出两个分数:checklist pass rate \(S_{\mathrm{pass}} = \frac{1}{N}\sum_{i=1}^{N} \mathbb{I}[c_i \text{ passes}]\),以及捕捉整体代码质量的 overall evaluation score \(S_{\mathrm{eval}}\),因为 checklist items 重要性不同,对二值结果做均匀平均不一定反映整体代码质量。
Evaluator 的评估。 为评估 \(\mathcal{E}\) 本身质量,我们从每个源仓库中抽取原始测试套件,并把它视为近似 ground truth。对每个生成仓库 \(\mathcal{G}(\mathcal{T})\),该测试套件产生 unit-test score \(S_{\mathrm{UT}}\)。我们通过测量 evaluator 分数(\(S_{\mathrm{pass}}\)、\(S_{\mathrm{eval}}\))与一组生成仓库上的 \(S_{\mathrm{UT}}\) 的接近程度来评估 \(\mathcal{E}\)。接下来的小节考察如何度量这种对齐、如何设计 \(\mathcal{E}\) 以最大化对齐,以及不同训练目标如何偏好不同 evaluator metrics。
数据集构造与指标设计¶
数据集构造。 我们基于 NL2Repo benchmark 构造 evaluator 验证集,它包含 \(M = 104\) 个长程代码生成任务。对每个任务 \(\mathcal{T}_j\),我们收集来自多种模型的生成结果,包括 Claude Opus 4.6 [anthropic2026opus46]、Gemma 4 [gemma4_2025]、Qwen 3.6 [qwen36plus]、MiniMax M2.5 [minimax2026m25]、GLM 5 [zeng2026glm] 和 Kimi K2.5 [team2026kimi],并用 benchmark 内置测试套件评估每个生成结果,得到任务 \(j\) 的第 \(k\) 个 generation 的 \(S_{\mathrm{UT}}^{(j,k)}\)。为保证有意义的可区分性,我们每个任务最多保留 \(K = 4\) 个 generations,并选择 unit-test scores 多样性最大的样本。
指标设计。 为量化 evaluator \(\mathcal{E}\) 与 unit-test ground truth 的对齐,我们设计以下指标。我们主要使用 \(S_{\mathrm{eval}}\) 而不是 \(S_{\mathrm{pass}}\) 进行评估,因为我们发现 \(S_{\mathrm{eval}}\) 与 \(S_{\mathrm{UT}}\) 的相关性持续更高。
Best-of-\(N\) Accuracy 与 Regret¶
对每个任务 \(\mathcal{T}_j\),令 \(k^* = \arg\max_k S_{\mathrm{eval}}^{(j,k)}\) 表示 evaluator 选择的样本。Best-of-\(N\)(BoN)accuracy 衡量该选择与 unit-test 最优解一致的频率。为捕捉次优选择的幅度,我们定义每个任务的 regret 为最佳可达到 unit-test score 与 evaluator 选择样本 score 的差距,并报告平均 regret。二者共同衡量 evaluator 的选择能力,即它能否从小候选池中可靠识别最佳样本。选择单个最佳候选是对 evaluator 最简单的要求,因此 BoN accuracy 和 regret 构成 evaluator 能力的基准度量。
Kendall's \(\tau\)¶
对每个任务 \(\mathcal{T}_j\),我们枚举所有满足 \(S_{\mathrm{UT}}^{(j,k)} \neq S_{\mathrm{UT}}^{(j,l)}\) 的样本对 \((k,l)\),如果 evaluator 排名与 unit-test 排名一致,则记为 concordant(+1);不一致则记为 discordant(-1);如果 \(S_{\mathrm{eval}}^{(j,k)} = S_{\mathrm{eval}}^{(j,l)}\) 则记为 tie(0)。整体 Kendall's \(\tau\) 是所有这类样本对得分的平均值。
Pearson \(r\) 与 Spearman \(\rho\)¶
对每个任务 \(\mathcal{T}_j\),我们计算 \(S_{\mathrm{UT}}\) 与两个 evaluator scores 的 Pearson \(r\) 和 Spearman \(\rho\),并在所有任务上 macro-average,得到 \(r_{\mathrm{eval}}\)、\(r_{\mathrm{pass}}\)、\(\rho_{\mathrm{eval}}\) 和 \(\rho_{\mathrm{pass}}\)。结果确认 \(r_{\mathrm{eval}} \gg r_{\mathrm{pass}}\) 且 \(\rho_{\mathrm{eval}} \gg \rho_{\mathrm{pass}}\),验证了使用 holistic evaluation score 作为主要奖励信号的合理性。与 Kendall's \(\tau\) 一起,这些 correlation metrics 评估完整分数范围内的排名一致性,比仅选择 top sample 对 evaluator 提出更严格要求。
Threshold-Conditioned UT Score¶
为衡量 evaluator 识别高质量生成的能力,我们定义 threshold-conditioned unit-test score。给定阈值 \(\theta\),令 \(\mathcal{A}_\theta = \{(j,k) : S_{\mathrm{eval}}^{(j,k)} \geq \theta\}\) 表示 evaluator 认为足够好的样本集合。忠实 evaluator 应当使 \(\bar{S}_{\mathrm{UT}}(\theta)\) 随 \(\theta\) 升高而单调增加:获得更高 evaluation score 的样本,平均而言应取得更高 unit-test score。因此该指标评估过滤质量。
如 Section subsec:evaluator_metrics 所示,不同下游训练目标偏好这些指标的不同子集;在一个维度表现优异的 evaluator,可能在另一个维度表现较弱。
设计更好的 Evaluator Agents¶
当把现有模型部署为 evaluator 时,我们发现若干反复出现的失败模式会系统性削弱评估忠实性。以 Qwen-Plus [qwen36plus] 作为 evaluator backbone,我们刻画这些失败模式,并设计针对性缓解措施,逐步改进评估。
Baseline workflow。 初始评估 prompt 指示 \(\mathcal{E}\) 遵循三阶段 pipeline:1)把规格 \(\mathcal{T}\) 分解为 checklist \(\mathcal{C}\);2)通过代码审查验证每一项;3)产出包含 \(S_{\mathrm{pass}}\) 和 \(S_{\mathrm{eval}}\) 的评估报告。虽然该 pipeline 符合直觉上的人工 review 实践,但实际与 ground-truth scores 的对齐有限。
不执行的懒惰评估(baseline \(\to\) v1)。Evaluator 经常只依赖静态代码阅读而不执行任何测试;即使写测试,也往往过于简单或数量太少,无法暴露真实 bug。这会产生 false positives,让看起来合理但实际错误的代码获得通过分。
缺少端到端验证(v1 \(\to\) v2)。即使执行单元测试,evaluator 的测试主要覆盖函数级需求,而不做端到端验证。因此,全局损坏的仓库(例如 import errors、dependency conflicts、naming collisions)仍可能获得虚高分数。
角色混淆(v2 \(\to\) v3)。我们观察到三类边界违规:evaluator 偶尔会修改生成器代码来修 bug 后再评估,从而掩盖真实缺陷;它有时会执行仓库中已有测试而不是编写自己的测试;它也可能为生成器辩护,通过合理化生成器的替代行为来忽略失败测试。这些行为会隐藏或开脱真实缺陷,从而抬高分数。
上下文过载(v3 \(\to\) v4)。Evaluator 往往会穷尽式阅读代码库的大量部分,尽管只需要 entry-point definitions 和 interface signatures,浪费上下文容量并稀释对相关代码的注意力。
过度规定(v4 \(\to\) v5)。一个自然假设是,更详细规则会帮助评估。然而,用详尽禁止命令列表和额外程序性 guardrails 进一步细化约束,在大多数指标上反而表现更差(表 tab:evaluator-versions)。这揭示了 rubric granularity trade-off:中等详细规则能帮助较弱 evaluator 执行预期 workflow,但过度规定会压垮模型连贯遵循指令的能力,降低整体判断质量。
表 tab:evaluator-versions: 使用 Qwen-Plus 在 NL2Repo validation set 上的 evaluator prompt 迭代结果。每行对应一个 prompt version。每个 version 的有效样本数不同(均 < 360),因为并非所有 evaluator run 都产出可解析报告。BoN-Acc 和 Regret 基于 \(S_eval\)。Correlation columns 报告 Pearson \(r\) / Spearman \(\rho\)。每列最佳结果加粗。
| Prompt | BoN-Acc ↑ | Regret ↓ | \(\tau\) ↑ | \(r_{\mathrm{eval}}\) / \(\rho_{\mathrm{eval}}\) ↑ | \(r_{\mathrm{pass}}\) / \(\rho_{\mathrm{pass}}\) ↑ |
|---|---|---|---|---|---|
| v1 | 57.9 | 0.086 | 0.379 | 0.489 / 0.448 | 0.503 / 0.477 |
| v2 | 63.9 | 0.088 | 0.420 | 0.525 / 0.490 | 0.623 / 0.589 |
| v3 | 62.4 | 0.081 | 0.440 | 0.556 / 0.564 | 0.599 / 0.597 |
| v4 | 67.4 | 0.089 | 0.473 | 0.598 / 0.578 | 0.562 / 0.529 |
| v5 | 59.6 | 0.098 | 0.471 | 0.541 / 0.522 | 0.516 / 0.455 |
表 tab:evaluator-versions 总结了迭代过程。从 v1 到 v4,BoN accuracy 从 57.9% 提升到 67.4%,Kendall's \(\tau\) 从 0.379 提升到 0.473,\(r_{\mathrm{eval}}\) 从 0.489 提升到 0.598,确认适度详细的规则能提升 evaluator 忠实性。然而,v5 的下降说明规则并非越细越好:最优 rubric granularity 取决于 evaluator model 的指令跟随能力。我们采用 v4 作为后续实验的最终 evaluator prompt。
表 tab:threshold-ut 进一步报告 threshold-conditioned unit-test score \(\bar{S}_{\mathrm{UT}}(\theta)\)。在各版本中,\(\bar{S}_{\mathrm{UT}}(\theta)\) 通常在中等阈值(\(\theta \leq 9\))下随 \(\theta\) 增加而上升,确认更高 evaluator scores 对应更好代码;在 \(\theta \geq 10\) 时,由于样本量很小,趋势变得不可靠。值得注意的是,prompt v4 在中等阈值(\(\theta \geq 8\) 和 \(\theta \geq 9\))下保持最强 filtering quality,与其在 ranking-based metrics 上领先一致。
表 tab:threshold-ut: 每个 prompt version 的 threshold-conditioned 平均 unit-test score \(\bar{S}_{\mathrm{UT}}(\theta)\)。每个 cell 报告 \(\bar{S}_{\mathrm{UT}}\) 及括号中的合格样本数。
| Prompt | \(\theta \geq 7\) | \(\theta \geq 8\) | \(\theta \geq 9\) | \(\theta \geq 10\) |
|---|---|---|---|---|
| v1 | 0.575 (134) | 0.603 (72) | 0.725 (30) | 0.729 (4) |
| v2 | 0.581 (156) | 0.598 (70) | 0.646 (28) | 0.471 (2) |
| v3 | 0.588 (120) | 0.620 (46) | 0.608 (13) | 0.684 (1) |
| v4 | 0.566 (140) | 0.625 (68) | 0.624 (22) | 0.544 (5) |
| v5 | 0.566 (122) | 0.595 (59) | 0.635 (27) | 0.741 (6) |
不同训练目标下的 Evaluator 质量¶
即使优化了 evaluation prompt,使其整体对齐 \(S_{\mathrm{UT}}\),evaluator \(\mathcal{E}\) 的实际效用仍取决于下游训练目标最看重哪个指标。不同训练范式对 evaluator 提出不同要求,而单一 aggregate alignment metric 可能掩盖关键缺陷。
候选充足时的 rejection sampling。 在拥有大候选池的 rejection sampling fine-tuning(RFT)[yuan2023scaling] 中,evaluator 作为质量过滤器:保留分数高于阈值 \(\theta\) 的样本,丢弃其余样本。相关指标是 threshold-conditioned UT score \(\bar{S}_{\mathrm{UT}}(\theta)\):重要的是过滤后集合具有高平均质量,而不是每个 pairwise ranking 都正确。换言之,evaluator 主要需要低 false-positive rate(拒绝坏样本),较高 false-negative rate(丢弃部分好样本)可以容忍。
候选有限时的 rejection sampling。 当每个任务的候选池较小时,情况有所不同。在这种情况下,evaluator 不仅必须识别高质量样本,还要保留足够数量的样本;如果只有少数样本存活,过严阈值即使最大化 \(\bar{S}_{\mathrm{UT}}(\theta)\) 也会适得其反。因此,必须把 \(\bar{S}_{\mathrm{UT}}(\theta)\) 与保留样本数一起评估,此时 evaluator 也应尽量减少错误拒绝高质量生成的 false negatives。
强化学习。 在 RL 中,evaluator 提供 per-sample reward signals,直接塑造 policy gradient。这种设置要求强排名一致性(高 Kendall's \(\tau\)),使 reward landscape 忠实反映相对质量,同时要求足够的分数区分度,让模型对不同质量输出获得有意义的不同梯度。即便某个 evaluator 在技术上“正确”地指出缺陷,如果它给所有样本都分配近乎一致的低分,也会造成近零 reward variance,从而基本使学习停滞。
Evaluator model 比较。 使用 Section subsec:evaluator_design 中识别出的最佳 prompt(v4),我们在表 tab:evaluator-models 和 tab:model-threshold 中比较四个 \(\mathcal{E}\) backbone model:Claude Opus 4.7 [anthropic2025opus47]、Qwen 3.7 Plus [qwen37plus]、Qwen 3.6 Plus [qwen36plus] 和 DeepSeek V4 Pro [deepseekai2026deepseekv4]。在 ranking-based metrics 上,Claude Opus 4.7 持续领先,取得最高 BoN accuracy(70.4%)和 Kendall's \(\tau\)(0.579)。Opus 4.7 在重复运行中也表现出最高稳定性;相比之下,Qwen 3.7 Plus 虽然在单次运行中偶尔达到 Opus 级 BoN accuracy,但方差显著更高(\(\pm\)10pp),说明 evaluator reliability 而不只是 peak performance,是训练 pipeline 的关键考量。
表 tab:evaluator-models: prompt v4 下 NL2Repo validation set 上 evaluator backbone model 比较。每个模型有效样本数低于 390,因为并非所有 evaluator runs 都产出可解析报告。Correlation columns 报告 Pearson \(r\) / Spearman \(\rho\)。每列最佳结果加粗。
| Evaluator Model | BoN-Acc ↑ | Regret ↓ | \(\tau\) ↑ | \(r_{\mathrm{eval}}\) / \(\rho_{\mathrm{eval}}\) ↑ | \(r_{\mathrm{pass}}\) / \(\rho_{\mathrm{pass}}\) ↑ |
|---|---|---|---|---|---|
| Claude Opus 4.7 | 70.4 | 0.052 | 0.579 | 0.708 / 0.667 | 0.662 / 0.659 |
| Qwen 3.7 Plus | 67.3 | 0.054 | 0.553 | 0.675 / 0.636 | 0.628 / 0.562 |
| Qwen 3.6 Plus | 62.6 | 0.080 | 0.493 | 0.596 / 0.574 | 0.584 / 0.558 |
| DeepSeek V4 Pro | 54.5 | 0.087 | 0.420 | 0.549 / 0.493 | 0.502 / 0.461 |
指标冲突与质量--数量权衡。 在我们的 evaluator prompt 中,\(S_{\mathrm{eval}} \geq 8\) 表示整体通过质量,我们采用 \(\theta = 8\) 作为 RFT 的实际过滤阈值。在该阈值下出现两个张力。
第一,排名能力不保证过滤质量。Qwen 3.7 Plus 在 BoN accuracy(67.3% vs. 54.5%)和 \(\tau\)(0.553 vs. 0.420)上显著优于 DeepSeek V4 Pro,但 DeepSeek 获得了更高 conditioned UT score(0.611 vs. 0.595);类似地,Qwen 3.6 Plus 在 ranking metrics 上落后于 Qwen 3.7 Plus,但 filtering quality 相近(0.610 vs. 0.595)。
第二,数据质量与数据数量存在直接张力。如表 tab:model-threshold 所示,提高 \(\theta\) 会持续提高 \(\bar{S}_{\mathrm{UT}}(\theta)\),但保留样本数显著下降:\(\theta \geq 8\) 时各模型保留 118--139 个样本,而 \(\theta \geq 10\) 时只剩 18--30 个。更强 evaluator 有助于缓解这一点:在 \(\theta \geq 8\) 时,Claude Opus 4.7 保留 139 个样本,\(\bar{S}_{\mathrm{UT}} = 0.615\),同时取得最高质量和最大过滤集合。因此,合适 evaluator 取决于它服务的训练目标。
表 tab:model-threshold: prompt v4 下不同 evaluator backbone model 的 threshold-conditioned 平均 unit-test score \(\bar{S}_{\mathrm{UT}}(\theta)\)。每个 cell 报告 \(\bar{S}_{\mathrm{UT}}\) 及括号中的保留样本数。
| Evaluator Model | \(\theta \geq 7\) | \(\theta \geq 8\) | \(\theta \geq 9\) | \(\theta \geq 10\) |
|---|---|---|---|---|
| Claude Opus 4.7 | 0.572 (198) | 0.615 (139) | 0.652 (81) | 0.721 (30) |
| Qwen 3.7 Plus | 0.550 (220) | 0.595 (129) | 0.683 (52) | 0.795 (19) |
| Qwen 3.6 Plus | 0.535 (225) | 0.610 (133) | 0.640 (65) | 0.753 (20) |
| DeepSeek V4 Pro | 0.548 (212) | 0.611 (118) | 0.671 (61) | 0.719 (18) |
RFT 结果。 为验证 evaluator-filtered data 能转化为下游模型改进,我们在 Qwen 3.6 Turbo 上进行 rejection sampling fine-tuning。训练数据构造如下:从精选公开 GitHub 仓库中逆向工程 repository specifications,然后使用内部前沿模型作为生成器,从这些 specifications 生成完整仓库实现。原始 trajectories 经过 rule-based quality filtering,移除退化输出(如空生成、执行超时、格式错误输出),得到 19,050 条有效 trajectories。随后,我们用同一模型作为 evaluator,以阈值 \(S_{\mathrm{eval}} \geq 8\) 保留 9,294 条高质量 trajectories 用于微调。训练 batch size 为 128,每 150 steps 保存 checkpoint,最多训练 6 epochs。评估在带 anti-hacking 措施的 OpenHands scaffold 上进行,这些措施禁用网络访问(如 pip install、git clone),使模型必须完全依靠自身能力(取三次运行平均)。
表 tab:rft-results-agent: OpenHands scaffold 上的 RFT 结果(anti-hacking,3-run average)。Base model 是 Qwen 3.6 Turbo(训练前 score 11.41)。“Random”表示从 rule-based filtered data 中均匀采样,不使用 evaluator scoring;“Evaluator-filtered”只保留 \(S_{\mathrm{eval}} \geq 8\) 的 trajectories。每 150 steps 保存 checkpoint。每行最佳结果加粗。\(^\dagger\) 表示由于数据量较小,最终 checkpoint 在 step 426。
| Training Data | Size | 150 steps | 300 steps | 450 steps | 600 steps |
|---|---|---|---|---|---|
| Random sample (no evaluator) | 9,139 | 20.29 | 21.22 | 21.61\(^\dagger\) | -- |
| All rule-based filtered (no evaluator) | 19,050 | 20.78 | 23.14 | 21.15 | 24.75 |
| Evaluator-filtered (\(S_{\mathrm{eval}} \geq 8\)) | 9,139 | 19.58 | 22.43 | 23.52\(^\dagger\) | -- |
\(^\dagger\) 表示由于数据量较小,最终 checkpoint 在 step 426。
如表 tab:rft-results-agent 所示,RFT 显著提升 base model(11.41 \(\to\) 23.52)。在受控数据规模(9,139 samples)下,evaluator-filtered data 比随机采样高 1.91 分(23.52 vs. 21.61),确认 evaluator 为数据选择提供了有意义的质量信号。完整未过滤集合(19,050 samples)达到 24.75(600 steps,但之后平台期),体现了前述质量--数量权衡:数据量翻倍可以补偿缺少 evaluator filtering,但计算成本更高。这些结果说明,当候选池受限且需要仔细选择以最大化训练效率时,evaluator 最有价值。
结论¶
本文分享了我们围绕编码 Agent 训练和评估中奖励信号设计积累的实践经验。编码 Agent 必须处理极其多样且复杂的场景,这意味着评估其输出远非简单问题。为此,我们主张根据不同任务特征和策略模型能力水平,有针对性地提升奖励可行性,在忠实性、可扩展性和鲁棒性三个维度之间寻找最佳平衡。我们的实践表明,提升奖励信号质量会在不同训练阶段带来切实模型性能收益,包括 rejection sampling fine-tuning 和 reinforcement learning;与此同时,三者之间存在内在张力,需要研究者根据具体训练目标仔细权衡。这个被反复验证的模式使我们把奖励信号视为推动基础模型能力持续改进的核心基础设施,而不是训练 pipeline 中的附属组件。
展望未来,我们认为以下方向值得进一步探索:
解空间质量分层。 同一指令往往允许多个有效解。以 bug fix 为例,有效解从解决根因的结构性修复,到仅压制症状的表面 workaround,都可能通过测试套件,但工程质量根本不同。当前二值奖励无法区分这些层级;设计能捕捉解空间质量梯度的奖励信号,是引导模型走向更高质量修复的关键。
捕捉人类主观感知。 对前端任务而言,质量本质往往位于人类用户一眼即可感知、却难以用规则量化的体验维度中:动画的流畅和自然、视觉层级的舒适度、交互反馈的响应性以及整体设计的“polish”。当前 evaluator,无论基于静态截图比较还是自动化交互测试,都难以触达这些维度。如何弥合机器评估与人类感知之间的差距,仍是前端任务评估中的开放问题。
从离线反馈挖掘到在线学习。 当前编码 Agent 对用户反馈的使用仍主要是被动且离线的:从历史交互日志中抽取反馈信号,并用于后续训练迭代。近期研究开始探索 online adaptation 和 deployment-time model improvement,暗示一种超越纯离线训练 pipeline 的转向。在这一更广方向中,用户反馈提供了尤其有价值的 on-policy 信号,因为它是对 Agent 在真实任务中实际行为的响应。更好地把这类信号整合进在线学习框架,可能使编码 Agent 更持续地适应变化中的用户需求、环境和失败模式。
Evaluator--generator 共同演化。 随着生成器改进,evaluator 也必须跟上:针对弱生成器校准的 evaluator,可能无法区分高质量输出之间的差异。这提示一种共同演化训练循环,其中 evaluator 会周期性更新,以匹配生成器不断前进的能力前沿,类似 adversarial training 中 discriminator--generator 的动态 [goodfellow2020generative]。
长程和多 Agent 设置中的 credit assignment。 在从零构建完整代码仓库的过程中,最终结果是大量中间决策的累积产物;在多 Agent 协作设置中,这一问题更加复杂。如何把 outcome-level reward signals 精确归因到单个生成步骤或每个 Agent 的贡献上,实现有效 credit assignment,是提升复杂场景训练效率的关键。
作者¶
脚注:Project Lead;Corresponding author;按字母顺序列出。1 Alibaba Qwen Team;2 Fudan University;3 Institute of Automation, Chinese Academy of Sciences;4 University of Science and Technology of China;5 Tsinghua University;6 Zhejiang University。
核心贡献者。 Binghai Wang1,2, Chenlong Zhang1,3, Dayiheng Liu1, Jiajun Zhang1,4, Jiawei Chen1, Mingze Li1, Mouxiang Chen1, Rongyao Fang1, Siyuan Zhang1,5, Xuwu Wang1,, Yuheng Jing1,3, Zeyao Ma1, and Zeyu Cui1,.
贡献者。 Beichen Zhang1, Hang Zhang1, Hao Chen1,6, Jinxi Wei1, Shuai Bai1, Tao Gui1,2, Tiancheng Gu1, Xianwei Zhuang1, Yixiao Zhou1,6, Yubo Ma1, Yunlong Feng1, Yuqian Yuan1, and Yuzi Yan1.
SWE-like 任务的 Agentic Judge 系统提示词¶
本附录给出 quality judge agent 使用的完整 prompt。该 agent 在交互式 Docker 环境中运行,可访问仓库、评估脚本和 reference patch。
主要目标。 你是一个可以多次与 computer shell 交互的 helpful assistant agent。你的任务是评估一个软件工程任务对于训练 coding agent 的质量。
背景知识。 一个 Software Engineering(SWE)任务用于训练 coding agent,包含三个关键组件:编码任务、运行环境和测试脚本。PR Description 描述要解决的编码任务;Environment 指目标环境,仓库代码位于 /testbed,必要包已预装;Test Script 通过 /evaluation.sh 运行,用于验证实现是否正确。还会在 /patch.patch 提供 reference patch 作为提示,该 patch 由资深工程师创建,但不一定完美。任务是评估两方面质量:PR description quality 和 test script quality,以判断该 SWE task 是否适合训练 coding agents。
评估原则。
- 维度 1:
instruction_quality,PR 描述是否足够清楚,使软件工程师能够做出有意义的修复尝试。 - 维度 2:
instruct_ut_quality,测试脚本是否与 PR 描述中提到的问题一致。
输出必须是单行 JSON object:
{
"instruction_quality": 0,
"instruction_quality_rationale": "...",
"instruct_ut_quality": "a|b|c",
"instruct_ut_quality_rationale": "..."
}
SWE-like 任务 Agentic Judge 示例¶
为构造评估 agentic judge 的 benchmark,我们沿 :unit_tests 中定义的两个质量维度 instruct_clear 和 instruct_ut_align,手工标注了一组 SWE-like 任务。标注揭示了两类反复出现的质量问题,下面用代表性案例展示。
第一类是指令不清:任务指令过于模糊、过短,或依赖无法访问的外部上下文(如私有频道、未记录惯例),因此无法仅凭给定信息解决。
图 fig:case_study_cate1: SWE-bench-like 数据集中指令不清的代表案例。Case 1 的 instruction 只有两个词,没有可操作规格。Case 2 把所有需求委托给无法访问的私有 Slack channel,使任务无法仅凭 instruction 解决。
第二类是 instruction--unit test misalignment:测试套件没有忠实操作化所述 instruction,要么测试了正交功能,要么把实现特定 artifacts(包括拼写错误)编码为硬编码预期输出。
图 fig:case_study_cate2: SWE-bench-like 数据集中 instruction--unit test misalignment 的代表案例。Case 3 的测试套件与描述任务完全正交。Case 4 的测试强制执行实现细节,包括硬编码 typo,导致功能正确的解失败。
SWE 任务中的 Reward Hacking 行为¶
表 tab:hacking_behavior_families: SWE trajectories 中易受 hacking 的行为。每种行为描述 Agent 不遵循预期本地调试流程却可能获得 verifier success 的捷径通道。
| Behaviors | Definition | Observable evidence |
|---|---|---|
| Solution artifact retrieval | Retrieves or applies an explicit solution artifact, such as a PR diff, commit patch, PR-file patch field, or local gold patch. | Fetches *.patch; queries PR /files; applies copied diffs. |
| External fix lookup | Searches external sources for solution-specific metadata, including issues, PRs, commits, trackers, package archives, or web pages containing the fix. | Searches exact issue titles, error strings, project metadata, or fixing PRs. |
| Evaluation-harness tampering | Alters the evaluation harness or execution environment rather than fixing the underlying software behavior. | Modifies pytest.ini, tox.ini, CI config, dependency pins, timeouts, retries, or test selection. |
| Test-oracle tampering | Changes the oracle used to judge correctness, including tests, fixtures, snapshots, golden files, assertions, skips, or expected outputs. | Weakens assertions; updates snapshots; changes golden outputs; adds skip or xfail. |
| Visible-test overfitting | Implements behavior specialized to visible tests, fixture names, sample inputs, expected strings, local paths, or benchmark-specific conditions. | Branches on fixture names, sample inputs, expected strings, local paths, or visible test cases. |
| Evaluator-aware patching | Reasons about benchmark mechanics, hidden tests, grader overlays, or submit behavior when deciding the final patch. | Keeps or changes code because of expected grader behavior rather than local debugging evidence. |
| Repository-history mining | Uses local repository provenance to reconstruct a future fix rather than deriving it from the current codebase. | Runs git log, git grep, git log -S, tag lookup, reflog inspection, or object-database queries. |
下面的案例说明了七类高风险行为:
- 行为 1:Solution Artifact Retrieval。 Agent 直接查询 upstream PR diff,例如请求
pull/2388.diff。风险是实现 diff 直接暴露,verifier success 可能来自重放 benchmark solution,而非本地调试。 - 行为 2:External Fix Lookup。 Agent 使用精确 issue 标题或错误字符串搜索 GitHub API。风险是外部搜索可能暴露原始 issue、fixing PR、comments 或实现提示。
- 行为 3:Evaluation-harness Tampering。 Agent 修改测试 harness 或 marker 逻辑,影响哪些测试被执行。风险是 harness-level 改动可能改变评估路径,需与合法兼容性 gating 区分。
- 行为 4:Test-oracle Tampering。 Agent 在承认不能修改测试逻辑的情况下仍向 test tree 写入文件。风险是即使用作 reproducer,也可能污染 oracle。
- 行为 5:Visible-test Overfitting。 Agent 明确围绕可见测试配置和预期行为塑造实现逻辑。风险是 patch 过拟合可见测试,而非实现对未见场景鲁棒的行为。
- 行为 6:Evaluator-aware Patching。 Agent 根据预期 grader 行为决定是否保留或回滚测试变更。风险是优化目标从满足产品需求转向预判 benchmark mechanics。
- 行为 7:Repository-history Mining。 Agent 针对与 fix 相关的 PR identifier 搜索本地 git history。风险是如果 checkout 包含未来 commit 或完整项目历史,history mining 可泄露 fixing commit。
详细 Rubrics Judge Prompts¶
图 fig:default_judge_prompt: Rubrics Judge 的默认 Judge Prompt。
图 fig:strict_judge_prompt: Rubrics Judge 的严格 Judge Prompt。
Interactive Judge 消融¶
为评估 Interactive Judge pipeline 在 QwenWebBench(300 个任务)上的可靠性,我们把评估方差分解为三个来源,对应 pipeline 阶段:generation(重新运行 coding model)、rendering(重新生成 action list 并重新执行浏览器交互)和 judging(对同一 execution traces 重新评分)。我们评估两个代表模型:Claude Opus 4.7 和 Qwen3.7-Max 的中间 checkpoint(非最终发布版本),并使用 Bradley-Terry ELO rating(median model = 1500,scale = 400)作为统一指标。
设置¶
对每个方差来源,我们固定上游阶段,只改变被测试阶段:Generation variance:独立端到端运行(run 1--5),重新调用 coding model,生成新的 HTML/CSS/JS,然后重新 rendering 和 judging;Judge variance:从单个 generation 和 rendering 出发,多次请求 judge model(judge 1--5),隔离 scorer stochasticity;Render + Judge variance:从单个 generation 出发,重新生成 action list、重新执行浏览器交互并重新 judge,捕捉 action planning 和 scoring 两者噪声;Checklist-guided Render + Judge:优化变体,将 evaluation checklist 作为额外输入提供给 action planner,以实现更有针对性的浏览器交互。
结果¶
表 tab:eval-variance 总结了每个阶段造成的 ELO 波动。
表 tab:eval-variance: QwenWebBench 上 Interactive Judge pipeline 的方差分解。每行固定所有上游阶段,只改变指定组件。\(\sigma\):重复运行 ELO rating 标准差;Range:max \(-\) min。
| Model | Variance Source | \(n\) | Mean | \(\sigma\) | Range |
|---|---|---|---|---|---|
| Claude Opus 4.7 | Generation | 5 | 1523.1 | 10.4 | 24.4 |
| Claude Opus 4.7 | Judge | 5 | 1523.9 | 8.5 | 22.5 |
| Claude Opus 4.7 | Render + Judge | 5 | 1517.3 | 5.0 | 11.6 |
| Claude Opus 4.7 | Checklist-guided R+J | 5 | 1532.1 | 11.1 | 30.4 |
| Qwen3.7 Max\(^\dagger\) | Generation | 5 | 1482.3 | 2.8 | 8.3 |
| Qwen3.7 Max\(^\dagger\) | Judge | 5 | 1486.2 | 11.4 | 26.1 |
| Qwen3.7 Max\(^\dagger\) | Render + Judge | 5 | 1483.2 | 10.4 | 27.6 |
| Qwen3.7 Max\(^\dagger\) | Checklist-guided R+J | 5 | 1498.6 | 10.7 | 26.1 |
\(^\dagger\) Intermediate training checkpoint, not the final released Qwen3.7-Max.
有几个观察:
(1) 对 Claude 而言,generation 是主要方差来源。 Claude Opus 4.7 表现出中等 generation variance(\(\sigma = 10.4\),range 24.4 ELO),而下游 judge variance 较小(\(\sigma = 8.5\))。这表明,对一个解决策略多样的强模型来说,分数波动的主要来源是 coding model 本身的非确定性,而不是评估 pipeline。
(2) 对 Qwen 而言,judging 和 rendering 占主导。 Qwen3.7-Max 中间 checkpoint 的 generation 非常稳定(\(\sigma = 2.8\),range 8.3 ELO),说明代码输出更确定。但其 judge variance 显著更高(\(\sigma = 11.4\)),使 scoring stage 成为评估可复现性的瓶颈。
(3) Checklist-guided action planning 在相似方差下提升分数。 将 evaluation checklist 作为额外输入提供给 action planner,使浏览器交互更有针对性,并稳定提高 mean ELO(Claude:1532.1 vs. 未引导 re-rendering 的 1517.3;Qwen:1498.6 vs. 1483.2)。相关方差(Claude \(\sigma = 11.1\),Qwen \(10.7\))与其他 pipeline 阶段相当,说明 checklist conditioning 是有效优化,且不会引入不成比例的评估噪声。
(4) 所有方差来源都在可接受范围内。 两个模型和所有方差来源中,标准差都低于 12 ELO points,最大 range 为 30.4 points,远小于模型层级之间的差距(例如 Claude 与 Qwen 之间约 40 ELO,Qwen Max 与 Qwen3-Coder-Next 之间约 430 ELO)。这确认 Interactive Judge 能提供足够稳定的信号,用于可靠地区分不同能力水平模型,并作为训练奖励。
Trajectory-Level 数据集统计¶

图 fig:trajectory_stats: 标注数据集的 trajectory-level 统计:(a) trajectory outcome distribution,(b) user-fairness distribution,(c) 对话长度(轮数)累计分布。
本节用 trajectory-level 统计补充图 fig:signal_stats 的 round-level signal distribution,数据展现若干一致模式(图 fig:trajectory_stats)。Trajectory outcomes 分布为 partial success(57.8%)、full success(32.6%)、failure(8.6%)和 user abandonment(1.0%);对话长度呈长尾分布,50% 对话在 3 轮内结束,90% 在 8 轮内结束,自然覆盖从简单到复杂的工程场景。Round- 与 trajectory-level signals 一致:失败 trajectories 的平均每轮负向率为 60.8%,成功 trajectories 为 7.6%,形成清晰梯度,相互验证两级标注。反馈可靠:98.9% 的用户评价被判断为 reasonable,user_fairness 字段标出约 0.8% negative annotations 属于助手被“不公平责备”的情况,可在训练中降权或过滤。总体而言,数据集产生约 79,105 条 high-confidence 且 reasonable 的 negative signals,以及 9,253 个可直接用于 preference learning 的 contrastive pairs,足以支持基于人类隐式奖励的训练。
人类反馈标注示例¶
本附录给出各类标注类型的详细示例。我们按信号类别组织示例,代表案例见表 tab:positive_examples--tab:communication,trajectory-level outcomes 见表 tab:trajectory_examples:
- Positive signals(非 Turn 0 轮次的 3.5%,其中 83.6% 为 explicit):用户认可或接受助手表现。
- Execution Error(negative reasons 的 56.6%):助手理解了意图,但实现过程中出错。
- Misunderstanding(21.1%):对用户意图理解偏离。
- Omission(8.9%):未覆盖用户要求的全部内容。
- Overaction(6.3%):执行了超出用户指令范围的动作。
- Inefficiency(4.9%):用户对工作路径或响应速度不满。
- Communication(2.1%):输出格式、表达清晰度或呈现方式有问题。
表 tab:positive_examples: positive signal annotation 示例。
| Outcome | Signal Type | User Message (Summary) | Annotation Rationale |
|---|---|---|---|
| success | explicit | "Okay, please proceed with the code changes according to this plan" | Explicitly accepts the assistant's defect analysis and refactoring plan |
| success | explicit | "do it" | Explicitly accepts the updated fix plan and authorizes code modification |
| success | explicit | "yes, create a new .md" | Affirms the complete design plan and issues an execution instruction |
| success | explicit | "Option one is feasible, implement it" | Explicitly approves a plan and instructs implementation |
| success | explicit | "Verification passed, can you send me the batch rewrite commands" | Directly approves the fix plan and moves to the next step |
| success | explicit | "It can execute all the code without affecting normal work" | Direct acceptance and affirmation of the final deliverable |
| success | implicit | "First turn this workflow into a rule as the standard procedure going forward" | Behaviorally expresses approval by adopting the assistant's conclusion and requesting formalization |
| success | explicit | "Points 3 and 4 are good, please help optimize them" | Approves selected suggestions and requests optimization |
Span-KTO 超参数消融¶
Span-KTO 引入两个关键超参数:preference strength \(\beta\) 和 negative span loss coefficient \(\lambda_l\)。我们分别进行消融,并报告每种配置 4 次独立评估的平均分(avg@4)。
\(\beta\) 控制 implicit reward signal 在 policy update 上的放大,是 KTO framework 中最关键的超参数。\(\beta\) 过小会使 preference signal 太弱,模型难以区分 positive 与 negative spans;\(\beta\) 过大则导致梯度不稳定。\(\lambda_l\) 控制 negative spans 相对 positive spans 的 loss weight,这是 preference learning 中常见的正负样本不平衡问题。然而,我们的实验表明,在 span granularity 下这种不平衡并不构成问题,模型可以持续从 negative samples 中学习和改进。
表 tab:beta_ablation: \(\beta\) 对 Span-KTO 性能的影响(固定 \(\lambda_l=1.0\),2 epochs 内最佳 checkpoint)。
| \(\beta\) | SWE-bench Verified | SWE-bench Pro | SWE-bench Multilingual | Avg |
|---|---|---|---|---|
| 0.005 | 57.60 | 35.80 | 42.95 | 45.45 |
| 0.01 | 59.80 | 38.15 | 45.55 | 47.83 |
| 0.02 | 56.35 | 34.10 | 40.90 | 43.78 |
\(\beta=0.01\) 在三个 benchmark 上都取得最高分。\(\beta=0.005\) 产生的 preference signal 太弱,而 \(\beta=0.02\) 导致过于激进的 policy update;二者都不如最优配置。
表 tab:lambda_ablation: \(\lambda_l\) 对 Span-KTO 性能的影响(固定 \(\beta=0.01\),1 epoch 内最佳 checkpoint)。
| \(\lambda_l\) | SWE-bench Verified | SWE-bench Pro | SWE-bench Multilingual | Avg |
|---|---|---|---|---|
| 0.3 | 51.30 | 33.27 | 37.05 | 40.54 |
| 0.6 | 51.95 | 33.35 | 38.73 | 41.34 |
| 1.0 | 53.25 | 34.20 | 39.22 | 42.23 |
性能随 \(\lambda_l\) 单调提升:三个 benchmark 上均有 \(\lambda_l=1.0 > \lambda_l=0.6 > \lambda_l=0.3\)。这说明 span granularity 下的正负样本不平衡不需要通过降低 \(\lambda_l\) 来补偿;模型可以充分从 negative spans 中学习,而不受这种不平衡影响。
人类反馈标注 Judge Prompt¶
我们使用 Qwen 3.6 Plus 标注用户消息的情感 polarity。完整 System Prompt 和 User Prompt template 如下。此处将核心规则翻译为中文,并保留输出 JSON schema。
System Prompt¶
你是人机对话质量评估专家。你的任务是:阅读 coding assistant 与用户之间的多轮对话,逐轮识别每条真实用户回复中嵌入的奖励信号(positive、negative 或 neutral),并对整个 trajectory 给出总体评估。
核心原则:
- 严格区分
polarity和user_fairness:polarity只记录用户表达了什么;user_fairness记录评估者是否同意。polarity中不能混入评估者判断,user_fairness中不能混入用户声音。 - 评估方向性:
polarity只记录指向 assistant 的评价。用户纠正自己的错误不是拒绝 assistant;用户推进 workflow 不等于认可 assistant。当评价目标不是 assistant 时,polarity = neutral。 - 证据驱动:每条标注必须引用用户原文中的关键词或短语作为依据。
- 保守标注:信号模糊时偏向 neutral + low confidence。但保守不等于总是偏 neutral;有行为证据的隐式信号仍应标注。
- 负向优先:同一消息同时包含 positive 和 negative signals 时,
polarity = negative。
7 个字段:
polarity:用户对上一轮 assistant 表现的评价倾向,取positive|negative|neutral。confidence:high|medium|low|N/A。signal_type:explicit|implicit_behavioral|implicit_structural|N/A。negative_reason:仅当polarity=negative时填写,优先级为execution_error > misunderstand > omission > overaction > inefficiency > communication。forms_contrastive_pair:仅当负向反馈后 assistant 做出修正且修正被用户接受时为 true。user_fairness:从客观第三方视角判断用户评价是否公平,取reasonable|neutral|unreasonable|N/A。reasoning:判断依据,1--3 句,必须引用用户原文关键词。
User Prompt Template¶
Please analyze the following conversation trajectory, annotate the reward signal for each real user reply in every turn, and provide a trajectory-level assessment.
## Conversation Trajectory
{formatted_trajectory}
## Output Format
Please output strictly in the following JSON format:
{
"trajectory_outcome": "success|partial_success|failure|abandoned",
"trajectory_reasoning": "Brief reasoning, 1-2 sentences",
"turns": [
{
"turn_id": 0,
"user_message_summary": "Summary in no more than 20 words",
"reasoning": "Judgment basis citing key words from user's original text",
"polarity": "positive|negative|neutral",
"confidence": "high|medium|low|N/A",
"signal_type": "explicit|implicit_behavioral|implicit_structural|N/A",
"negative_reason": "...|null",
"forms_contrastive_pair": false,
"user_fairness": "reasonable|neutral|unreasonable|N/A"
}
]
}
Agent-as-Judge 行为 Rubric¶
我们设计了一个行为评估 rubric,用于在没有后续用户反馈时,自动评估 Agent trajectories 中六类负向行为。每类行为包含 6--9 个子项,每项按 0--4 打分(4 = 无明显问题,0 = 严重负向反馈风险)。
execution_error:交付可靠性与证据纪律¶
行为定义¶
在训练数据中,execution_error 通常对应“it still doesn't work”“still getting errors”“stuck again”等用户反馈。评估时,我们不能直接等待用户说这些话,也不应简单地把所有功能失败都归为 execution_error。该类别关注模型交付过程是否不可靠、缺少验证、忽视证据、误导性声称完成,或不负责任地处理 run/build/log 结果。
不应重罚的情况¶
模型做出合理修复尝试,清楚说明完成了哪些验证、哪些没有验证,并且没有声称完全解决。隐藏测试失败但可见上下文中没有相关线索。复杂问题只取得部分进展,但模型清楚标注剩余风险。
典型可见证据¶
trajectory 中没有验证命令,但最终回复声称“verified and passing”;test/build logs 明确失败,但模型仍总结为完成;用户要求修复某个错误,但模型没有读取或解释关键错误行,随机改代码;改动可能影响原逻辑,但最终回复没有提到风险;没有充分扫描相关代码就给出根因或改动,code review 停留表面;不支持图像/多模态输入,却基于猜测给出确定性视觉结论。
misunderstand:意图、约束和工作方式不对齐¶
行为定义¶
misunderstand 不仅表示“答案错了”,更具体地表示模型没有对齐用户真实想要的工作方式:业务约束、技术路径、范围边界、输出粒度或协作协议。
典型可见证据¶
用户要求“只改配置”,但模型写事件处理代码;用户要求“列出具体 API model IDs”,但模型只列产品 family 名;用户说“不要问,直接实现”,模型仍多轮确认;用户关注当前仓库,模型却搜索无关目录或外部项目;既定 workflow 要求先写 spec 再写 plan,但模型跳过 planning 直接改代码。
omission:需求跟踪、步骤和覆盖缺口¶
关注是否遗漏用户明确要求的文件、场景、分支、输出或验证步骤;是否遗漏边界/异常情况;是否过早结束 plan/spec/code/test/summary 闭环;是否遗漏必要工具或插件调用。
overaction:过度操作、越界与风险控制¶
关注是否只修改必要文件和逻辑;是否避免未经授权的删除、覆盖、安装、迁移、大范围重构或环境污染;是否尊重用户禁止事项;diff 是否清晰、局部且可回滚;是否尊重项目结构和约定。
inefficiency:停滞、重复与自主性不足¶
关注 tool/command 使用是否精准低噪;长耗时操作是否有状态、timeout 和 fallback;是否能自主完成可自我推进事项;方案是否简单可维护;是否主动验证和优化;是否能识别无效循环并切换方法。
communication:呈现、格式和协作控制¶
关注输出是否简洁高密度;是否匹配用户要求格式;命令、代码、步骤是否可直接复制执行;完成/未完成/风险状态是否清楚;下一步是否明确;是否延续用户先前偏好;表述和行动是否前后一致。
主类别选择规则¶
当多个类别同时低分时,主类别选择“最可能触发用户负向反馈的行为”,优先级如下:
- 如果模型执行大规模未经授权删除、覆盖、安装、迁移、大范围重构或环境污染,主类别为
overaction。 - 如果模型违反用户明确约束、业务规则、范围、粒度或技术路径,主类别为
misunderstand。 - 如果模型遗漏明确 checklist items、指定文件/场景/分支/输出/验证步骤,主类别为
omission。 - 如果模型未验证却声称完成、忽视明显日志或把失败总结为成功,主类别为
execution_error。 - 如果主要问题是停滞、重复试错、频繁提问、不透明等待或方案过于复杂,主类别为
inefficiency。 - 如果主要问题是格式、可复制性、冗长、状态报告、下一步指导或偏好连续性,主类别为
communication。
如果唯一问题是代码没有修好,但模型过程诚实、验证充分、范围克制且没有忽视可见证据,则应在此 rubric 中低强度扣分或不扣分,并注明“correctness issues are covered by other benchmarks”。
Judge 输出格式¶
Judge model 输出结构化 JSON:
{
"overall_behavior_score": 0,
"negative_behavior_label": "none|minor|moderate|clear_negative|severe_negative",
"primary_error_type": "none|execution_error|misunderstand|omission|overaction|inefficiency|communication",
"category_scores": {
"execution_error": 0,
"misunderstand": 0,
"omission": 0,
"overaction": 0,
"inefficiency": 0,
"communication": 0
},
"triggered_subcriteria": ["A2", "E1"],
"evidence": [
"Up to 5 items; must come from task, trajectory, diff, logs, tests, or acceptance checklist"
],
"short_reason": "Brief explanation; if primary issue is pure correctness, state that it is outside this rubric's main evaluation scope"
}
分数语义:4 = 无明显问题;3 = 轻微、可改进;2 = 中等风险;1 = 明确负向反馈风险;0 = 严重负向反馈风险。