如果说训练 AI 写代码的最佳素材不是精心设计的题库,而是 GitHub 上那些真实的、带血的 bug 修复记录,你会不会觉得反直觉?最近亮相的 SWE-gen 干的就是这事儿:把开源项目里已经合并的 Pull Request(PR)逆向工程,改造成一个个标准的编程任务,让 AI Agent 在真实的历史坑里摸爬滚打。

这听起来或许有些「损」——好不容易修好的 bug,干嘛要故意弄坏?但仔细琢磨,逻辑其实挺扎实。人工设计的编程题往往过于简洁、边界清晰,跟真实开发场景脱节。而真实的 PR 自带完整上下文:有明确的 bug 描述、有验证用的测试用例、有经过评审的解决方案,堪称完美的教学案例。SWE-gen 做的,只是把这条「解决方案」反转为「题目」,把「bug 修复」反转为「待修复状态」。

这套工具的核心流程像个精密的流水线。拿到一个目标 PR 后,它先用 GitHub API 抓取元数据,克隆仓库,然后 反向前缀 —— 把 PR 里的代码改动打包成 bug.patch,打回代码库,瞬间让项目回到「带 bug 的祖传屎山」状态。与此同时,测试文件被单独拎出来,放在 task/tests/ 目录,防止 AI 作弊篡改。接着,系统生成 Dockerfile 和测试脚本,但留好 TODO 占位符,召唤 Claude Code 来填空。Claude Code 会分析整个仓库,自动识别项目语言、构建系统、测试框架,把 Dockerfile 补全成可独立运行的环境。最后,系统用两个 Agent 做 双代理验证:一个 NOP 代理啥也不干,验证测试在 bug 版本上必定失败;一个 Oracle 代理直接打上官方补丁,验证测试必定通过。只有两者都达标,任务才算合格。

这套机制筛掉了大量水货 PR。它只收录修改 3 到 10 个源文件、有配套测试、有实质代码改动(非纯文档、非格式化、非版本号 bump)的 PR。更狠的是,它用 LLM 评估 PR 的「实质性」,避免生成太简单的任务。当然,你也可以绕过这些检查,用 --no-require-minimum-difficulty 放飞自我。

用起来也简单粗暴。单点爆破某个 PR:

swegen create --repo axios/axios --pr 7150

或者对整个仓库发起「薅羊毛」攻击,把历史 PR 全处理了:

swegen farm fastapi/fastapi

farm 命令支持断点续传,能指定从某个日期开始,还能跳过已处理的任务。处理结果默认丢进 tasks 目录,每个任务包含 bug.patchfix.patchtask.json(元数据和指令)以及 tests/ 目录。生成的任务与 Harbor 框架无缝衔接,直接就能喂给 AI Agent 开练。

2026 年 1 月刚发布的 SWE-gen-JS 已经搞出了 1000 个 JavaScript/TypeScript 任务数据集,说明这套方法论确实能规模化。

这事儿让人联想到其他「从历史数据挖矿」的技术思路。比如软件工程领域的 缺陷预测,用历史 bug 数据训练模型预测新代码的脆弱模块;或者 API 推荐系统,从开源代码里学习惯用法。但 SWE-gen 更激进 —— 它不只是分析历史,而是把历史 重建成可交互的沙盒。这有点像把战争片翻拍成演习剧本,让士兵在真实地形上复盘每场战斗。

当然,吐槽点也不少。最显眼的是 成本:默认用 Claude Code 填 Skeleton,还要跑多次 Agent 验证,Token 消耗和计算时间都不便宜。尽管支持 Docker、Daytona、E2B、Modal 等多种沙箱环境,但配置过程依然存在技术门槛。环境变量里要填 GITHUB_TOKEN、OPENAI_API_KEY、ANTHROPIC_API_KEY,云沙箱还要额外 API 密钥,普通开发者光配置就得喝一壶。

另一个潜在问题是 任务质量的不确定性。尽管有双代理验证,但真实 PR 的复杂度千差万别。有些 bug 依赖特定外部环境、网络调用、甚至时序问题,在 Docker 里未必能稳定复现。swegen analyze 命令虽然能跑多次试验并分类(GOOD_SUCCESS、BAD_SUCCESS、GOOD_FAILURE、BAD_FAILURE 等),但这本身又消耗更多资源。而且,用 LLM 评估 PR「实质性」这招虽然聪明,但黑箱评估可能错杀一些看似简单实则微妙的边界情况。

还有一个微妙点:数据污染。如果训练用的任务来自公开开源项目,那这些项目本身可能已经出现在大模型的预训练语料里。Agent 可能不是「学会」了修复 bug,而是「记得」了原 PR 的改动。虽说测试文件在运行时才拷贝,能防直接抄答案,但语义层面的记忆很难彻底规避。

话说回来,SWE-gen 的价值在于它建立了一个 可扩展的真实任务生成范式。与其人工设计题目,不如从开源历史的富矿里自动化挖掘。这种方式生成的任务自带 多样性和实战气味 —— 不同的项目结构、不同的构建工具、不同风格的测试用例,远比手工题库贴近现实。对于研究 AI 软件工程的人来说,这简直是数据生产的「挖矿机」。

从更宏观的角度看,SWE-gen 代表了一种趋势:AI 训练数据的生产正在从「人工编纂」转向「自动化历史挖掘」。当真实世界的数字痕迹足够丰富,算法化的数据采集和清洗往往比人工设计更高效、更接地气。只是这条路走下去,我们得警惕 数据质量评估可靠性 的双重陷阱 —— 毕竟,从历史里挖出来的不只是宝藏,也可能是坑。

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