代码图引导定位,微调32B文件命中92.7%且成本降86%

LocAgent: Graph-Guided LLM Agents for Code Localization

Zhaoling Chen, Xiangru Tang, Gangda Deng, Fang Wu, Jialong Wu, Zhiwei Jiang, Viktor Prasanna, Arman Cohan, Xingyao Wang

cs.SE, cs.AI, cs.CL

2025-03-12

LocAgent把Python仓库编成含导入、调用、继承的异构图,只给agent三件检索工具做多跳定位。微调Qwen-32B文件级Acc@5达92.7%,单次约0.09美元,接近Claude-3.5。

这篇在解决什么

给模型一张 GitHub issue,让它指出仓库里该改哪些文件、类、函数,这件事叫代码定位。调试时间里大约三分之二花在「找到该改哪」;自动修 bug 也卡在这一步。症状和真正要改的代码经常对不上:issue 写「用户资料页 XSS」,真正该动的可能是全仓库共用的校验函数。

现成做法分两路。向量检索要把整库持续做成 embedding,仓库一改就过时。SWE-agent、OpenHands 这类 agent 靠 grep 和目录浏览,跨文件的调用和继承看不到。issue 没点名的那一层,它们经常走不到。

方法

LocAgent 把 Python 仓库解析成一张有向异构图。节点是目录、文件、类、函数四级;边覆盖 contain、import、invoke、inherit。函数是最小检索单元。索引是稀疏的:实体全名、同名倒排、BM25,建库只要几秒。

Agent 只暴露三件工具:

规划按 CoT:抽关键词,挂到实体,沿图推故障链路,再给候选打分。多轮 Reciprocal Rank 聚合当置信度。

成本侧,用 Claude-3.5 在 SWE-bench 训练集上跑出 433 条成功轨迹,再加上微调后 Qwen2.5-32B 的 335 条成功轨迹,LoRA 蒸馏到 7B 和 32B。

结果

SWE-Bench-Lite 留 274 条(去掉没改现有函数的样本)。Acc@k 要求 top-k 里覆盖全部该改位置。

方法文件 Acc@5函数 Acc@10
CodeRankEmbed84.67%58.76%
OpenHands + Claude-3.590.15%70.07%
LocAgent + Qwen2.5-32B(ft)92.70%77.01%
LocAgent + Claude-3.594.16%77.37%

单次成本:Claude-3.5 约 0.66 美元,微调 32B 约 0.09 美元,7B 约 0.05 美元。下游固定用 Agentless 的编辑器,定位换成 LocAgent-32B 后 Pass@10 从 33.58% 升到 36.13%;换成 Claude 定位则到 37.59%。Pass@1 几乎不动(26.31% 到 26.79%)。

自建 Loc-Bench 560 条,覆盖 bug、功能、安全和性能,issue 日期在 2024 年 10 月之后。Claude-3.5 文件 Acc@10 为 86.07%,微调 7B 为 79.64%。bug 报告明显好于另外三类。

去掉 SearchEntity,7B 设定下函数 Acc@10 从 71.53% 掉到 53.28%。TraverseGraph 限 1 跳,函数级也会掉一截。图结构对多跳任务不是装饰。

为什么重要

仓库级 coding agent 的第一跳就是定位。这篇把目录乱翻换成在调用图上走,开源 32B 就能贴上 Claude,单次便宜一个数量级。Python 仓库、愿意建一张轻量图的团队可以直接用。

它是工程上的拼装改进:图表示和 agent 工具都有前作,卖点是关系类型更全、工具更省 token、再加一轮开源蒸馏。

局限与存疑

只做了 Python。微调几乎全是 Qwen-2.5-Coder 加 LoRA,训练轨迹主要来自 Claude 成功路径,Loc-Bench 上非 bug 类别掉点,和训练分布偏 bug 对得上。下游只接了 Agentless 修 bug,重构、加功能和安全补丁没测。Acc@k 要求一次找全,漏一个就算失败,和「找对主文件」不是一回事。

术语

原文与代码

社区讨论

相关论文

全部论文解读