CodeMidas: Scaling Agentic Coding RL Environments from Code Itself —— 精读

论文链接:https://arxiv.org/abs/2609.22068

发表时间:2026 年 9 月(arXiv:2609.22068v1,2026-09-18 提交)

机构:小米 LLM Core(LLM Core, Xiaomi)+ 北京大学 + 香港大学 + 中国人民大学(🌟企业 + 高校合作,第一作者 Bowen Ye 为小米实习生,20 人团队,企业主导)

领域标签:cs.AI / 智能体编程(Agentic Coding)/ 强化学习(RL)/ 软件工程自动化


一、论文背景

1.1 什么是「会写代码的智能体」

近年来,大语言模型(LLM)正在从「补全一段函数」走向「 autonomously 完成一大块真实软件工作」——读仓库、定位问题、改代码、跑测试、提交补丁。这一类系统被称为 Agentic Coding(智能体式编程),典型代表有 SWE-agent、OpenHands 等。它们不再只是生成孤立代码片段,而是要在长周期、多步骤的软件工程任务里自主决策。

但要让这类智能体真正变强,光靠「预训练 + 指令微调」是不够的。人类程序员是在大量真实任务 + 即时反馈中成长的:写完代码跑测试,红绿灯一亮就知道对不对。智能体也需要同样的循环——这就是**强化学习(Reinforcement Learning, RL)**登场的契机。

1.2 强化学习的两个前提:多样任务 + 可靠奖励

论文在引言里点明了一个朴素但常被忽视的事实:有效的编码 RL 需要两样东西——多样的任务,和可靠的奖励(reward)。

  • 任务多样性支撑泛化能力。只在某一种形态的任务上训练,模型只会「偏科」。
  • 可靠的奖励帮助模型强化正确行为。若奖励信号经常出错(错代码判对、对代码判错),RL 不是在学写代码,而是在学「钻奖励的空子」。

一句话概括论文的核心挑战:如何把真实代码库,转化成一个**规模庞大、且每个任务都带可信验证器(verifier)**的训练任务供给?

1.3 旧路线的天花板:被「开发记录覆盖率」绑死

现有环境合成流水线,几乎都从**开发记录(development artifacts)**里「考古」:有的从 issue / PR / commit 提炼任务(直接搬或模型改写);有的围绕已有测试合成故障;有的用文档规定功能。

它们的共同死穴是:任务种类被「历史上被记录的变更 / 测试 / 文档」覆盖范围死死绑住。只有「恰好有人提过 issue、写过 commit、补过测试」的功能才能变成任务,仓库里大量「已实现却从未被记录」的功能被白白浪费。

1.4 一个通俗类比:把「教科书答案」变成「练习题」

想象你是老师,想给学生出大量编程练习题。旧路线是翻学校的「错题本」和「改作业记录」——只有学生曾经做错、老师曾批改过的题,你才拿得出答案和判分标准,题量永远受限于「历史上发生过哪些错」。

CodeMidas 的思路则是:拿起一本写满正确答案的教科书,把「已解例题」反过来变成练习题——撕掉解答、只留题目与「标准答案应由哪些行为判定」,让学生重写。教科书覆盖海量知识点,题量瞬间爆炸,且不依赖任何「错题本」。这正是 CodeMidas 的核心直觉:已实现的源代码,既是「任务」蓝本,又是「参考答案」来源,还是「测试该判什么」的证据,让任务供给从「开发记录覆盖率」中解放出来。


二、论文定位和关联工作

2.1 环境合成的谱系

把「开源代码 → 可执行的编码 RL 环境」这件事,学术界已经摸索了几年。按「任务从哪儿来」可以梳理出一条清晰的谱系:

阶段代表工作任务来源语言关键局限
基准奠基SWE-bench (Jimenez et al., 2024)真实 GitHub issue + 参考 patchPython需要 issue/PR + 可复现环境,数据稀缺
环境即训练场SWE-Gym (Pan et al., 2024, arXiv:2412.21139)真实 Python 任务实例(含可执行环境 + 单元测试 + NL 描述)Python依赖人工撰写的 issue 与测试用例
程序化合成R2E-Gym (Jain et al., 2025, arXiv:2504.07164)从 commit 经测试生成 + 反向翻译合成1(Python)仍需 commit 作为种子;验证器有「低区分度 / 测试毒性」问题
故障注入式扩量SWE-smith (Yang et al., 2025, arXiv:2504.21798)在仓库里注入会打破现有测试的 bug1(Python)仅 Python;受限于仓库测试覆盖率
文档 / 测试驱动SWE-Flow、SWE-Hub、R2E、MindForge单元测试 / 文档 / docstring1–15仍需文档或测试作为输入
本文CodeMidas源代码本身(唯一输入)23需 agentic 流水线构造与多层过滤

SWE-Gym(ICML 2025)是首个用于训练真实 SWE 智能体的环境,含 2,438 个真实 Python 任务实例(可执行运行时 + 单元测试 + NL 描述),证明「可执行环境 + RL」能带来高达 19% 的绝对提升,但任务仍依赖人工撰写的 issue 与测试。

R2E-Gym(COLM 2025)用 SWE-Gen 从 commit 自动生成测试并反向翻译成自然语言,产出 8.1K 环境,把对人工 issue/测试的依赖降到最低;但仍以 commit 为种子、语言单一。其验证器分析更揭示了执行式验证器的两大顽疾:低区分度(常仅约 20% 测试能分辨好坏补丁)与测试毒性(错补丁通过、对补丁失败)——恰是 CodeMidas 后过滤要消灭的对象。

SWE-smith(NeurIPS 2025)则反过来:先给任意 Python 仓库搭好可执行环境,再批量注入会打破现有测试的 bug,造出 50K 实例。其洞见是「执行验证既能判答案,也能筛候选 bug」,且「存活率(yield)比注入量更重要」——与 CodeMidas「质量 > 数量」同气连枝。但它局限 Python,且任务须「打破已有测试」,受仓库测试覆盖率封顶。

2.2 定位结论:唯一「五项全免」的路线

下表(对应论文 Table 1)把 CodeMidas 与代表性流水线放在一起对比,看它们各自是否需要某种开发记录作为输入。✓ 表示「不需要」,✗ 表示「必需」,♦ 表示「部分需要」。

方法无需 issue无需 PR无需 commit无需已有测试无需文档描述语言数
SWE-rebench V2♦✗✗✗✓20
daVinci-Env✗✗✗✗✓1
R2E-Gym✓✓✗♦✓1
SWE-smith✓♦♦✗✓1
SWE-Flow✓✓✓✗✓1
SWE-Hub✓✓✓✗♦11
R2E✓✓✓✓✗1
MindForge✓✓✓✓✗15
CodeMidas✓✓✓✓✓23

可以看到,所有前人方法至少在 issue / PR / commit / 已有测试 / 文档中的某一项上是必需的,而 CodeMidas 五项全免——它只用源代码本身作为输入,把行为化任务描述与「由执行奠基的测试」推导出来,从而绕开了开发记录的覆盖边界。语言覆盖上,CodeMidas 的 23 种也显著高于他人的 1–20 种。


三、问题定义

3.1 从具体场景到抽象问题

CodeMidas 面对的具体场景是:手头有一个开源代码库,里面已经实现了某个功能。 论文要回答的是——能不能把「这个功能」本身,变成一个供智能体学习的 RL 环境?

抽象掉所有外部信息后,问题的本质是:

给定一段「已实现功能」的源代码,构造一个训练任务,使得:智能体能在「被挖掉该功能」的代码库起点上,重新把它实现出来;且存在一个隐藏验证器,能二值地(通过 / 不通过)判定智能体的实现是否正确。

