📑 目录
一句话结论:SkillForge 不等真实 issue——用"重新实现测试覆盖的核心功能"合成项目专属 issue,在解决合成 issue 中蒸馏出实体锚定技能(诊断 + 干预双层),解决真实 issue 时按交互位置即时注入。SWE-bench Verified:DeepSeek-V3.2 达 72.2%(基线 66.4%,+5.8%)、GPT-5-mini 达 60.6%(+5.6%),两种知识缺一不可。
背景与动机
项目知识瓶颈
LLM 编码 Agent 解决特定仓库 issue 常失败——不知道模块划分、代码风格、隐含约束。现有 self-evolving 方法两条路都有硬伤:
| 路线 | 做法 | 缺陷 |
|---|---|---|
| 历史学习(SWE-Exp/EvoCoder/MemGovern) | 用历史修复轨迹提炼 | 依赖历史修复信号,新仓库冷启动失效 |
| 在线探索(SAGE/SWE-Debate/Live-SWE) | 遇到真实 issue 现场学 | 逐 issue 探索成本高 |
SkillForge 第三条路:知识缺口从仓库测试主动构造——测试即规范,天然自带验证器。
核心思路(四步合成 → 双层蒸馏 → 两阶段检索)
① 合成 issue(四步流程)
| 步骤 | 做法 |
|---|---|
| 1. 测试驱动范围 | 对每个通过的测试做覆盖率插桩执行,提取执行轨迹 → 被覆盖源文件与行范围,切片成连续代码段 |
| 2. 关键段选择 | LLM 选 top-k 关键段(测试目的 + 代码段摘要);关键区别:可跨组件选多段,合成能暴露跨组件交互的 issue |
| 3. 代码重写(strict-mask) | 不给原始实现,只给段前后代码行 + 位置/缩进 + 测试目标,让 LLM 重写一个保留 API 但逻辑简化的替代实现 → 诱发"通用知识 vs 仓库知识"的差距(即真实开发中的错误类型) |
| 4. 实例组装 | 重写致测试失败 → 构建 buggy 快照 + buggy/reference patch → LLM 把失败证据转成不暴露修复提示的问题陈述 → 标准 SWE-bench 格式实例 |
SWE-bench Verified 上合成 577 个合成 issue(时间隔离:回滚到 golden patch 前快照)。
② 双层技能库(entity-grounded)
全局诊断技能 M_ext(3 字段,解决"去哪看"):
| 字段 | 内容 |
|---|---|
purpose |
实体在 issue 解决中的功能角色(判断是否是调试入口) |
playbook |
反复验证的可复用推理策略(仓库特定,非通用建议) |
related_apis |
常共同涉及的 API 及原因(仓库交互模式) |
局部干预技能 M_int(解决"怎么改"):从成功轨迹(正确修复策略)与失败轨迹(对比错误 patch vs reference patch 暴露的陷阱)蒸馏,形如 {api_path, intervention_skills[]}。
技能通过解析轨迹中的 shell 命令(grep/sed/cat)+ AST 结构索引对齐到真实代码实体——防止 LLM 幻觉出不存在的接口。
③ 两阶段检索(上下文感知注入)
- 宏观初始化:新 issue 描述 → BM25 从 M_ext 检索 top-5 → 前置到初始提示(项目先验)
- 微观 JIT 注入:不一次性注入 M_int——监控 agent 的 shell 命令,访问的文件命中 M_int 条目时,把干预提示作为辅助观察即时附加。技能与当前交互严格对齐,避免语义检索的歧义
实验数据
SWE-bench Verified(表 I,Pass@1):
| 方法 | DeepSeek-V3.2 | GPT-5-mini |
|---|---|---|
| SkillForge | 72.2% | 60.6% |
| Mini-SWE-Agent(基线) | 66.4% | 55.0% |
| MemGovern(最强历史基线) | 69.2% | 58.0% |
| SAGE / SWE-Debate(在线基线) | 67.2% / 68.2% | 56.0% / 56.4% |
| SkillForge w/ SWE-Smith(单函数重写) | 68.0% | 56.4% |
| SkillForge w/ LLM Summary(摘要代替轨迹蒸馏) | 68.7% | 54.4% |
SWE-bench Pro(731 实例,Python/JS/TS/Go):34.1% / 51.7%(+5.8% / +4.1%)。
消融与超参:
- 组件消融:移除 M_ext ↓3.8%/↓3.0%;移除 M_int ↓4.4%/↓3.4%——两种知识都必要,干预技能影响略大
- 跨 LLM 迁移:GPT-5-mini 用 DeepSeek 蒸馏的知识 55.0% < 自蒸 60.6%——技能与蒸馏模型绑定(不同模型编码先验不同,暴露的仓库不匹配也不同),对角模式明显
- 检索数量:k_r 峰值 5(69.7%);全部注入反而降到 67.5%(低排名技能挤占上下文)
- 重写段数:k_s 峰值 5(多实体交互暴露更丰富知识),7 略降
- 跨仓库:7 个大仓库全提升无回归(DeepSeek 最高 +13.6% Sphinx、GPT-5-mini +15.6% scikit-learn),对比 SWE-Exp 在 3 个仓库回归(Matplotlib −11.8%)
案例(Django #11206):格式化极小 Decimal(format(Decimal("1e-200"), ".", decimal_pos=2))期望 “0.00” 却返回 “1.00e-200”。基线 agent 用指数启发式判零 → FAIL_TO_PASS 0/2;SkillForge agent 靠检索知识保留现有格式化管道、用仓库精度语义推理数值等价 → 2/2 全过。
工程落地要点
- 测试质量 = 合成质量:弱断言/无断言的测试不适合做合成素材;无测试的仓库先补关键测试
- 技能粒度:实体锚定(文件/函数级)比泛化经验有效——检索命中率与注入对齐度是关键
- 落地建议:先在中等仓库(几百文件)验证合成-蒸馏闭环,动作预算参考 250 步、温度 0
- 代价提示:合成 + 蒸馏有额外推理开销,适合高频同质 issue 流(技能复用摊薄成本)
适用边界与取舍
- 适合:有测试套件的仓库、新仓库冷启动、高频同质 issue
- 不适合:无测试且不补测试的仓库、一次性问题流(技能库膨胀复用率低)
- 取舍:vs 历史学习(无冷启动依赖但需测试);vs 在线探索(无逐 issue 成本但需事前合成预算);vs agent-skills(自动生成+实体锚定 vs 人工沉淀)
复现要点
- arXiv: 2608.18933;代码/数据 github.com/cslsolow/SkillForge(上海交大 Haibing Guan 团队)
- 复现链路:覆盖率插桩跑测试 → strict-mask 重写 → 失败证据转问题陈述 → Mini-SWE-Agent + BM25 检索 + JIT 注入
参与讨论
GitHub Discussions 驱动评论由 GitHub Discussions 驱动,数据存储于 hackcv/blog 仓库;需要 GitHub 账号登录后参与,支持 Markdown 与表情回应。