daVinci-Env:大规模开放软件工程环境合成框架 daVinci-Env: Open SWE Environment Synthesis at Scale
构建4.5万个可执行Docker环境,SWE-bench Verified达66%
前置知识
SWE Agent
软件工程Agent是一种能够自主与代码仓库交互的LLM系统,它能导航大型代码库、定位Bug、生成补丁、执行测试并根据反馈迭代修改。与静态代码生成不同,SWE Agent需要在可执行环境中运行,通过观察编译错误、测试失败等运行时行为来逐步改进解决方案。典型的SWE Agent包括SWE-agent和OpenHands等框架。
本文的核心目标是为SWE Agent提供大规模可训练环境,理解SWE Agent的工作机制和训练需求是理解本文动机的前提。
SWE-bench
SWE-bench是一个基于真实GitHub Issues和Pull Requests的软件工程评测基准。每个任务实例包含一个代码仓库快照、一个问题描述和一个验证补丁是否正确的测试套件,封装在Docker容器中。Agent需要理解问题、定位代码、生成修复补丁,并通过测试验证。SWE-bench Verified是人工验证过的子集,更具可靠性。
本文在SWE-bench Verified上取得SOTA结果,且构建的环境格式与SWE-bench兼容,是理解实验结果的核心参照。
Docker环境合成
为每个代码仓库任务自动构建一个隔离的Docker容器,包含正确的操作系统依赖、Python版本、项目依赖和测试脚本。这包括生成Dockerfile(定义容器构建步骤)和评估脚本(定义如何运行测试并判断修复是否正确)。环境合成是SWE Agent训练的基础设施瓶颈,因为每个仓库的依赖配置各不相同,手动构建不可行。
本文的直接贡献就是自动化大规模环境合成,理解这一过程的复杂性是理解本文价值的关键。
难度感知过滤(Difficulty-Aware Filtering)
并非所有合成的环境都适合作为训练数据。有些环境因为PR与Issue不对齐而不可解(如提交的补丁实际上并没有修复描述的Issue),有些则过于简单(Issue描述直接透露了解决方案)。难度感知过滤通过系统评估来识别环境的内在难度,过滤掉不可解和过于简单的实例,保留处于合适难度前沿的环境以最大化学习效率。
这是本文的核心创新之一——不仅仅追求环境数量,更注重环境质量。理解这一概念才能理解为什么OpenSWE的训练效果优于同等规模的其他数据集。
对数线性数据缩放(Log-Linear Data Scaling)
在机器学习中,模型性能与训练数据规模之间的关系通常遵循对数线性规律:即在对数坐标下,性能随数据量增加而线性提升。这意味着每增加一个数量级的数据,性能提升的绝对值大致相同。如果出现饱和现象,说明继续增加数据的边际收益递减。
本文发现OpenSWE的训练曲线呈对数线性趋势且无饱和迹象,这是支持继续扩大环境合成规模的关键证据。
研究动机
训练有能力的软件工程Agent需要大规模、可执行、可验证的环境,这些环境能提供动态反馈循环让Agent迭代编辑代码、执行测试并改进解决方案。然而,现有的开源数据集在规模和仓库多样性上都非常有限:SWE-gym仅有11个仓库、2.4k个任务,R2E-Gym仅覆盖10个仓库,即使是SWE-rebench也只覆盖约3.5k个仓库且存在环境可执行性问题。另一方面,工业级方案(如SWE-Universe)虽然实现了大规模但基础设施不公开,形成了学术研究的高门槛。更关键的是,单纯增加环境数量远远不够——从真实仓库合成的环境中普遍存在两类严重问题:PR-Issue不对齐(提交的补丁实际上并未解决描述的Issue)和过于简单(Issue描述直接泄露了解决方案),这些环境要么不可解、要么无法提供有意义的学习信号。整个项目面临规模、质量和透明度三重挑战。
本文的目标是本文的核心目标是构建OpenSWE——迄今最大的完全透明的SWE Agent训练框架。具体而言:第一,实现前所未有的环境合成规模,目标覆盖数万个可执行Docker环境;第二,确保所有构建基础设施(包括Dockerfile、评估脚本和分布式合成流水线)完全开源以实现可复现性;第三,提出质量中心的过滤流水线来表征每个环境的内在难度,过滤掉不可解和过于简单的实例,仅保留处于合适难度前沿的环境;第四,在合成环境上训练SWE Agent模型,在SWE-bench Verified上取得SOTA性能。整个项目的资源投入约为147万美元,其中环境构建约89.1万美元,轨迹采样和难度感知策展约57.6万美元。
与已有工作不同的是,本文的独特切入角度在于同时解决了规模、质量和透明度三个维度的问题。与SWE-rebench等开源替代方案相比,OpenSWE在仓库覆盖(12.8k vs 3.5k)和任务数量(45.3k vs 21.3k)上实现了数量级的提升。与工业级方案相比,OpenSWE不仅发布最终环境,还完整开源了整个合成流水线——包括多Agent系统、分布式基础设施和所有提示词模板,使得社区可以复现和改进。最关键的区别在于难度感知过滤:此前的工作主要关注环境数量的扩展,而OpenSWE首次系统性地解决了环境质量问题,通过筛选出PR-Issue不对齐和过于简单的实例,仅保留约9000个高质量环境用于训练,从这些环境中采样出约13000条精心策展的轨迹。这种"质量优于数量"的理念与数据飞轮中"数据质量决定模型上限"的共识一致。
核心方法
OpenSWE的构建方法可以用一个工厂流水线来类比:原材料是GitHub上的Pull Requests,经过多道筛选和加工工序,最终产出可执行的Docker训练环境。整个流水线分为三个主要阶段。第一阶段是PR收集和过滤:通过GitHub API从大量Python仓库中收集PR,经过四级过滤(仓库星数≥5、主语言Python、关联Issue存在、包含实质性非测试代码变更)筛选出高质量候选。第二阶段是多Agent环境合成:由四个专门的Agent协作——仓库探索Agent收集依赖和测试信息、Dockerfile Agent构建容器定义、评估脚本Agent生成测试验证脚本、测试分析Agent诊断执行结果并提供反馈,整个过程在64节点分布式集群上并行执行。第三阶段是质量中心过滤:对合成的环境进行难度评估,过滤掉不可解和过于简单的实例。这三个阶段层层递进,从原材料筛选到加工制造再到质量检验,确保最终产出的环境既大规模又高质量。
本文最核心的创新点不是简单地扩大环境合成规模,而是提出了"难度感知策展"(difficulty-aware curation)的理念。具体而言,作者识别出从真实仓库合成SWE环境时存在的两个根本性问题:PR-Issue不对齐和过于简单。PR-Issue不对齐是指提交的补丁实际上并没有修复Issue描述的问题——例如Issue要求检查完整的commit hash(40字符),但测试用例却允许前7字符通过,使得该环境本质上不可解。过于简单是指Issue描述直接暴露了解决方案——例如Issue直接指出需要修改哪个文件的哪一行,将什么字符串替换为什么,Agent只需做简单的字符串查找替换即可完成,不涉及任何推理。OpenSWE通过系统性地评估每个环境的难度来过滤掉这两类实例,仅保留处于合适难度前沿的环境。实验表明,这种策略比盲目增加环境数量更有效:仅用约9000个精选环境训练的模型就大幅超越了使用21000+个未过滤环境训练的SWE-rebench模型。这揭示了一个关键洞察:对于SWE Agent训练而言,数据质量比数据数量更重要。
方法步骤详情
OpenSWE的完整构建流程包含以下步骤。第一步,GitHub PR收集:通过REST和GraphQL API从大量Python仓库中收集PR元数据、关联Issue描述和完整代码差异。第二步,四级PR过滤:依次检查仓库星数(≥5)、主语言(Python)、关联Issue存在性和非测试代码变更,筛选出高质量候选。第三步,仓库探索:轻量级探索Agent通过browse、search、digest三个API接口收集仓库的依赖信息、测试命令和配置文件,采用成本感知策略——无失败反馈时仅做浅层检查,仅在测试分析Agent报告缺失上下文时才定向深入。第四步,Dockerfile构建:Dockerfile Agent基于探索结果生成容器定义,使用预构建的openswe-python基础镜像(覆盖Python 2.7和3.5-3.14)避免网络超时,通过本地仓库缓存注入代码避免GitHub API限流,并采用分层优化策略将稳定基础层置于前部以利用Docker缓存。第五步,评估脚本生成:评估脚本Agent生成结构化的bash脚本,包含选定和合成的测试用例、输出分隔标记和OPENSWE_EXIT_CODE退出码标记,模板化设计支持跨迭代修改。第六步,环境验证:对每个迭代执行双重验证——先应用仅测试补丁确认测试确实失败,再应用完整修复补丁确认测试通过,通过正则提取退出码标记判断验证结果。第七步,测试分析:测试分析Agent检查通过结果的真实性(防止硬编码退出码),诊断失败原因(Dockerfile配置错误、评估脚本问题或环境本身不可解),生成针对性反馈路由回相应Agent。第八步,分布式执行:在64个ECS实例上并行处理约57.2万个GitHub PR,使用文件系统消息队列实现数据并行,systemd服务实现进程管理,Prometheus+Grafana实现监控。整个构建在约两周内完成45320个验证环境。
技术新颖性
OpenSWE在技术上有多方面新颖性。首先,它首次实现了完整的多Agent环境合成流水线的开源发布——此前的工作(SWE-Universe、SWE-Factory)虽然也实现了自动化,但基础设施不公开。其次,在Dockerfile构建方面,OpenSWE引入了预构建基础镜像策略和本地仓库缓存机制,解决了大规模合成中的两个常见失败模式:网络不稳定导致的构建超时和重复重建导致的资源浪费,实测实现5倍加速。第三,评估脚本设计突破了SWE-bench的静态fail2pass范式——由于Agent可能引入新的测试用例,OpenSWE采用从零构建的结构化脚本,包含退出码捕获、输出分隔标记和补丁注入的heredoc占位符,支持可靠的自动化提取。第四,难度感知过滤是最重要的概念创新:它不是简单地用规则过滤,而是通过实际执行轨迹来表征环境难度——如果一个环境在4次采样中有2次以上被正确解决,说明它可能过于简单;如果4次都失败且测试分析Agent判定为不可解,则过滤掉。第五,分布式合成架构的设计选择(数据并行+文件系统消息队列+systemd进程管理)在容错性和可扩展性之间取得了良好平衡,使得64节点集群能在两周内完成原本需要数月的工作。
实验结果
OpenSWE的实验结果从多个维度验证了其有效性。在SWE-bench Verified上,OpenSWE-32B使用SWE-Agent scaffold达到62.4%,超越了此前所有Qwen2.5系列方法,包括使用Coder专用基座的SWE-Master-32B-RL(61.4%)和SWE-Master-32B(57.8%),提升了4.6个百分点。OpenSWE-72B使用SWE-Agent达到66.0%,超越daVinci-Dev-72B(58.5%)7.5个百分点。值得注意的是,OpenSWE使用的是通用Qwen2.5-Base而非Coder专用模型,证明高质量环境数据可以弥补领域预训练的不足。在数据缩放分析中,四个模型-scaffold配置(32B/72B × SWE-Agent/OpenHands)均呈现对数线性增长趋势,Pearson相关系数分别为r=0.972(72B CodeAct)、r=0.911(72B SWE-Agent)、r=0.893(32B SWE-Agent)和r=0.882(32B CodeAct),且在当前预算内未观察到饱和迹象。在环境来源对比中,OpenSWE在所有配置下都显著优于SWE-rebench,最显著的差距出现在32B SWE-Agent设置下(62.4% vs 50.2%,提升12.2%)。混合使用SWE-rebench和OpenSWE数据对72B模型有益(72B SWE-Agent达到68.0%,提升2.0%),但对32B模型略有下降,表明小模型对异构数据源的分布偏移更敏感。最令人意外的发现是泛化能力提升:SWE训练在HumanEval上为32B模型带来+29.09分的提升,在MATH-500上为72B模型带来+12.20分的提升,在SuperGPQA上带来+5.77到+8.10分的提升,且MMLU和TriviaQA基本不退步,证明SWE训练增强了程序性问题解决能力而不影响事实记忆。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| SWE-bench Verified | Pass@1 | 62.4% (32B SWE-Agent) | 61.4% SWE-Master-32B-RL | +1.0% |
| SWE-bench Verified | Pass@1 | 66.0% (72B SWE-Agent) | 60.6% Kimi-Dev-72B | +5.4% |
| SWE-bench Verified | Pass@1 | 62.4% (OpenSWE-32B) | 50.2% (SWE-rebench-32B) | +12.2% |
| SWE-bench Verified | Pass@1 | 68.0% (72B mixed) | 66.0% (OpenSWE only 72B) | +2.0% |
| HumanEval | Pass@1 | 90.52% (32B OpenSWE) | 61.43% (32B Base) | +29.09% |
| MATH-500 | Accuracy | 72.60% (72B OpenSWE) | 60.40% (72B Base) | +12.20% |
| MMLU | Accuracy | 83.57% (32B OpenSWE) | 83.57% (32B Base) | +0.00% |
局限与改进
本文存在若干局限性。首先,OpenSWE仅覆盖Python语言,这与现有基准的语言覆盖一致,但限制了其在多语言软件工程场景中的适用性——JavaScript、Java、Go等语言的SWE Agent训练仍缺乏类似规模的可执行环境。其次,分布式合成集群的64个节点采用标准化配置(32核CPU、128GB RAM、4TB SSD),总成本约89.1万美元,加上轨迹采样的57.6万美元,总计约147万美元,这对大多数学术研究组来说仍然是难以承受的。第三,环境构建使用DeepSeek-v3.2作为构造模型,训练轨迹采样使用GLM-4.7,这意味着环境和轨迹的质量受限于这些特定模型的能力;随着更强模型的出现,现有环境和轨迹可能需要更新。第四,难度感知过滤虽然有效,但其评估标准(4次采样中2次正确为过简单、4次均失败且判定不可解则过滤)是基于经验设定的阈值,缺乏理论依据,不同阈值选择可能导致不同质量的数据集。第五,论文未提供与Scale-SWE的直接对比——Scale-SWE报告了100k环境(开源20.2k),且Qwen3-30B-A3B在Scale-SWE上训练达到64.0%,接近OpenSWE-72B的66.0%,暗示Scale-SWE的环境质量可能也很高,但两者使用了不同系列的基座模型,难以直接比较。
独立分析的弱点
从独立分析的角度,OpenSWE存在以下弱点。第一,环境合成的可扩展性瓶颈:当前流水线依赖于LLM API调用(DeepSeek-v3.2),每个环境的合成涉及多轮Agent交互,推理成本随环境数量线性增长。虽然论文报告了对数线性数据缩放趋势且无饱和,但这仅在当前预算范围内成立;继续扩大规模可能面临成本和时间的指数级增长。改进方向是探索更轻量级的环境合成方法,例如使用规则模板处理标准化仓库结构,仅对复杂情况调用LLM Agent。第二,PR过滤标准过于粗糙:仅使用仓库星数≥5作为质量代理,而星数与代码质量的相关性并不稳定——许多低星但结构清晰的仓库可能被错误过滤,而高星但依赖复杂的仓库可能产生大量不可解环境。改进方向是引入更精细的仓库特征(如依赖图复杂度、CI配置成熟度、历史PR合入率)作为过滤标准。第三,评估脚本的合成存在固有风险:论文提到测试分析Agent会检查通过结果的真实性以防止硬编码退出码,但未报告此类作弊行为的发生率。如果Agent学会了利用评估脚本的漏洞(而非真正解决问题),将导致训练数据质量下降。改进方向是引入对抗性评估,定期用不同版本的测试脚本验证Agent解决方案的鲁棒性。第四,训练轨迹的质量筛选仅基于正确性(4次采样中1-2次正确),未考虑轨迹效率——一个需要300步才解决的问题和一个需要50步解决的问题被同等对待,但后者的训练信号可能更有价值。改进方向是引入效率指标,优先保留简洁高效的轨迹。
未来方向
基于OpenSWE的成果,未来研究可以沿多个方向展开。首先,作者观察到的对数线性缩放趋势且无饱和意味着进一步扩大环境合成规模是有价值的,未来可以将环境数量从45k扩展到100k甚至更多,特别是增加复杂度更高的跨仓库任务和领域特定任务(如BeyondSWE提出的跨仓库推理和依赖迁移)。其次,OpenSWE目前仅支持Python,将其扩展到JavaScript、TypeScript、Java、Go等语言是自然的下一步,SWE-rebench-v2已经在语言无关方向上做出了初步探索。第三,难度感知过滤可以进一步精细化——当前的方法是二元的(保留或过滤),但可以引入连续难度评分,实现课程学习(curriculum learning),让Agent先从简单环境学起逐步过渡到困难环境。第四,论文发现SWE训练对数学推理和科学知识有显著的正向迁移(最高+12分),这值得深入研究:SWE任务中的多步骤规划、调试和代码理解能力可能与通用推理能力存在更深层的联系,探索这种联系可能为训练通用推理Agent提供新思路。第五,环境合成流水线本身可以进化——当前使用固定的多Agent架构,未来可以让Agent自动学习合成策略,甚至让Agent自己设计新的评估指标和测试用例。
复现评估
OpenSWE在可复现性方面做出了显著努力。所有环境的Dockerfile、评估脚本和分布式合成基础设施均已开源在GitHub(https://github.com/GAIR-NLP/OpenSWE),这是相比SWE-Universe等不公开基础设施的工作的重大进步。论文详细记录了64节点集群的硬件和软件配置(Table 1),以及近似的10天构建成本(Table 6),为想要复现的研究组提供了清晰的资源估算。然而,完全复现仍面临挑战:第一,147万美元的总成本(89.1万构建+57.6万策展)对大多数学术组来说不可承受;第二,环境构建使用了DeepSeek-v3.2(闭源API),训练轨迹采样使用了GLM-4.7,这些模型的版本和API行为可能随时间变化;第三,分布式合成的工程细节(如文件系统消息队列的实现、systemd服务配置)虽然在论文中有描述,但完整的运维脚本和配置是否包含在开源仓库中尚不确定。总体而言,OpenSWE的可复现性在同类工作中处于领先水平,但大规模分布式系统的完全复现仍需要显著的工程和资源投入。对于资源有限的研究组,更实际的选择是直接使用OpenSWE提供的已验证环境和训练轨迹,而非从头复现整个构建过程。
论文图表
左图展示了一个PR-Issue不对齐的实例:Issue要求检查完整的40字符commit hash,但测试用例允许前7字符通过,使得补丁无法正确解决问题,环境本质上不可解。右图展示了一个过于简单的实例:Issue直接指出了需要修改的文件、行号和具体字符串替换,Agent只需做简单的查找替换,不涉及任何推理。
这两类问题是本文动机的核心——正是因为存在这些低质量环境,才需要难度感知过滤。这张图用具体实例直观展示了问题的严重性。