Each language version is independently generated for its own context, not a direct translation.
这篇论文介绍了一个名为 SWE-Adept 的新系统,它的核心任务是:让大语言模型(AI)像一位经验丰富的“老程序员”一样,去修复复杂的软件代码库中的 Bug。
为了让你更容易理解,我们可以把修复一个大型软件项目(比如像微信或淘宝这样的大系统)比作在一个巨大的、迷宫般的图书馆里找出一本写错了几页的书,并把它改好。
1. 为什么以前的 AI 做不到?(痛点)
以前的 AI 就像是一个刚毕业、有点急躁的实习生:
- 迷路了: 面对成千上万个文件(图书馆的书架),它不知道从哪里开始找。它往往试图把整本书甚至整个图书馆的内容都塞进脑子里(上下文窗口溢出),结果脑子乱了,找不到重点。
- 乱改一气: 找到问题后,它开始改代码。如果改错了,它往往不知道回到哪一步,只能从头再来,或者在错误的道路上越走越远,把原本能用的代码也改坏了。
2. SWE-Adept 是怎么做的?(核心方案)
SWE-Adept 把任务分给了两个专门的“特工”,它们分工明确,配合默契:
特工 A:定位专家(Issue Localization Agent)
任务: 在迷宫里精准找到那本“坏书”和具体的“错页”。
- 以前的做法: 像无头苍蝇一样乱撞,或者把整层楼的书都搬过来看。
- SWE-Adept 的做法(特工 A 的绝招):
- 像侦探一样“顺藤摸瓜”: 它不盲目搜索。它先根据 Bug 描述找到几个关键词(比如“登录失败”),然后像侦探查案一样,沿着代码的依赖关系(谁调用了谁)进行深度优先搜索。
- 只看“目录”和“简介”: 在深入之前,它先快速浏览代码的“骨架”(函数定义、调用关系),只把真正相关的几页纸(代码片段)带出来,而不是把整本书搬进脑子。
- 两阶段过滤: 先快速筛选掉明显无关的,再对剩下的几个嫌疑对象进行“深度审讯”(查看完整代码),最终精准锁定问题所在。
比喻: 就像你在找失物,不会把整个家翻个底朝天,而是先回忆“最后在哪里用过”,然后只去那个房间的几个抽屉里找。
特工 B:修复专家(Issue Resolution Agent)
任务: 拿到“错页”位置后,把书改好,并确保没改坏别的地方。
- 以前的做法: 像“试错法”,改一行,跑一下测试,错了就接着改,改乱了也不知道怎么回退,最后留下一堆乱码。
- SWE-Adept 的做法(特工 B 的绝招):
- 制定“作战计划”: 在动手前,先列出“待办事项清单”(To-Do List)。比如:第一步改函数 A,第二步写测试脚本,第三步运行测试。
- 多路并行(分支探索): 如果一个问题可能有多种解法,它会同时开辟几条“时间线”(Git 分支)。
- 时间线 A: 试着改这里。
- 时间线 B: 试着改那里。
- 随时“读档”(检查点机制): 这是最厉害的地方!每完成一个步骤,它都会自动保存一个“存档点”(Git Checkpoint)。
- 如果时间线 A 走错了,它不需要从头开始,而是直接读取之前的存档,回到那个状态,然后换一条路继续走。
- 它就像一个拥有“后悔药”的程序员,永远知道如何回到一个干净、正确的状态。
比喻: 就像玩一个高难度的游戏。以前的 AI 死了就重开整个游戏;SWE-Adept 的 AI 会在每个关键路口存档。如果走错了,它直接读档回到路口,换条路走,而不会丢失之前的进度。
3. 这个系统厉害在哪里?(成果)
- 更准: 在找 Bug 的位置上,比以前的方法准确率高了 5.4%。
- 更稳: 在最终修好 Bug 的比例上,提高了 4.7%。
- 更省: 因为它懂得“只读必要的书”,所以它消耗的算力(Token)比那些试图“读完所有书”的方法要少。
总结
SWE-Adept 就像是给 AI 配备了一套专业的“侦探工具箱”和“时间机器”:
- 侦探工具让它能在大海捞针中精准定位问题,不被无关信息干扰。
- 时间机器(版本控制 + 检查点) 让它敢于大胆尝试多种方案,失败了也能瞬间回到安全状态,从而系统性地解决复杂的软件问题。
这就解释了为什么它能比以前的 AI 更像一个成熟的软件工程师,而不是一个只会乱敲代码的初学者。
Each language version is independently generated for its own context, not a direct translation.
SWE-Adept 论文技术总结
1. 研究背景与问题定义
大型语言模型(LLM)在独立的编程任务中表现优异,但在处理**仓库级软件工程(Repository-level SWE)**问题时仍面临巨大挑战。主要难点在于:
- 代码库导航与上下文管理困难:现实世界的代码库通常包含数千个文件,且存在密集的跨文件依赖。LLM 的上下文窗口有限,如何在遍历依赖关系定位问题根源的同时,避免将大量无关代码注入上下文(Context Window Overflow),是精准定位的关键。
- 缺乏系统化的问题解决方法:现有的修复方法多采用“思考 - 编辑”的自由形式循环,缺乏明确的规划和进度跟踪。随着迭代次数增加,代码编辑与测试脚本的交织使得工作状态难以解释和验证。此外,缺乏检查点(Checkpointing)机制,导致代理(Agent)在编辑失败后难以可靠地回退到之前的中间状态或尝试替代方案。
2. 方法论:SWE-Adept 框架
SWE-Adept 是一个基于 LLM 的双代理(Two-Agent)框架,旨在自主解决仓库级软件工程问题。它将任务分解为两个专门化的阶段:
2.1 核心组件
- 问题定位代理(Issue Localization Agent):负责在代码库中搜索并精准定位与问题相关的代码位置。
- 问题修复代理(Issue Resolution Agent):负责根据定位结果实施修复、验证并管理版本控制。
2.2 关键技术细节
A. 问题定位:代理导向的深度优先搜索与两阶段过滤
- 细粒度索引与代码结构树:利用
tree-sitter 将代码库解析为类/函数级别的定义单元(Code Units),并构建代码结构树(Code-Structure Tree)。节点代表代码单元,边代表“包含”或“调用”关系。每个单元仅存储轻量级的邻接表(子单元标识),而非全量依赖图,以优化检索效率。
- 代理导向的深度优先搜索(Agent-Directed DFS):
- 定位代理根据问题描述提取入口点,利用搜索工具(如
find_child_unit)进行依赖感知的深度优先遍历。
- 上下文优化:搜索工具仅返回轻量级结构信息(代码骨架、预览、位置元数据),而非完整源码,极大减少了上下文消耗。
- 两阶段过滤:
- 初筛:基于代码预览和位置启发式规则对候选位置进行排序和剪枝。
- 精排:仅对初筛后的少量候选位置加载完整源码,进行基于内容的深度分析,最终确定问题根源。
B. 问题修复:结构化规划与基于检查点的版本控制
- 结构化问题求解:修复代理接收定位结果后,采用**假设驱动(Hypothesis-Driven)**的方法。它生成一个或多个修复假设,并为每个假设制定动态的待办事项(To-Do List)。
- 工具 - 内存接口(Tool-Memory Interface):
- 设计了两大 CLI 工具族:
hypothesis_plan(用于规划、进度跟踪和洞察记录)和 hypothesis_git(用于基于 Git 的版本控制)。
- 共享工作内存:后端维护一个结构化内存,存储假设、待办事项及其对应的代码状态检查点(Git Hash 和提交信息)。
- 版本控制操作:
- 分支探索(Branching):为不同的假设创建独立的 Git 分支,隔离探索路径。
- 检查点回退(Reverting):利用语义化的步骤索引(Semantic-Step Indexing),代理可以可靠地回退到任意已完成的待办事项检查点,撤销失败的编辑,而无需手动管理复杂的 Git 哈希。
- 动态规划:根据测试反馈(如未覆盖的边界情况),代理可动态扩展待办事项列表。
3. 主要贡献
- SWE-Adept 框架:提出了一种集成精准问题定位与结构化问题修复的端到端 LLM 代理框架,实现了仓库级问题的自主解决。
- 代理导向的遍历机制:引入了基于深度优先搜索和两阶段过滤的导航策略,通过依赖引导和轻量级检索,有效解决了长上下文下的定位精度问题。
- 可靠的代理驱动版本控制:设计了工具 - 内存接口,利用代码状态检查点支持系统化的长周期问题求解,使代理能够可靠地进行分支探索和失败回退。
4. 实验结果
在 SWE-Bench Lite 和 SWE-Bench Pro 两个基准测试上进行了评估,使用了 GPT-5.2 和 Claude-Sonnet-4.5 模型。
- 问题定位性能:
- 在函数级定位(Func Acc@5)上,SWE-Adept 在 SWE-Bench Lite 上比最强基线(OrcaLoca)提高了 5.4%(GPT-5.2)和 4.1%(Claude)。
- 在 SWE-Bench Pro 上也有显著提升(分别提高 3.3% 和 4.0%)。
- 由于有效的上下文管理,其 Token 消耗量显著低于基于图的方法(如 RepoGraph, LocAgent)。
- 端到端修复率:
- 在 SWE-Bench Lite 上,修复率提升了 3.3%(GPT-5.2)和 2.6%(Claude)。
- 在更具挑战性的 SWE-Bench Pro 上,修复率提升了 4.7%(GPT-5.2)和 4.0%(Claude)。
- 消融实验:证明了精准定位和系统化修复(特别是检查点机制)对整体性能提升的联合贡献。直接使用原始 Git 命令而非封装工具会导致在长任务中可靠性下降。
5. 意义与影响
- 解决长程依赖与状态管理难题:SWE-Adept 通过引入结构化的工作内存和版本控制机制,解决了 LLM 代理在处理长序列代码编辑时容易迷失状态、难以回退的痛点。
- 提升自动化软件工程能力:该框架展示了通过精细的上下文管理和系统化的规划策略,LLM 可以胜任复杂的、多步骤的仓库级调试任务,为未来的自动化软件开发工具提供了新的范式。
- 通用性与扩展性:虽然当前实验基于 Python,但其定位与修复的框架设计是语言无关的,未来可推广至其他编程语言。
总结:SWE-Adept 通过“精准定位(减少噪声)”和“结构化修复(管理状态)”的双重创新,显著提升了 LLM 在复杂软件工程任务中的表现,是目前在该领域最具竞争力的方法之一。