Command Palette
Search for a command to run...
先知其所以然:面向软件问题修复的问答驱动式仓库知识获取
先知其所以然:面向软件问题修复的问答驱动式仓库知识获取
摘要
基于大语言模型的编码智能体已显著推进了自动化软件问题修复,但仍极易因对代码仓库理解不足而产生事实性错误。近期方法试图通过修复前的仓库探索来缓解这一局限,但其修复驱动的策略在未识别智能体知识缺口的情况下探索仓库,往往产生不精确的上下文,无法弥合潜在的理解缺陷。本文提出ACQUIRE,一个问答驱动的软件问题修复框架。ACQUIRE模拟经验丰富的开发者在尝试修复前先理解陌生代码的方式,在生成补丁前显式获取仓库知识。该框架通过两个阶段将知识获取与补丁生成解耦:第一阶段,提问者与回答者协作获取结构化仓库知识,提问者提出针对性问题,回答者通过自主探索生成有据可依的答案;第二阶段,修复者利用生成的问答知识来生成有依据的补丁。通过将隐式知识缺口转化为显式、事实可靠的理解,ACQUIRE加速了知识密集的修复阶段,并实现了更精确的修复。在SWE-bench Verified上的实验表明,ACQUIRE一致优于代表性的修复前方法,以适度的额外成本和时间将Pass@1提升最多4.4个百分点。
一句话总结
来自上海交通大学、匹兹堡大学和广东以色列理工学院的研究人员提出 ACQUIRE,一个 QA 驱动的框架,通过让提问器提出有针对性的问题,并由回答器在仓库探索中基于证据给出答案,从而获取结构化的仓库知识,然后解决器基于这些知识生成补丁,在 SWE-bench Verified 上将 Pass@1 提升最多 4.4 个百分点。
核心贡献
- ACQUIRE 是一个 QA 驱动的框架,通过使用提问器提出有针对性的问题,并由回答器自主探索仓库并给出基于证据的答案,将知识获取与补丁生成解耦,将隐式的知识缺口转化为显式的结构化理解。
- 该框架在一个两阶段流水线中独立于修复获取仓库知识,因此解决器基于得到的 QA 知识生成补丁,这加速了知识密集型的修复阶段,并将 agent 的工作重心转向验证。
- 在 SWE-bench Verified 上的实验表明,ACQUIRE 持续优于有代表性的预修复方法,以适度的额外成本将 Pass@1 提升最多 4.4 个百分点,消融研究将这些收益归因于将问题分解为有针对性的、可回答的问题,以及基于类别引导的问题生成。
引言
大语言模型(LLM)编码 agent 推进了自动化软件缺陷解决,但仍存在一个关键的失效模式:agent 缺乏深层仓库理解,导致基于关键词的浅层定位和隐式 API 契约的违反。现有的预修复方法试图用结构化的摘要丰富上下文,但它们仍受缺陷关键词驱动,而非识别缺失了哪些具体的仓库知识,往往产生不完整或不精确的上下文。作者提出 ACQUIRE,一个将仓库知识获取与补丁生成解耦的框架。ACQUIRE 部署一个提问器和一个回答器,将缺陷分解为跨越多个知识维度的有针对性的问题,并自主探索仓库以获取基于证据的答案,提供结构化的 QA 对,然后解决器使用这些 QA 对生成有信息的补丁。
数据集
ACQUIRE 的评估基于单一的精选基准。数据集的构成和使用方式如下。
- 数据集 – SWE‑bench Verified,原始 SWE‑bench 的一个子集。
- 来源 – 500 个真实的 GitHub 缺陷,来自开源 Python 仓库。
- 筛选 – 该子集仅保留隔离功能性缺陷的缺陷实例;每个实例在受控、可移植的环境中运行,以保证单元测试具有确定性和可靠性。
- 实例结构 – 每个示例为 agent 提供自然语言问题描述和缺陷提交时的完整代码仓库。不提供额外的提示、缺陷评论或补丁片段。
- 评估 – 通过执行伴随缺陷的开发者编写的单元测试来判断正确性。测试框架提供一致的自动化 pass/fail 信号。
- 论文中的使用 – 作者将 SWE‑bench Verified 纯粹作为零样本评估集。没有训练划分;agent 的任务是一次性理解缺陷、搜索仓库并生成补丁。该基准用于比较两个不同的骨干 LLM(DeepSeek‑V3.2 和 GPT‑5‑mini)在搭配 ACQUIRE agent 框架时的缺陷修复性能。
方法
作者提出 ACQUIRE,一个两阶段框架,旨在模拟经验丰富的开发者处理不熟悉代码库的工作流程。该过程首先获取必要的仓库知识,然后执行有信息的修复。给定一个缺陷描述 I 和一个执行环境 E,该框架在尝试任何代码修改之前系统地弥合知识缺口。
如下图所示:
第一阶段专注于问题驱动的知识获取。为确保获取的知识覆盖与修复最相关的维度,提问器模块生成 N 个有针对性的问题。这一生成过程由一个结构化的提示模板引导,该模板编码了四个不同的知识类别:机制与行为、设计与使用、定位与结构,以及生态系统与标准。这些类别分别针对功能逻辑流程、API 定义、代码库布局和外部依赖。提问器根据缺陷上下文自主选择每个问题的适当类别。
一旦问题 {q1,…,qN} 生成,它们被分派给 N 个独立实例化的回答器实例。每个回答器在执行环境 E 中以只读模式探索仓库。回答器被提示通过引用具体的仓库工件(如文件路径和函数名)来产生有依据的答案,而非依赖参数化知识。如果找不到足够的证据,agent 会明确承认这一缺口。由于每个回答器实例仅接收缺陷描述 I 及其分配的问题 qi,探索保持专注且不受其他实例的偏见影响。这种隔离实现了完全并行执行,将挂钟延迟降低到单个最慢实例的水平。完成后,得到的问题-答案对被组装成一个知识集 K={(q1,a1),…,(qN,aN)}。
在第二阶段,知识驱动的修复阶段,解决器模块执行实际的问题解决。解决器接收缺陷描述 I 以及获取的知识集 K。N 个 QA 对被序列化为一个结构化的文本块,并在修复指令开始之前前置到解决器的消息中。这种静态预注入确保在第一次修复动作之前就建立了完整的仓库理解,防止在部分信息下做出早期决策。注入的 QA 对作为补充上下文,为解决器的策略提供信息,但不会覆盖其独立验证观察结果的能力。解决器在执行环境 E 中运行,进行代码导航、编辑和测试执行的迭代循环,直到成功生成候选补丁。
实验
评估将 ACQUIRE 与基于定位和基于辩论的预修复方法在 SWE-bench Verified 上进行比较,使用 Mini-SWE-Agent 作为共享的修复骨干,测量 Pass@1、成本和时间。ACQUIRE 在不同骨干模型上始终取得最高的解决率,同时保持有竞争力的效率,因为其 QA 驱动的范式将知识获取与修复解耦,并注入有针对性的、可靠的仓库知识。人工审核确认几乎所有生成的 QA 对都有事实支持,且该知识通过减少定位和修复阶段的盲目探索来加速修复。消融研究表明,将缺陷分解为有针对性的问题并使用类别引导的模板对性能至关重要,单个 QA 对已经能带来有意义的收益,最佳平衡点位于两个 QA 对。
下表比较了四种方法在 SWE-bench Verified 上使用 GPT-5-mini 和 DeepSeek-V3.2 的结果。DeepSeek-V3.2 始终比 GPT-5-mini 提供更高的 pass@1 分数,但推理时间和成本更高。在 GPT-5-mini 运行中,LingmaAgent 达到最高准确率,而 CoSIL 成本效率最高。DeepSeek-V3.2 在 LocAgent 和 CoSIL 上相对于 Mini-SWE-Agent 基线将 pass@1 提升 2.3 到 2.4 个百分点,两者均超过 68%。采用 GPT-5-mini 的 LingmaAgent 达到最高 pass@1(60.0%),但成本超过 0.30 美元,约为最便宜方法的 13 倍。CoSIL 是最经济的方法,每次运行成本为 0.035 美元,但其 pass@1 比 Mini-SWE-Agent 基线低 3.2 个百分点。
完整的 ACQUIRE 系统在 SWE-bench Verified 上达到 70.8% 的 Pass@1,优于两个问题生成消融变体。移除问题分解组件(ACQUIRE-Proposal)使性能下降 4.8 个百分点,而用自由形式问题替换类别引导的问题(ACQUIRE-FreeQ)使其下降 3.8 个百分点,证实结构化的预修复知识获取能改善修复结果。完整 ACQUIRE 达到最高 Pass@1(70.8%),超过 ACQUIRE-Proposal(66.0%)和 ACQUIRE-FreeQ(67.0%)。消融问题分解(ACQUIRE-Proposal)使 Pass@1 下降 4.8 个百分点,凸显了修复前分解知识需求的重要性。用自由形式问题替换类别引导的问题(ACQUIRE-FreeQ)导致 3.8 个百分点的下降,表明结构化问题模板能产生更好的修复结果。
评估设置比较了多种 agent 方法在 SWE-bench Verified 上使用 GPT-5-mini 和 DeepSeek-V3.2 的结果,同时评估了 ACQUIRE 系统及其消融变体。DeepSeek-V3.2 始终比 GPT-5-mini 提高准确率,但推理成本和耗时更高,其中 LingmaAgent 在 GPT-5-mini 上达到最高 pass@1,花费也显著更高,而 CoSIL 提供最经济的解决方案,尽管准确率略有折衷。在 ACQUIRE 实验中,完整系统优于两个消融版本,移除问题分解或用自由形式问题替换结构化的类别引导问题会显著降低修复性能,确认结构化的预修复知识获取至关重要。