📑 目录

一句话结论: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 与表情回应。