27B小模型追平前沿大模型:MindForge用"无源码"环境蒸馏全生命周期软件工程能力
核心摘要
你有没有注意到一个很反直觉的现象——现在的编码智能体修bug、加功能越来越溜了,但让它从零写一个完整的程序,连最前沿的模型在ProgramBench上也只能搞定不到1%的任务?
这篇论文(arXiv:2607.27146)给出的答案是:不是模型不够强,而是训练数据缺了一整块。现有的编码Agent训练框架(SWE-Gym、SWE-Smith等)全都围绕"修改已有代码库"这个场景构建,从零造程序需要的全生命周期能力——需求推断、架构设计、实现、调试、测试、迭代优化——根本没有对应的规模化训练数据。
作者团队提出了 MindForge,一套自动化流水线:把开源命令行程序转换成"无源码"训练环境(只给编译好的二进制可执行文件和文档),然后用GLM-5.2作为教师Agent收集完整开发轨迹,再蒸馏到Qwen3.6-27B上。结果?ProgramBench平均通过率从37.98%涨到49.51%,直接超过DeepSeek V4 Pro,逼近Opus 4.7这种量级大得多的模型。更狠的是,这个提升在7个从未见过的软件工程基准测试上全部正迁移,RepoZero-C2Rust上甚至暴涨了31个点。
说实话,这篇论文最让我觉得漂亮的地方不在于最终数字,而在于它把一个"从零造程序"的评估设定,巧妙地翻转成了训练数据的生产线。
论文信息
| 项目 | 内容 |
|---|---|
| 标题 | MindForge: Teaching Small Language Models Whole-Life-Cycle Software Engineering via Source-Free Program Synthesis |
| 作者 | Yihao Chen, Shi Chang, Khaled Chawa, Feng Lin, Boyuan Chen, Shaowei Wang, Ahmed E. Hassan |
| 链接 | https://arxiv.org/abs/2607.27146 |
| 发表日期 | 2026年7月29日 |
| 领域 | 软件工程 / 编码智能体 / 模型蒸馏 |
问题动机:为什么"从零写程序"这么难?
先说清楚一个问题:现在编码Agent到底卡在哪?
过去两年,SWE-bench系列把bug修复推到了一个很高的水平,FeatBench这类基准也在feature实现上取得了不错的进展。但这些任务有一个共同前提——Agent面对的是一个已经存在的代码库,它的任务是理解上下文然后做局部修改。
从零构造完整程序完全是另一回事。Agent需要:
- 从文档和行为观察中反推完整规格说明
- 在没有任何现有实现可以参考的情况下设计架构
- 从头开始实现整个程序
- 自己定位并修复引入的bug
- 编写测试来暴露问题
- 迭代优化直到能编译通过
ProgramBench的数据很残酷:即使GPT-5.5这样的前沿模型,完整解决率也不到1%。这不是某个模型的缺陷,而是整个领域的盲区。
根本原因是什么?缺少覆盖全生命周期的规模化训练环境。现有的环境构建框架(SWE-Smith注入fault、SWE-Gym配对issue)都假设Agent能看到源代码,且只覆盖单一开发阶段(修bug或加功能)。从零造程序需要的环境——只有编译好的可执行文件和文档,没有源码——根本没人系统性地做过。
说到这里你可能会想:那直接拿开源项目来训练不就行了?问题在于数据污染。如果训练数据和评测数据的仓库有重叠,模型可能只是记住了答案而不是真的学会了能力。所以需要一个干净的、与评测集无重叠的、可复现的"无源码"环境构建流程。
这就是MindForge要解决的问题。
方法核心:MindForge的两阶段流水线
MindForge的思路其实很直观,分两大块:
第一阶段:把开源CLI程序变成"无源码"训练环境
第二阶段:在这些环境里收集并精炼完整的程序合成轨迹
环境构建:五步筛选出干净的"密室"
整个过程像是在搭建一个"密室逃脱"——Agent进去之后只能看到一个编译好的二进制文件和它的文档,必须靠观察行为来反向还原整个程序。
具体流程是这五步:
- 仓库选择:从GitHub上的awesome CLI列表中挑选候选仓库,固定commit版本,确保与ProgramBench的评测仓库无重叠
- 离线初筛:一个Explorer Agent读源码和文档,判断这个程序是否是自包含的命令行工具(不需要联网、不需要特殊硬件、行为清晰可识别)。这一步就把需要在线服务、凭证或特殊硬件的程序筛掉了
- 构建发现:Builder Agent生成一个自包含的构建脚本,能在干净checkout下成功编译。同时记录一组行为检查命令(带样例输入),用于后续验证
- 行为等价性检查:在一个全新的沙箱里重新执行构建脚本,对比两次编译产物的退出码、stdout、stderr是否完全一致。不一致就说明构建不可重现,直接丢弃
- 无源码检查:扫描编译产物中是否包含任何可读的源码泄露标记(比如路径匹配)。如果有就重新构建,还不行就直接丢弃
最终每个通过的环境输出一个Docker镜像——里面只有编译好的参考可执行文件和清洗过的公开文档,格式对齐ProgramBench的实例格式。
轨迹收集与精炼:让教师Agent"手把手"教学生
环境建好了,接下来就是让GLM-5.2作为教师Agent,在每个环境里从头开始写程序。Agent只能看到二进制文件和文档,必须独立完成从规格推断到提交可编译版本的完整过程。
这里有个关键设计决策:只保留以显式完成命令结束、且compile.sh能成功构建的轨迹。不依赖测试套件来做拒绝采样——因为在这个设定下没有明确的"成功"阈值。这意味着那些卡住、循环或从未收敛到可构建解的尝试会被丢弃,但保留了多样化的合成尝试。
收集完轨迹后,还有两道精炼工序:
工序一:基础设施噪声恢复
长程自主运行中,API错误或服务中断等瞬态故障会导致轨迹提前终止。与其丢弃这些已经跑了很久的轨迹,MindForge的做法是回滚到最后一个健康步骤,在干净环境中重放之前的所有工具调用,然后从断点恢复执行。