形式化地说,一个任务由四元组构成:

  • S(任务陈述):说明输入、可观测行为、必须提供的公开接口;
  • C’(起点代码库):把目标功能的核心实现移除后,仍保留项目结构与依赖的「半成品」;
  • R(参考解):被移除的原始实现,保留作标准答案;
  • V(隐藏验证器):在评分时才注入,对提交的实现返回二值奖励 0/1。

三个约束条件:

  1. Fail-to-Pass:起点代码库 C’ 在 V 下必须失败(功能被挖掉,自然通不过);
  2. 参考解通过:参考解 R 在 V 下必须通过;
  3. 替代实现可接受:验证器只检查「行为」,不绑架「内部实现」——智能体换一种正确写法也应通过(论文引用了 Oracle Problem 与 EvalPlus 的教训:测试若绑定私有符号或措辞细节,会误杀正确解)。

3.2 类比表:教科书例题 → 练习题

教科书世界CodeMidas 世界
一道已解例题代码库中一个「已实现功能」
撕掉解答、留下题目移除核心实现,得到起点代码库 C'
标准答案原始实现 R(参考解)
判分标准(看行为而非步骤)隐藏验证器 V(看执行行为)
学生重做例题智能体在 C’ 上重新实现功能
「做对了」= 行为符合预期V 返回 1(通过)

这个抽象之所以精妙,是因为它把「有没有开发记录」这个外部条件彻底剥离,只抓住一个可验证的结构:原始代码既提供任务,又提供参考解与测试依据。只要一个代码库「功能已实现且行为可观测」,它就能成为训练素材——这正是规模化得以成立的根本原因。


四、问题解法

CodeMidas 是一条 agentic 流水线:在环境构造的每一个阶段都投入 agent 算力——探索功能、写测试、跑一致性、做后过滤。整体是一个四模块漏斗,候选任务数从 22,575 → 16,027 → 12,746 → 11,930 → 8,173 → 5,545 逐级收窄(见图 1 金字塔)。

4.1 模块一:任务设计与代码库适配(22,575 → 16,027)

一个 agent 检视代码库结构与构建元数据,识别「有公开入口、有可观测结果」的功能,优先选需要跨代码库推理的任务(CLI 工具、纯库函数、有状态库 API 都支持)。

对每个候选,agent 追蹤公开入口与共享依赖划定任务范围;然后移除核心实现,调整剩余代码形成连贯的「待实现起点」。任务陈述与代码边界一起修订,共享组件与项目上下文保留;原始实现单独留存作参考解。陈述只规定「输入、可观测行为、要求的公开接口」,内部实现完全交给求解者自由发挥——这正是 3.1「替代实现可接受」的工程落点。

4.2 模块二:由执行奠基的测试构造(16,027 → 12,746)

这一步类比「根据标准答案反推判分要点」:agent 把行为要求映射到测试输入与边界情形,在参考代码副本里调用公开入口、记录真实结果。测试按接口形态分三类:CLI 用命令执行、纯函数用输入输出对、有状态 API 用调用序列(含顺序与清理)。

关键设计是**「只测该测的」**:

  • 陈述已固定的输出/性质,用参考执行确定期望值;
  • 陈述未规定的方面,只断言「陈述要求的约束」——如只要求抛某类异常,不绑定未规定的错误消息措辞;
  • agent 逐条审查断言,把「依赖私有符号、固定措辞、偶然顺序」的过度约束替换为行为化检查;若某断言只能依赖私有符号且无行为替代,整个任务被拒。

4.3 模块三:环境准备与执行一致性(12,746 → 11,930 → 8,173)

从统一基础镜像出发,agent 安装依赖、准备构建与运行时资源。清理环节会删除任何可能泄露被删实现的产物:编译输出、缓存副本、构造 agent 留下的文件,以及和目标功能相关的原始测试——只保留完成实现所需的包、夹具与构建包装。

随后是论文的招牌检查——执行一致性(Execution Consistency):每个任务在训练运行时设置下,用 6 个全新容器检验:

  • 2 个「起点代码库」容器:必须都失败(功能确实被移除);
  • 4 个「参考解在位」容器:必须都通过(参考解确实正确);

