数据截至 (上游 commit 9b74ac08118a)
Issue 生成、巧妙之处与边界
验证后的 bug 已经是合格练习题,但还缺一样东西:题面——一段像真人报的 GitHub issue。本章讲怎么用 LLM 反写 issue,然后收束全项目的精华、边界与横向对比。
1. Issue 生成:给 bug 配一段「报错描述」
1.1 要解决的小问题
SWE-agent 训练时,agent 看到的是「一段 issue 文字」,要据此定位并修 bug。但 SWE-smith 的 bug 是机器造的,没有自带 issue。所以要反过来:已知 bug 和它弄挂的测试,让 LLM 写出一段听起来像用户/开发者报的 bug 描述。
1.2 思路与输入
issue_gen/generate.py 的 IssueGen.generate_issue(:307)给模型三类材料:
- system prompt + few-shot 示范:从 SWE-bench Verified 真实 issue 里随机抽几条当范例(
get_demo_issues,:296),让生成的 issue 风格逼真。 - 失败测试的输出:从验证日志里截出测试报错(
get_test_output,:249),并用maybe_shorten(:145)把超长文本掐头去尾压进 token 预算。 - 相关测试的源码:
get_test_functions(:278)随机挑 F2P 测试的源码,帮模型写出「合理的复现步骤」。
模型产出 n_instructions 段候选 issue,存进每实例的 <instance_id>.json,最后合并回数据集成为 problem_statement 字段(:502-525)。
1.3 工程细节
- 可恢复:已生成的实例会跳过(
_should_do_instance,:230),中断后能续跑。 - 双后端:支持 litellm 直连,也支持 Portkey 网关(
PortkeyModel,:81,带指数退避重试)。 - 预 clone 防竞争:并发前先把所有需要的仓库 clone 好,因为
RepoProfile.clone不是线程安全的(run里:453-465注释明说)。
配置模板见 configs/issue_gen/ig_v2.yaml 等;get_from_tests.py/get_static.py 提供不依赖 LLM 的替代出题方式。