先抽标识符再BM25,仓库级缺陷定位MAP@1最高提升36%

Reformulate, Retrieve, Localize: Agents for Repository-Level Bug Localization

Genevieve Caumartin, Glaucia Melo

cs.SE, cs.AI, cs.IR

2025-12-08

用未微调的Qwen把issue抽成摘要加标识符、代码片段,再交给BM25。Long Code Arena上MAP@1最高提升36%;同一套查询送进agent后,SWE-bench Lite首文件MAP@1从0.476升到0.727。

这篇在解决什么

仓库级缺陷定位的老问题是词面鸿沟:issue 用用户的话写,代码用标识符写,直接把整篇报告丢进 BM25 会把模板套话、堆栈噪音一并送进去。Query reformulation 这条线改查询、不改仓库索引。LLM 已经能从 bug 描述里抽信号,但抽完之后怎样进 agent 循环,之前很少单独量。

这篇把抽取做成检索前的中间表示,再看它对 BM25 和后续 agent 排序各贡献多少。

方法

RQ1 只动查询。Qwen3-30B(温度 0)按 JSON schema 从 bug 报告里抽出:explanation(去模板后的摘要)、路径、文件名、标识符、代码片段、堆栈、报错。Pyserini 默认 BM25 索引仓库源文件。对照是未经改写的全文查询。消融五组:全 schema、只 explanation、全部代码信号、只要标识符+片段、explanation+标识符+片段。路径和文件名不进 BM25 组,留给 agent 看。

RQ2 做一个轻量 agent 循环:抽取 → BM25 top-{10,20,30} → 视文件(去头注释和 import 后截 512 token)→ 输出排序文件列表。工具调用靠提示词里的 JSON,不依赖模型原生 function calling。非法 JSON 和错误路径最多自纠正三次。最后另开一轮、用新上下文自我复核。两组实验:All-at-top 把完整抽取结果放在对话顶上;Best-at-top 只保留 RQ1 最优字段组合。模型是未微调的 Qwen2.5-Coder-32B 和 Qwen3-Coder-30B,16K 窗口,本地 Mac Studio,每设置跑三次取平均。

数据:Long Code Arena 缺陷定位测试集 150 条(Python/Java/Kotlin 各 50,约一半多文件);SWE-bench Lite 300 条单文件 Python 任务。指标 MAP 和 Hit@K。

结果

LCA 上全文 BM25 的 MAP@1 是 0.158。标识符+片段升到 0.247(+36%),Hit@1 从 0.320 到 0.447。explanation+标识符+片段在 MAP@5/10 和 Hit@5/10 最好(0.339/0.359,0.733/0.813)。只留 explanation 几乎没有帮助(MAP@1 0.154)。堆栈和报错加进去会在更大的 k 上加噪。

SWE-Lite 基线已经高得多(MAP@1 0.400),最优仍是 explanation+标识符+片段(0.476),Hit@10 从 0.753 到 0.853。作者把差距归因于 SWE 的 issue 更对齐代码。

Agent 在 SWE 上用 Best-at-top 的 Qwen3-30B,MAP@1/Hit@1 到 0.727,相对最优 BM25 的 0.476 再高 35%。All-at-top 的 Hit@10 到 0.928。对照 SWE-agent(GPT-4)0.573、Agentless(GPT-4o)0.697、微调过的 LocAgent 0.759。未微调 30B 级模型超过 SWE-agent 和 Agentless,仍低于微调 LocAgent。LCA 上 Qwen2.5 All-at-top 的 MAP@1 从 0.230 到 0.317。三次运行标准差不超过 0.0075。

抽取一步平均 4.4–5.1 秒;整次定位大约 18–78 秒。工具统计并不干净:每个仓库平均 viewfile 20–40 次,去重后只剩 1.6–5.3 个独特文件,重复和错路径很多。

为什么重要

不想上图、不想微调时,先让小模型把 issue 收成「摘要+标识符+片段」再 BM25,是最便宜的一跳。LCA 这种多语言、多文件集合上,这一跳值 36 个点的 MAP@1。Agent 再看几个文件,SWE 首文件还能再抬一截。

它明确不是新 SOTA。微调 LocAgent 仍然更高。这篇的用处是把「改查询」从「上图、上微调」里拆出来,方便嵌进 IDE 里的低成本定位。

局限与存疑

只做到文件级,方法级切块留作未来工作。SWE-Lite 虽是仓库级搜索,金标仍是单文件。模型在网页规模代码上预训练,LCA/SWE 项目可能进过训练集,数字应看成上界。抽取质量绑在 Qwen3-30B 上。Best-at-top 不含路径/文件名,作者怀疑这限制了更大 k 的排序。16K 窗口、512 token 文件预览,长文件只看了开头。JSON 和路径错误靠重试压住,Qwen3 还有超时。

术语

原文与代码

社区讨论

相关论文

全部论文解读