任一起点通过、或任一参考解失败,任务即被筛除。重复四次参考解运行,是为了筛查不稳定的执行结果(flaky execution)。这一关把候选从 12,746 砍到 8,173。

4.4 模块四:Rollout 后过滤(8,173 → 5,545)

执行检查只覆盖「起点」与「参考解」两端。在 RL 训练之前,CodeMidas 再用 agent 的真实 rollout 及其结果做三重过滤——这是本文保证「奖励可靠」的灵魂所在:

  1. 泄漏过滤(Leakage filtering):对抗式 rollout 中,一个 agent 试图专找残留泄漏来白嫖答案——翻遍 solver 可见的整个环境(编译产物、缓存、构造 agent 遗留文件、已安装项目副本),记录疑似利用泄漏的命令与输出。另一审查 agent 拿证据对照参考解与验证器,若确认泄露材料能绕过「本该做的开发工作」,任务被拒。
  2. 解题一致性审计(Solution audit / FP-FN 审计):编码 agent 对每个任务尝试 4 次,审查 agent 结合提交代码、测试输出、任务陈述、验证器与参考解,判断实现是否满足陈述,并标记假阳性(FP,判错却通过)与假阴性(FN,判对却失败)。凡验证器有缺陷的任务被拒。
  3. Rollout 结果过滤(Outcome filtering):前沿模型对每个任务尝试若干次并计分。全通过或全失败的任务不揭示有效学习信号(可能太简单、太难,或测试/陈述有缺陷),只保留「既有成功又有失败」的任务。

三重过滤后,剩 5,545 个高质量任务。

4.5 全景表

模块核心动作输入→输出 数量解决的风险
① 任务设计agent 探索功能、挖空实现、写行为化陈述22,575 → 16,027任务范围不清、无参考解
② 测试构造参考执行奠基、行为化断言审查16,027 → 12,746测试绑定实现/措辞(FN)
③ 执行一致性6 容器(2 失败 + 4 通过)12,746 → 11,930 → 8,173起点未失败 / 参考解不稳定
④ Rollout 后过滤泄漏探查 + FP/FN 审计 + 结果过滤8,173 → 5,545奖励泄漏 / 验证器错判 / 无信号

最终数据集来自 3,185 个代码库,横跨 23 种语言、15 个技术领域;参考解中位 142 行,65.9% 的任务 touching 至少两个源文件。语言上 Python(21.4%)、TypeScript(18.3%)、Go(16.2%) 居前;领域上系统软件(17.4%)、Web(14.6%)、开发者工具(13.6%) 居前。


五、评估指标与实验证据

5.1 实验设置

底座模型是 MiMo-V2.5(小米),在 5,545 个 CodeMidas 任务上用 GRPO(Shao et al., 2024)训练,奖励为二值执行结果(0/1),batch size 32、每任务 32 次 rollout。评估用五个外部基准,且训练集与五个基准及 CodeMidas Val(200 任务)均不相交——避免数据污染。

五个基准覆盖四类软件工作,指标如下(除 ProgramBench 报 Almost Solved 即「至少 95% 测试通过」的比例外,其余均报通过率 pass rate):

基准任务类型初始策略CodeMidas RL提升 (pp)
SWE-bench Pro长周期 issue 修复50.3%54.4%+4.1
DeepSWE v1.1issue 修复10.0%21.7%+11.7
ProgramBench整程序从零构建4.521.5+17.0
RepoZero C2Rust代码翻译(C→Rust)40.5%51.8%+11.3
Terminal-Bench v2.1命令行终端工作63.7%72.2%+8.5

5.2 这些数字为什么能证明论点

论文的核心主张是:「用源代码本身构造的任务,能为多样化软件工作训练出更好的编码智能体」。五基准的全面提升(且跨越 issue 修复、整程序构建、代码翻译、终端工作四种形态)正是这一主张的直接证据——它不是在某一个窄基准上刷分,而是跨任务形态的迁移。尤其是 DeepSWE +11.7pp、ProgramBench +17pp 这种「从很低起点大幅跃升」,说明 CodeMidas 任务补上了初始策略在「从零实现 / 复杂构建」上的短板。