图2:当教师在T19步遇到沙箱崩溃时,系统回滚到T18的健康状态,在新环境中重放T1-T18的工具调用恢复状态,然后让教师从T19继续生成未完成后缀。这样长程轨迹不会因为基础设施故障白跑
这个设计的精妙之处在于:它不是简单地重试,而是精确地重建了崩溃前的所有环境状态,确保恢复后的轨迹与前半段完全连贯。
工序二:推理重写机制
这是我觉得整篇论文工程设计最细腻的地方。
强教师模型在长程运行中难免会犯工具调用错误。如果直接删除错误的turn,问题来了:教师模型经常会在后续turn的推理内容中反思自己的错误。一旦错误turn被删掉,那段反思就成了"孤儿推理"——引用了一个已经不存在的东西,读起来前言不搭后语。
MindForge的处理方式分三步:
- 检测并删除畸形工具调用的turn
- 识别后续turn中哪些推理内容引用了被删除的错误
- 用修复模型(也是GLM-5.2)重写这些孤立的推理片段,使其与修正后的轨迹连贯一致

图3:左侧展示原始轨迹中的畸形工具调用及其引发的连锁问题;右侧展示精炼后的结果——删除错误turn后,原本引用该错误的"孤立推理"被重写成连贯的后续消息。关键点是:重写只改推理文本,不动工具调用和环境响应记录
每条重写提案还要经过安全检查才能接受,确保重写忠实修复了不连贯性而非引入新内容。说到底,这套机制的核心原则是:改善叙事连贯性用于训练目的,但不篡改教师实际做了什么的事实记录。
数据规模一览
| 项目 | 数值 |
|---|---|
| 初始候选仓库 | 2,235个 |
| Explorer Agent筛选后 | 1,206个 |
| 构建发现后保留 | 1,002个(15种语言) |
| 最终用于轨迹收集 | 562个程序(6种编译语言) |
| 收集到的完整轨迹 | 1,001条 |
| 用于SFT训练的轨迹 | 973条(256K token长度过滤后) |
语言分布:Go占41.1%(231个)、Rust占37.7%(212个)、C占15.5%(87个)、C++占5.2%(29个)、Swift和TypeScript各少量。
轨迹统计:平均181.6轮对话、177K tokens,最长477轮、272K tokens。这跟现有的短程SE轨迹(95th percentile <32K context)完全不是一个量级。
更重要的是这些轨迹覆盖的开发活动广度:
| 开发活动 | 覆盖率 | 条件覆盖率* |
|---|---|---|
| 规格探索 | 99.1% | — |
| 架构设计 | 87.1% | — |
| 实现 | 99.7% | — |
| Bug定位 | 59.4% | 80.8% |
| Bug修复 | 62.6% | 85.2% |
| 验证 | 83.7% | — |
| 迭代优化 | 64.2% | 79.5% |
*条件覆盖率指在有触发条件的轨迹子集中的比例(定位/修复需要有失败触发,优化需要有可靠的成功构建触发)
注意看:规格探索和架构设计分别出现在99.1%和87.1%的轨迹中——这两个阶段在纯bug-fix训练数据中是完全缺失的。这才是MindForge数据真正独特的地方。

