你想教一个 AI 修软件,光给它看答案不够。它得反复接手真实项目、尝试改代码,再由一套可靠规则判断改对没有。问题是,这种“练习题”不只是题目,还要带代码、依赖、操作工具和阅卷系统。人工搭一套很贵,批量搭几千套更难。
CodeMidas换了一个角度:不等开发者留下工单、提交记录或现成测试,而是直接阅读开源代码,从已经实现的功能里反向制造练习。原程序既提供出题线索,也能充当参考答案。论文把这种流程做成一条由智能体参与的自动流水线,最终从3,185个开源代码库中构造出5,545个训练任务,覆盖23种编程语言和15个技术领域。
这里的强化学习(RL),可以理解为让模型反复闯关,根据成败得分,再调整做法。它最缺的往往不是更多代码,而是大量能运行、能自动判分、又不容易误判的训练环境。本文的结果全部来自论文作者报告,尚无独立复现。
把成品拆回练习题
CodeMidas首先让一个Agent——能自主查看文件、调用工具并分步行动的模型——探索代码库。它寻找具有公开入口和可观察结果的功能,例如命令行工具、输入输出明确的函数,或需要连续调用的有状态接口。
找到目标后,系统保留原始实现作为参考答案,再从给学员的代码库中移除核心实现。其余项目结构、共享组件和依赖尽量保留。模型拿到的是一个真实项目,只是其中一块功能空了,需要依据任务说明补回来。
关键在于,任务说明只规定外部可观察的行为,不限定内部写法。好比要求“输入这些数据后应返回这个结果”,而不是要求学员必须使用某个私有函数。这样,验证器——自动检查任务是否完成的程序——才有机会接受不同但同样正确的实现。
数据本身也不全是短小函数题。参考补丁的中位规模为142行,四分位区间为66至305行;65.9%的任务至少涉及两个源文件。语言分布中,Python占21.4%,TypeScript占18.3%,Go占16.2%;系统软件、Web技术和开发者工具是最大的三个领域,合计占45.6%。
先让原程序告诉你正确行为
自动出题最危险的部分,不是题目难,而是答案判错。测试太松,错误实现也能过;测试太死,又会拒绝合理的替代写法。
CodeMidas让另一个Agent从任务说明提取输入、边界条件和行为要求,再运行原始代码,记录真实输出。命令行工具通过执行命令测试,普通函数检查输入输出,有状态接口则按顺序连续调用,观察状态变化和清理行为。
系统随后逐条审查断言。若题目只要求抛出某类异常,测试就不能擅自限定异常文案;若某项检查依赖私有符号,又找不到面向行为的替代方式,整道题会被丢弃。换句话说,原实现用来提供事实,但不会被奉为唯一写法。
环境还要通过六次新容器检查:缺少目标实现的初始代码运行两次,两次都必须失败;放回参考实现后运行四次,四次都必须成功。这一步用于确认任务确实能形成稳定的“从失败到通过”。
验证器也要参加压力测试
CodeMidas没有在测试能跑通后就收工。它还让Agent主动寻找泄漏,例如残留的编译产物、缓存、安装副本或构建过程留下的文件。如果这些东西能让模型绕过真正的开发工作,任务就会被淘汰。
接着,编码Agent会对每道候选题尝试四次。审查Agent同时查看任务说明、提交代码、运行记录、验证器和参考实现,寻找两类问题:错误方案被放过,或正确方案被错杀。发现验证缺陷的任务同样删除。
最后,一个前沿模型会多次解题。若所有尝试都成功,题目可能太容易或测试太弱;若所有尝试都失败,题目可能过难,也可能说明不完整。论文并不声称能够区分原因,而是只保留既出现成功、也出现失败的任务。这个筛选看重的不是单纯难度,而是任务能否提供有区分度的训练信号。
训练后,模型不只多答对几题
研究者用这5,545个任务,通过GRPO训练MiMo-V2.5。GRPO是论文采用的一种强化学习训练方法;判分直接来自合成测试的二元结果,即通过或不通过,没有另训奖励模型。
作者在相同评测设置下比较训练前后的模型,并报告五个外部基准全部提升。其中,DeepSWE的通过率从10.0%升至21.7%,增加11.7个百分点;Terminal-Bench v2.1从63.7%升至72.2%,增加8.5个百分点。ProgramBench采用“至少通过95%测试的任务比例”作为Almost Solved指标,该分数从4.5升至21.5,增加17个百分点。五项评测覆盖代码库修复、完整程序构建、代码转换和终端操作;论文没有在正文列出其余两项的具体增幅。
规模实验还给出一个重要提醒:任务多,不等于训练效果好。高质量任务从1,000个增加到3,000个,再增加到5,545个时,DeepSWE分数依次为17.57、19.05和21.70;CodeMidas Val则依次为41.30、43.22和44.73。更值得注意的是,经过清理和筛选的3,000题,在三项对比评测上都超过了约8,000题的未筛选版本。可靠环境带来的收益,可能比机械扩充题量更大。
它学到了一种更像工程工作的节奏
轨迹分析显示,强化学习后,Agent在第一次修改代码前的阅读和搜索次数,从平均27.2次增至40.1次;最后一次修改后的不同验证命令,从2.03条增至2.53条。也就是说,它更愿意先摸清项目,再用更多方式检查自己的改动。
在同一任务和训练检查点内,主动编写并运行检查的解题轨迹,平均通过率高出4.2个百分点,95%置信区间为1.8至6.6个百分点。不过,这仍是相关性,不足以证明“多写检查”单独造成了成功。
CodeMidas真正值得关注的地方,不是又造了一个代码题库,而是把“已有软件功能”重新定义成一种可开采的训练资源。过去的流程常依赖工单、提交记录、文档或现成测试;CodeMidas只需要任务对应的源代码,就能尝试补齐题目、实验台和阅卷系统。这使训练环境的扩展不再完全受开发记录是否完整所限制。
局限与未知
- 这些结论来自单篇论文及MiMo-V2.5这一训练设置。虽然训练任务与验证集及五个外部基准的任务集合互不重叠,论文未披露训练代码库与评测项目之间更广泛的代码重叠排查,也未给出许可证筛选细节。
- 论文展示了多轮执行、对抗尝试和审查流程,但没有报告候选任务各阶段的通过率、验证器误判率,或人工核验结果,因此“可靠”到什么程度仍难量化。
- “更多高质量任务更有效”得到消融实验支持,但所谓高质量来自整套清理与筛选流程。现有实验不能精确拆出每一步分别贡献了多少,也不足以外推到所有编码Agent。