5.3 「质量 > 数量」的消融:为什么它最能支撑论点

作者设计了四个训练池,配置完全相同,只改任务池:

  • 1k / 3k / 5k(高质量):从 5,545 中随机取 1k、3k,以及全集 5k;
  • 8k(vanilla):在过滤清洗之前采约 8,000 个任务(有陈述、环境、验证器,但未经执行一致性检查与三重后过滤)。

结果(见图 7、图 8):

训练池SWE-bench ProDeepSWECodeMidas Val
1k52.8617.5741.30
3k54.0219.0543.22
5k(高质量)54.4021.7044.73
8k(未清洗)53.8117.1140.24

两个关键结论:

  1. 高质量池随规模单调提升:1k → 3k → 5k 在三项上依次升高,支持「扩大高质量数据有用」。
  2. 质量压过数量:5k 高质量池在三项上全面超过 8k 未清洗池(分别 +0.59 / +4.59 / +4.49 pp);甚至 3k 子集也在三项上全部击败 8k 未清洗池(如 DeepSWE 19.05 vs 17.11)。

此消融控制了一切变量,只隔离出「清洗 + 执行一致性 + 后过滤」的贡献,证明 CodeMidas 的提升不是靠堆量,而是靠过滤带来的环境可靠性与训练适宜性——这正是「质量 > 数量」主张的实验支点。

5.4 行为层面的佐证

除分数外,作者还分析了 RL 过程中智能体行为的演化(CodeMidas Val 早期 vs 晚期 rollout,见表 2):

行为度量早期晚期变化
代码库探索首次编辑前的 read/search 调用27.240.1+12.9
代码草拟草拟比(写入代码先在推理中出现的比例)0.3580.629+0.271
自我验证编辑后不同的验证命令数2.032.53+0.50

这些行为变化在 SWE-bench Pro、ProgramBench、Terminal-Bench 等分布外任务上同样出现,说明是泛化改变而非过拟合。更关键的是:同一任务同一检查点下,agent 自己写并执行的验证检查,通过率比不写的高 4.2pp(95% CI 1.8–6.6)——为「自我验证有效」提供了因果关联证据。


六、效果优势的根源解释

6.1 因果链:不是「凑巧好」,而是「结构上必然更好」

为什么 CodeMidas 能在上述指标上压过 baseline?我们沿机制建立一条可验证的因果链(标注证据来源):

题源去绑定(用源代码而非开发记录作输入)→ 任务供给与多样性大幅扩展(23 语言、15 领域、3,185 库,覆盖「未被记录为 issue/bug」的功能)【论文实验已支持】→ 但扩展同时引入两类风险:(a) 残留泄漏让 agent 不写代码也能通过;(b) 测试过严/过松造成 FP/FN,使奖励信号失真【论文实验已支持:三重过滤的必要性】→ 四模块过滤逐层消灭这些风险(6 容器一致性 + 对抗泄漏探查 + FP/FN 审计 + 结果过滤)【论文实验已支持:5k > 8k 消融】→ 留下「干净二值奖励」(fail-to-pass 一致 + 泄漏探查保证奖励可靠)【论文实验已支持:GRPO 在该奖励下全面提升】→ GRPO 有效信号密度提高,模型学到的是「真实实现能力」而非「钻空子」→ 跨基准提升 + 行为正向演化。

其中最关键的一环是奖励可靠性:当验证器既不漏(不泄露答案)、又不假(少 FP/FN),二值奖励才真正对应「实现是否正确」,GRPO 的梯度才指向正确行为。

6.2 外部检索与对照(交叉验证)

为防「只凭本文自证」,我们检索了相似尝试与相近结论。下表汇总:

研究(可核验链接)相似尝试相关结论与本文的差异 / 适用边界对根源解释的影响
SWE-Gym (arXiv:2412.21139, ICML 2025)首个可执行 SWE 训练环境「可执行环境 + RL」带来显著增益,但任务依赖人工 issue/测试题源仍绑定开发记录;规模 2,438支持「任务+可靠奖励」范式;反衬 CodeMidas 题源去绑定的突破
R2E-Gym (arXiv:2504.07164, COLM 2025)从 commit 合成环境 + 混合验证器执行式验证器存在「低区分度(~20% 测试能分辨)」与「测试毒性」其缺陷恰是 CodeMidas 后过滤要消灭的对象;但仍需 commit强支持「FP/FN 是真实顽疾」,支持审计/过滤设计必要
SWE-smith (arXiv:2504.21798, NeurIPS 2025)注入 bug 批量造 50K 任务提出「yield(存活率)比注入量重要」;但仅 Python、受测试覆盖率封顶题源依赖已有测试、语言单一;CodeMidas 用执行反推测试、扩到 23 语言支持「质量/存活率 > 原始数量」,与 3k > 8k 同气连枝
Rajan (2026) 等 / 「When the Reward Suite Is Leaky」(arXiv:2607.11022)审计部署中的代码 RL 验证套件SWE-bench Verified 与 R2E-Gym 中 25–28.5% 任务接受错误补丁;FP 给错代码「发奖励」聚焦「已部署套件天然 FP」,与 CodeMidas 构造期主动审计方向一致强支持「验证器错判普遍存在」,FP/FN 审计直击此痛点
EvalPlus (Liu et al., 2023,本文引用)扩展测试暴露生成代码的隐藏缺陷原测试通过不代表正确;更强测试能抓出漏掉的错误程序关注「评测侧」覆盖;CodeMidas 在「构造侧」做行为化断言审查支持「测试需覆盖行为而非表面」,呼应 4.2

综合判断:

  • 多项研究共同支持的机制:①「任务 + 可靠奖励」范式本身有效(SWE-Gym);②执行式验证器的 FP/FN 与泄漏是真实、普遍的顽疾(R2E-Gym、Rajan/leaky-reward 审计);③「质量 / 存活率比原始数量更重要」(SWE-smith 的 yield 原则 + CodeMidas 3k > 8k)。三条共同支撑因果链,尤其「过滤带来的奖励可靠性」是优势根本来源。
  • 仍属合理推测的环节:CodeMidas 的「agentic 逐阶段算力投入」相比「更便宜的自动化流水线」是否必然更优,未做成本对照,属工程权衡开放问题;23 语言覆盖在非 Python 任务上的独立增益也需更细语言级消融。
  • 优势成立条件与可能失效:优势建立在「代码库有可观测行为、能跑参考执行」前提下;对行为难观测、缺乏可运行测试基建的冷门语言/领域,构造成本与验证可靠性会下降。若下游任务与训练分布差异过大,迁移增益也会衰减(行为泛化证据主要来自同属软件工作的基准,跨域到非软件任务仍是推测)。

七、必要知识反推

假设让一个「零基础」的人重做 CodeMidas,他最少必须掌握哪些知识?我们按层次反推:

7.1 领域知识层(不做就寸步难行)

  • 软件工程基本运作:代码库、commit、issue、PR、单元测试、构建与依赖——否则无法理解「开发记录」为何曾是任务来源。
  • RL for code 的本质:GRPO / RLVR(可验证奖励的 RL)原理,及「为何二值执行奖励能替代奖励模型」。不理解这点就无法设计 0/1 奖励。
  • Oracle Problem(测试预言问题):Barr et al. 经典综述——「怎么知道输出对不对」本身很难,是验证器设计的理论地基。

7.2 方法论知识层(决定方法高度)

  • 环境合成谱系:SWE-bench → SWE-Gym → R2E-Gym → SWE-smith 的演进,尤其「从收集到制造数据」的范式转变(SWE-smith 的 yield 原则)。
  • 验证器失效模式:低区分度、测试毒性、泄漏、FP/FN——来自 R2E-Gym 与近期审计工作的实证。
  • 行为化测试设计:只断言「陈述规定的行为」,避免绑定私有符号/措辞(EvalPlus 的教训)。