图4:四条来自不同语言和复杂度的真实轨迹,展示了从Explore→Design→Implement→Localize→Fix→Verify→Refine的完整开发生命周期。每条轨迹的turn数、涉及的具体活动和关键操作都被标注出来,可以看到不同程序的复杂度和开发路径差异很大
实验结果
主实验:ProgramBench上的表现
ProgramBench包含200个真实世界的开源CLI程序(FFmpeg、SQLite、PHP解释器等),涵盖Rust(107)、Go(46)、C/C++(45)、Java(1)、Haskell(1)。难度分布:28简单、143中等、29困难。评价指标是平均测试通过率(PassRate),即每个实例通过的隐藏测试用例比例的平均值——这个指标比简单的"解决/未解决"二元指标更能反映增量改进。
| 模型 | PassRate(%) | vs MindForge胜/负/平 |
|---|---|---|
| GLM-5.2(教师) | 64.60 | 36/163/1 |
| GPT-5.5 | 56.50 | 85/114/1 |
| Claude Opus 4.7 | 51.38 | 98/102/0 |
| Sonnet 4.6 | 47.97 | 90/110/0 |
| GPT-5.4 | 38.08 | 149/50/1 |
| Qwen3.6-27B(基座) | 37.98 | 152/43/5 |
| MindForge-27B | 49.51 | — |
几个值得关注的细节:
- 11.53个点的绝对提升,30.4%的相对提升——对于同架构同参数量的模型来说,这个幅度相当可观
- MindForge-27B在200个任务中有152个(76%)严格优于基座,43个(21.5%)严格劣于基座,5个(2.5%)打平。这说明提升不是靠少数 outlier 任务拉起来的,而是广泛的一致性改进
- 有5个实例的通过率超过95%,达到了ProgramBench定义的"几乎解决"标准,这个数量跟Opus 4.6持平
- 其中cmatrix实例拿到了100%通过率——在官方排行榜上,只有GPT-5.5在高推理模式下做到了这一点
跨任务泛化:7个未见基准全部提升
这是论文最有说服力的部分之一。MindForge的训练数据完全围绕"从零造程序"这个设定,但在7个完全不同的软件工程任务上都带来了显著提升:

图1:MindForge-27B相比其27B基座模型在7个未见基准、8个评估设置下的绝对提升。所有基准均未参与训练。最大提升在RepoZero-C2Rust(+31pp),DeepSWE相对提升最大(9倍)
| 基准 | 基座(%) | MindForge(%) | 提升(pp) | 任务类型 |
|---|---|---|---|---|
| RepoZero-C2Rust | 47.00 | 78.00 | +31.00 | C→Rust仓库翻译 |
| DeepSWE | 1.76 | 15.92 | +14.16 | 企业级issue解决 |
| NL2Repo-Bench(+T) | 61.27 | 71.97 | +10.70 | 自然语言→仓库生成 |
| NL2Repo-Bench(-T) | 18.92 | 23.48 | +4.56 | 无测试版仓库生成 |
| SWE-bench Pro | 45.41 | 51.34 | +5.93 | 企业级issue解决 |
| SWE-bench Multilingual | 62.55 | 67.77 | +5.22 | 多语言issue解决 |
| SWE-bench Verified | 68.80 | 73.84 | +5.04 | 已验证issue解决 |
| FeatBench | 50.10 | 55.05 | +4.94 | 功能实现 |
坦率讲,看到DeepSWE那个数字我愣了一下——从1.76%跳到15.92%,接近9倍的提升。虽然绝对数值还不算高,但考虑到DeepSWE是企业级的长程issue解决任务,这个提升幅度说明全生命周期训练确实迁移到了完全不同的任务形式上。
RepoZero-C2Rust的31个点提升也很能打。这个任务是把C代码仓库翻译成Rust,跟"从零写程序"看似不同,但说到底都需要深度理解程序行为然后重新表达——MindForge训练的"观察二进制→推断规格→重新实现"的能力在这里直接派上了用场。
行为分析:不只是分数变了,行为模式也变了
光看benchmark分数还不够。作者还做了一个很有意思的行为分析——把Agent在ProgramBench上的每一步动作分类(推理、检查、探测、编辑、构建、测试、故障恢复、提交),然后比较不同模型的操作模式:
| 指标 | Qwen3.6-27B(基座) | MindForge-27B | GPT-5.4-mini | GPT-5.5-high | GLM-5.2(教师) |
|---|---|---|---|---|---|
| 平均轮数 | 344.0 | 735.7 | 105.7 | 48.6 | 369.1 |
| 平均工具调用 | 174.4 | 373.0 | 66.8 | 25.0 | 186.6 |
| 平均峰值prompt token | 115,244 | 261,985 | 34,566 | 34,558 | 212,380 |
| 命令失败率 | 10.98% | 9.35% | 6.75% | 4.51% | 7.15% |
| 推理后编辑率 | 27.8% | 50.1% | 51.5% | 67.3% | 61.4% |
| 故障恢复后编辑率 | 31.8% | 48.8% | 37.4% | 70.4% | 64.0% |
这组数据揭示了几件事:
-
微调后模型的"耐力"翻倍以上:平均轮数从344涨到736,工具调用从174涨到373,总token消耗增加了5.7倍。这说明端到端训练鼓励了更长程的推理和持续的工作流,而不是局部的小改小补
-
尽管操作量大增,错误率反而下降:命令失败率从10.98%降到9.35%。这意味着多出来的操作不是在"瞎折腾",而是有生产力的探索
-
工具调用量甚至超过了教师模型(373 vs 186.6)。微调模型比老师还"勤快",说明它学到的不是机械模仿轨迹长度,而是一种更彻底的操作风格
-
推理→编辑和故障恢复→编辑的转化率几乎翻倍:基座模型推理完之后只有27.8%的概率会去改代码,微调后涨到50.1%;故障恢复后去改代码的概率从31.8%涨到48.8%。这两个指标衡量的是Agent把思考和试错转化为实际行动的效率——微调后明显更接近前沿模型的行为模式
还有一个细节:MindForge-27B对参考可执行文件的探测覆盖率从49.34%提升到了58.39%,说明增加的活动量确实反映了更广泛的探索,而不是重复探测同一个地方。
我的判断
这篇论文真正有价值的地方
1. 把评估设定翻转成训练管线,这个思路本身就很聪明
ProgramBench和MirrorCode之前都是用来"考"模型的——看看前沿模型能做到什么程度。MindForge是第一个系统性地把这个"无源码"设定拿来"教"模型的。这种从evaluation到training的范式翻转,在AI研究领域其实不多见,但往往能产生最大的实际影响。
2. 数据工程的细腻程度值得学习
特别是那个推理重写机制。很多做轨迹蒸馏的工作就是简单地把教师的输出拿来SFT,但长程轨迹里的噪声处理是个实打实的工程难题。MindForge不是粗暴地删掉错误turn,而是识别连锁影响、定向重写、安全检查——这套流程说明作者团队在实际跑过大量数据后踩过坑、总结过经验。
3. 泛化结果的广度让人信服
7个未见基准全部正向提升,而且覆盖了完全不同的任务类型(仓库翻译、issue解决、功能实现、仓库生成)。这比只在ProgramBench上刷分有说服力得多。尤其是DeepSWE和RepoZero-C2Rust这种跟训练设定差异很大的任务都有大幅提升,说明学到的是通用的软件工程能力而不是过拟合到特定任务形式。
需要警惕的地方
1. 教师模型GLM-5.2本身的实力是个隐含假设
整个方法的效果上限受制于教师模型的质量。GLM-5.2在ProgramBench上拿到64.60%,蒸馏后学生模型到了49.51%,中间有约15个点的gap。这个gap有多少来自蒸馏效率的限制、多少来自27B参数量的天花板,论文没有拆解。如果换更强的教师(比如GPT-5.5级别的),学生模型还能涨多少?
2. 1001条轨迹的规模不算特别大
虽然单条轨迹很长(平均177K tokens),但1001条轨迹对于覆盖6种编程语言、200+个程序来说,每个程序平均不到2条轨迹。多样性够不够?某些边缘情况是不是没覆盖到?论文提到做了活动覆盖率分析来佐证数据的丰富度,但没有做"数据量-性能"的scaling curve来回答"更多数据会不会更好"这个问题。
3. 计算成本不容忽视
MindForge-27B在200个ProgramBench实例上消耗了11.64B tokens(平均每个实例58.22M tokens),是基座模型的5.7倍。虽然效果提升了,但推理成本的增幅更大。对于实际部署来说,这个性价比需要根据具体场景权衡。
4. 与同期工作的定位差异需要厘清
NL2Repo-Bench和DeNovoSWE也在做类似的事情——从自然语言描述生成完整仓库。但它们的方法论侧重点不同:NL2Repo-Bench侧重于大规模任务构造,DeNovoSWE侧重于多阶段规划。MindForge的独特之处在于"无源码"设定和全生命周期轨迹的精炼流程。这三条路线未来可能会融合,但目前各自解决的问题确实有差异。
对工程实践的启发
如果你在做编码Agent相关的工作,这篇论文有几个可以直接借鉴的点:
- 无源码环境的构建流程可以复用到其他需要避免数据污染的场景。五步筛选(仓库选择→离线初筛→构建发现→等价性检查→无源码检查)的设计逻辑很通用
- 轨迹精炼的两道工序(基础设施恢复+推理重写)对任何做长程轨迹蒸馏的项目都有参考价值。特别是推理重写的"不改事实记录、只改叙事连贯性"原则
- 全生命周期训练信号的价值:如果你的Agent只需要做局部修改,那现有数据就够了;但如果需要从零构建或者做大范围重构,规格探索和架构设计阶段的训练信号可能是瓶颈
总结
MindForge做的事情,简单讲就是把"从零写程序"这个最难但也最有价值的软件工程能力,从"只有前沿大模型勉强能做"变成了"27B小模型经过正确训练也能做到不错水平"。它不是提出了某种革命性的新算法,而是在数据工程和训练流程上做了一套非常扎实的工作——而这恰恰是目前AI领域最稀缺的东西。
49.51%的ProgramBench得分,加上7个跨领域基准的一致提升,足以证明全生命周期软件工程轨迹的蒸馏价值。如果说SWE-bench时代教会了我们如何训练Agent修bug,那MindForge告诉我们的是:下一步,该教Agent从零造房子了。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我