7.3 工程知识层(把方法跑通)

  • 容器化与可复现环境:Docker、依赖安装、构建包装,及「清理泄露产物」细节(编译输出、缓存、安装副本)。
  • Agent 编排与 rollout 基础设施:驱动 agent 探索、并发跑 6 容器一致性、做对抗 rollout 与审查。
  • 评估防污染设计:训练集与所有基准不相交,否则增益可能是数据泄露的假象。

7.4 知识融合的关键节点

真正的创造性不在任何单点,而在两个融合处:

  1. 「源代码即任务+答案+判据」的三位一体洞察——把领域知识(代码已实现即含答案)与方法论(可执行验证)焊接,才诞生「挖空实现 + 参考执行奠基测试」的构造法。
  2. 「把验证器当成被审计的对象」——把 RL 方法论(奖励可靠性决定训练成败)与工程审计(对抗探查 + FP/FN 审查)融合,催生了模块三 + 模块四的双重保险。

八、论文中可以提取的通用性灵感

CodeMidas 不止是一篇「编码 RL 数据工程」论文,它埋着几条可迁移到更广领域的普适原理:

8.1 「点码成金」:存量资产即训练矿藏

  • 核心思想:任何「已经做对了的产物」,都能反向变成「训练做这件事的能力」的原料——只要剥离答案、保留判据。
  • 论文证据:5,545 个任务全部来自「已实现功能」,无需任何开发记录。
  • 推广场景:用已部署的机器人策略反推控制任务、用已写好的 SQL/报表反推数据分析、用已证定理反推证明题、用已标注设计稿反推 UI 生成。

8.2 质量 > 数量:过滤比堆量更值钱

  • 核心思想:RL / 自监督数据里,经筛选的少量高质量样本可胜过数倍未筛选样本——错误奖励的代价远高于少几个样本。
  • 论文证据:3k 高质量子集全面击败 8k 未清洗样本;与 SWE-smith 的 yield 原则呼应。
  • 推广场景:数学 RLVR 中先过滤「答案可猜」的题;指令微调里去重 + 难例筛选;任何自动验证做奖励的场景都先审计验证器。

8.3 对抗性自我审计:让系统自己找自己的漏洞

  • 核心思想:交付训练前,用 adversarial 视角主动试探「能不能不干活就过关」,剔除漏洞样本。
  • 论文证据:泄漏过滤用对抗 rollout 专找残留泄露;FP/FN 审计让审查 agent 挑验证器的错。
  • 推广场景:评测集防泄漏自查、自动出题的「可作弊性」检测、任何把关系统内置「红队式自审」。

8.4 把验证器当「老师」而非「打分机」

  • 核心思想:验证器应只评判行为、包容正确但不同的实现——关系模型学的是「本质能力」还是「凑格式」。
  • 论文证据:行为化断言审查(不绑定私有符号/措辞)使替代正确实现也能通过。
  • 推广场景:代码 review 评「是否满足契约」而非「是否像参考」;教育判分评「思路正确」而非「步骤一致」。

8.5 跨分布的行为泛化,才是真泛化

  • 核心思想:能力证据不只看分数,还要看行为是否朝正确方向演化,且在分布外任务上复现。
  • 论文证据:探索↑、自我验证↑在 SWE-bench Pro / ProgramBench / Terminal-Bench 上普现;「agent 自写验证」与更高通过率相关。
  • 推广场景:评估智能体应报告「探索/反思/自检」等行为指标,而非只报成功率。

小结:CodeMidas 用「源代码即唯一输入」这一设定,把编码 RL 环境的供给从「开发记录覆盖率」中解放出来,以一套 agentic 的「构造 + 对抗审计」流水线保证奖励可靠性。其启示不止于代码:在一切「已有正确答案」的领域里,把存量资产点石成金、用质量对抗数量、让系统自我审计,都是可复用的放大范式。