← 返回 2026-07-15

先懂再修:基于问答驱动的仓库知识获取实现软件议题自动修复 Know Before Fix: QA-Driven Repository Knowledge Acquisition for Software Issue Resolution

Haotian Lin, Silin Chen, Xiaodong Gu, Yuling Shi, Chengxi Pan, Jiaqi Ge, Mengfan Li, Jianghong Huang, Mengchieh Chuang, Beijun Shen, Haibing Guan 📅 2026-07-13 👍 2 2026-07-15 05:11
SWE-bench 仓库级问答 代码智能体 多智能体协作 知识获取 软件议题修复

修复前先用问答显式获取仓库知识,显著提升智能体议题解决准确率。

前置知识

SWE-bench Verified

基于真实 GitHub 议题构建的代码修复基准,Verified 子集包含 500 个经过人工校验、聚焦功能性 bug 修复的高质量实例。评测时模型只拿到自然语言议题描述和对应代码仓库,最终通过开发者编写的单元测试来判定补丁是否正确,是当前衡量 LLM 代码智能体修复能力的事实标准。

本文所有主实验(Pass@1、成本、时间)都在这个 500 实例子集上完成,理解它的评测协议才能判断 +4.4 pp 这种提升的实际分量。

代码智能体(Coding Agent / SWE-agent)

由 LLM 驱动、能在隔离 shell 环境里迭代式提出命令、观察执行结果并更新策略的自动编程系统,例如 SWE-agent 和本文用的最小化版 Mini-SWE-Agent。它依赖链式推理、多步规划与工具调用,能在复杂代码库中导航、定位并生成补丁。

ACQUIRE 把 Mini-SWE-Agent 作为共享的修复底座,所有对比方法都挂在这同一个修复智能体上,这样性能差异才能归因到知识获取方式本身。

Pass@1

在单次尝试中成功解决(通过全部相关单元测试)的实例所占比例,是衡量修复有效性的主指标。它对随机性敏感,因此实验普遍把温度设为 0.0 来保证可复现。与它并列的还有平均成本(Avg Cost,每实例全流程美元开销)和平均时间(Avg Time,端到端墙钟秒数)。

论文所有方法对比、消融、N 敏感性分析都以 Pass@1 为主轴,必须理解它才知道 +3.8/+4.4 pp 的相对意义。

仓库级问答(Repository-level QA)

面向整个代码仓库的自然语言问答任务,要求系统在多个相互依赖的文件之间遍历、检索并综合证据来作答,代表基准有 RepoQA、CodeRepoQA、SWE-QA。它不仅要检索精度,还要能跨抽象层合成答案。ACQUIRE 把这一范式从『人问仓库』改造成『智能体问仓库』,让 agent 自己识别知识缺口、提出问题。

ACQUIRE 的核心创新就是把仓库级 QA 内化为智能体修复前的一个阶段,理解这一范式才能看懂它与 LocAgent、LingmaAgent 等修复方法的本质区别。

轨迹分析(Trajectory Analysis)

把智能体的修复执行轨迹按阶段(定位 Locating、复现 Reproducing、修复 Fixing、验证 Verifying)切分,逐个动作打标签(如是否引用了 QA 内容、属于哪个阶段),从而量化知识注入对行为的影响。本文用这套方法证明 QA 注入主要压缩了定位与修复阶段的步数。

论文不仅报 Pass@1,还用轨迹分析解释『为什么有效』(加速知识密集阶段、轮次下降 7.1%~17.1%),这是其论证链条的关键一环。

Oracle 探针实验(Oracle Probing)

一种上限探查实验:用特权信息(golden 测试补丁 + 涉及的金标文件集)构造一个 oracle Questioner 生成最相关单条问题、oracle Answerer 仅用金标文件作答,再把这条 QA 注入修复智能体看能恢复多少失败案例。本文用它在 116 个 Mini-SWE-Agent 失败实例上恢复了 26 个,证明『针对性预修复知识』确有潜力。

这是 Motivation 章节证明 QA 范式可行性的核心证据,也是后续用 4 类问题模板去逼近这个 oracle 上限的出发点。

研究动机

尽管 LLM 代码智能体在自动议题修复上进步巨大,但大量实证研究 [6]–[9] 一致发现:即便是前沿规模模型,仍然频发一类难以解决的失败——源于对仓库内部理解不足的事实性错误。具体表现为只做浅层关键字定位、无法跨模块边界追踪故障源头、违反隐式 API 契约、忽略外部协议约束。这些知识匮乏的尝试代价极不对称:相对成功案例会消耗超过 4 倍的 token 成本和近 2 倍的执行步数 [8],[10]。根因不在模型推理能力,而在于议题描述本身不提供仓库内部知识(跨模块依赖、隐式 API 契约、数据流细节),所以 agent 只能靠关键字盲猜。最近的预修复探索方法(如 LingmaAgent 把议题关键字链接到代码实体、LocAgent 产出可疑位置列表、CoSIL 扩展调用图)虽然想弥补这一缺口,但本质都是 fix-driven:它们基于议题关键字去探索,而不去识别智能体到底缺什么知识,产出的上下文常常不完整或不精确,反而加剧了对代码库的误解 [7],[9]。

本文的目标是本文要设计一个框架,让智能体像资深开发者处理陌生 bug 那样——先提问理解代码(某个组件如何运作、某个 API 强制了什么契约、相关模块在哪),把缺失的仓库知识显式补齐,再动手修复。具体目标是:在修复真正开始之前,自动识别出『还缺哪些仓库知识』、用有据可查的方式把这些知识获取到,再把结构化的知识注入修复流程,从而把隐性的知识缺口转成显性、可验证的理解。作者希望借此同时提升修复准确性(Pass@1)、缩短昂贵的试错轨迹,并保持可控的成本与时间开销,跨不同骨干模型保持泛化。

与已有工作不同的是,本文的独特切入在于范式转换:把仓库级 QA 从『人问仓库』(question pre-provided) 翻转为『智能体问仓库』——让 agent 自主诊断自己的知识缺口、主动提问、再用只读探索拿到有据答案,而不是被动等用户喂问题。与既有的预修复方法相比,关键差别是『先识别缺口、再针对性获取』而非『按议题关键字漫无目的地探索』。作者还先用 oracle 探针实验定量证明『针对性预修复知识』能恢复 26/116 失败实例,再用对 116 条 oracle 问题的归纳凝练出覆盖四大知识维度的类别模板,从而把依赖特权信息的 oracle 上限改造成全自动流水线,填补了『知道该问什么』这一被既有方法忽视的环节。

核心方法

ACQUIRE 的整体思路是两阶段解耦:先获取知识、再修复,对应人类专家『先读代码理解、再下结论』的调试习惯。直觉上,与其让一个 agent 一次性面对整条复杂议题去同时定位、推理、修,不如把它拆成若干条窄而聚焦的问题,每条问题交给一个只读探索的 agent 去仓库里找答案,再把答案汇总成结构化知识块注入修复 agent。技术上它编排三个专门化智能体:Stage 1 中 Questioner 把议题分解成 N 条覆盖互补知识维度的问题,N 个并行实例化的 Answerer 各自只读探索仓库产出有据答案,组装成知识集 $K=\{(q_1,a_1),\dots,(q_N,a_N)\}$;Stage 2 中 Resolver 拿到议题描述 $I$ 和 $K$,在环境中迭代进行代码导航、编辑、测试,直到产出候选补丁。整体设计强调最小干预——知识获取与修复循环解耦、知识以静态前置注入,从而让性能差异可干净地归因到所获知识本身。

核心创新是把『识别知识缺口』这一步显式化、结构化。具体抓手是一套四类问题分类法,由 5 名计算机科学研究生对 116 条 oracle 问题归纳得出:Mechanism & Behavior(70.7%,功能逻辑流/状态管理/数据处理)、Design & Usage(18.1%,API 定义/类继承/设计约定)、Locating & Structure(7.8%,代码布局/模块组织/依赖关系)、Ecosystem & Standards(3.4%,第三方库行为/协议规范/语言语义)。前三类对应仓库内部知识,第四类对应仓库依赖但不包含的外部知识。这与 LocAgent/CoSIL 输出『可疑位置列表或代码片段』、LingmaAgent/SWE-Debate 输出『结构化摘要或共识修复计划』有本质不同:ACQUIRE 捕获的是行为上下文、设计约束、结构关系等语义丰富的知识维度,且 Questioner 可自主为每条问题选类别(不强加轮转策略),让最关键的知识缺口优先被覆盖。第二个关键创新是 Answerer 的并行隔离实例化:每个 Answerer 只拿到 $I$ 和自己那条 $q_i$,互不可见,既避免跨实例上下文把探索带偏到已被访问但可能无关的区域,又让知识获取阶段的墙钟时间降到最慢那个实例的水平,而非所有实例之和。

方法步骤详情

完整流程分两大步。Stage 1 知识获取:给定议题描述 $I$ 和执行环境 $E$,(1) Questioner 依据四类模板的结构化提示(含类别描述、JSON 输出模式、非冗余与自包含约束、温度 0.7 鼓励多样性)生成 N 条问题 $\{q_1,\dots,q_N\}$,每条标注类别并按重要性排序;(2) N 条问题分派给 N 个独立实例化的 Answerer,每个 Answerer 复用 Mini-SWE-Agent 的脚手架但运行在只读模式(每步超时 120s、最大轨迹 150 步、单实例成本上限 $2.0、温度 0.0),其提示要求答案必须引用具体文件路径/函数名/代码行为、证据足够即提交、证据不足要明确承认缺口而非编造;(3) 各实例并行完成后,把 $(q_i,a_i)$ 配对组装成 $K$。Stage 2 知识驱动的修复:Resolver 继承 Mini-SWE-Agent 的脚手架与环境设置(每步超时 360s、最大轨迹 250 步、单实例成本上限 $3.0、温度 0.0),接收 $I$ 与 $K$,把 N 条 QA 序列化成结构化文本块、前置于修复指令之前(静态前置注入而非动态流式),然后迭代进行代码导航/编辑/测试执行,直到产出候选补丁;注入的 QA 作为辅助而非强制上下文,Resolver 仍可基于直接观察独立验证和调整。

技术新颖性

技术新颖性体现在几条相互支撑的设计上。第一,提出 agent-to-repository 的 QA 范式,把仓库级 QA 从外部基准评测内化为修复前的一个内部能力,这是据作者所知首个把仓库级 QA 集成进议题修复的工作。第二,类别引导的问题分类法来自对真实失败模式的实证归纳(而非拍脑袋设计),且消融显示去掉它 Pass@1 掉 3.8 pp、问题诊断性与覆盖度显著下降,证明这套分类是可迁移的通用模板。第三,静态前置注入而非动态按需流式,作者论证这既保持两阶段设计的模块化、又保证从第一个修复动作起就有完整知识上下文,避免早期决策在部分信息下做出。第四,最小干预原则——Resolver 提示明确要求把 QA 当作须与仓库直接观察交叉验证的辅助上下文,冲突时以代码/命令输出/测试反馈为准,使得性能差异能干净归因到知识本身而非修复机制改动。这套设计组合让 ACQUIRE 在保持与轻量定位基线相当的成本与时间下,达到 SOTA Pass@1。

Overview of ACQUIRE.
Fig. 1: Overview of ACQUIRE.

实验结果

RQ1 主实验(Table I):在 SWE-bench Verified 上,ACQUIRE 在两个骨干上均拿下最高 Pass@1——GPT-5-mini 上 62.2%(+3.8 pp)、DeepSeek-V3.2 上 70.8%(+4.4 pp),且是唯一在两个骨干上都稳定正向的方法;定位导向基线 LocAgent/CoSIL 在 DeepSeek-V3.2 上有 +2.3~2.4 pp 增益但在 GPT-5-mini 上反而退化(-0.6~-3.2 pp),暴露其依赖骨干推理能力把浅指针转成补丁的脆弱性;LingmaAgent/SWE-Debate 跨模型稳定但端到端时间是 ACQUIRE 的 1.4~5×、成本是 2~14×。RQ2 知识质量与影响:人工审核 232 条 QA 中 99.1%(230 条)为 Supported,其中 98 条(42.2%)完全准确、132 条(56.9%)含不影响结论的局部偏差,仅 2 条(0.9%)含未被代码支持的中心论断;QA 注入使全部 500 实例平均轮次降 7.1%、44 个 Fail→Pass 实例降 17.1%;轨迹步数从 3917 降到 3246,加速集中在 Locating(-23.8%)和 Fixing(-24.1%),40.4% 的步为 QA 相关(Locating 51.5%、Fixing 50.6%);Pass→Fail 共 22 例但仅 5 例属误导性,且这 5 例 10 条 QA 里 9 条事实 Supported,说明回归瓶颈在 Resolver 用法而非 QA 质量,净增益仍为 +22 实例。RQ3 消融(Table II/III):去掉问题分解改单次 proposal,Pass@1 掉 4.8 pp 至 66.0%(甚至低于无知识基线);去掉类别模板,掉 3.8 pp 至 67.0%,诊断效用 -0.38、覆盖度 -0.78;配对投票中 ACQUIRE 在 500 次对比里赢 294、输 111、平 95,非败率 77.8%。RQ4 N 敏感性(Fig. 3):N=1 即把 Pass@1 从 66.4% 拉到 69.0%(仅多花 $0.005),N=2 峰值 70.8%,N=3 回落至 69.0% 而成本续涨,故默认 N=2。案例 sphinx-doc__sphinx-9230:基线 117 步在 4 个错文件间打转从未访问正确文件 docfields.py,ACQUIRE 52 步(-55%)直击根因 $\texttt{fieldarg.split(None,1)}$ 在含空格的 $\texttt{dict(str, str)}$ 上错切。

Main Results on SWE-bench Verified under GPT-5-mini and DeepSeek-V3.2.
Table I: Main Results on SWE-bench Verified under GPT-5-mini and DeepSeek-V3.2.
Ablation Results on Downstream Repair Performance on SWE-bench Verified under DeepSeek-V3.2.
Table II: Ablation Results on Downstream Repair Performance on SWE-bench Verified under DeepSeek-V3.2.
Trajectory stage composition on 44 Fail→Pass instances w/o vs. w/ QA Injection.
Fig. 2: Trajectory stage composition on 44 Fail→Pass instances w/o vs. w/ QA Injection.
查看结构化数据
任务指标本文基线提升
SWE-bench Verified 议题修复(GPT-5-mini 骨干) Pass@1 62.2% Mini-SWE-Agent 58.4%(最强基线 LingmaAgent 60.0%) +3.8 pp 相对 Mini-SWE-Agent,+2.2 pp 相对最强基线,且所有 N≥1 设置均超全部基线
SWE-bench Verified 议题修复(DeepSeek-V3.2 骨干) Pass@1 70.8% Mini-SWE-Agent 66.4%(最强基线 LocAgent 68.8%) +4.4 pp 相对 Mini-SWE-Agent,+2.0 pp 相对最强基线,论文报告的最大单点提升
SWE-bench Verified 端到端成本(DeepSeek-V3.2) Avg Cost ($) $0.073 LingmaAgent $0.155 / SWE-Debate $0.382 成本仅为富上下文基线的 1/2~1/5,同时 Pass@1 更高,兼顾精度与经济性
SWE-bench Verified 轨迹效率(44 个 Fail→Pass 实例) 平均修复轮次 降低 17.1% 无 QA 注入的 Mini-SWE-Agent Locating 步数 -23.8%、Fixing 步数 -24.1%,总步数 3917→3246,证明前置知识绕开昂贵试错
问题分解消融(DeepSeek-V3.2) Pass@1 ACQUIRE 70.8% ACQUIRE-Proposal(单次提案替代 QA)66.0% 去掉问题分解掉 4.8 pp,甚至低于无知识基线,证明结构化分解是关键使能因素
类别引导消融(DeepSeek-V3.2) 问题集覆盖度(LLM-as-judge 1-10) ACQUIRE 6.74 ACQUIRE-FreeQ(自由提问)5.97 覆盖度 +0.78,诊断效用 +0.38,Pass@1 +3.8 pp,类别模板有效防止问题扎堆单一角度

局限与改进

作者明确承认三方面局限。其一,四类问题模板虽然实用有效,但覆盖仍可细化,未来可探索层级化类别、按议题类型自适应的模板、或从大规模修复轨迹自动学习类别模式。其二,知识目前以预生成 QA 形式静态前置注入,虽然简单稳定,但更前沿的方向是把知识获取与修复轨迹耦合,让 agent 在调试中动态请求与刷新知识,不过动态获取必然带来额外成本,如何在知识新鲜度与算力开销间平衡是开放问题。其三,外部效度受限:当前提示设计与评测都针对 Python 仓库,QA 驱动范式本身语言无关,但要把提示适配到其他编程语言并在多语言基准上验证仍属未来工作。我自己的观察补充:默认 $N=2$ 是在 SWE-bench Verified 上调出来的,迁移到别的代码分布时未必最优;Pass@1 之外的指标(如补丁最小性、是否引入回归)依赖单元测试,而 SWE-bench 本身的测试充分性近年受到质疑,ACQUIRE 的净 +22 实例增益是否在更严苛测试下仍成立值得复核。

独立分析的弱点

第一,静态前置注入在长 QA 下存在注意力稀释风险:Fig. 3 显示 N=3 时 Pass@1 从 70.8% 回落到 69.0%,作者归因于上下文变长稀释注意力,改进方向是按修复阶段动态检索相关 QA 条目、或对注入内容做摘要/去冗,把『lost in the middle』问题降到最低。第二,Resolver 对误导性 QA 的抵抗力不足:22 个 Pass→Fail 中有 5 个属误导性,且这 5 个里 QA 多数事实正确只是修复框架不对,API 调用反而增加 +11.40;改进方向是给 Resolver 加置信度校准与 QA-代码冲突检测,必要时主动证伪 QA 提示的位置。第三,对窄而深的议题知识可能欠覆盖:四类模板分布严重偏向 Mechanism & Behavior(74.4%),而 20/44 个 Fail→Pass 实例(45.5%)实际需要跨类别组合知识,说明单类别主导时易遗漏;可引入议题类型自适应的类别配额或迭代追加提问。第四,跨语言/跨生态泛化未验证:当前只在 Python 仓库验证,C++/Java 等编译型语言的构建系统、类型推断与外部协议约束差异大,模板与只读探索策略需重新调优。第五,对骨干模型成本结构的依赖:成本优势部分来自 DeepSeek-V3.2 的 MoE 稀疏激活,换到无稀疏激活的高价模型时 $0.073 这种经济性可能不成立,需要按 token 单价重新核算。

未来方向

作者提出的方向包括:将四类问题模板扩展为层级化类别、设计按议题类型自适应的模板、或从大规模修复轨迹自动学习类别模式;以及把静态前置注入升级为与修复轨迹耦合的动态获取,让 agent 在新假设涌现时按需请求并刷新知识,同时控制知识新鲜度与算力成本的权衡。基于本文成果可进一步延伸的方向我补充几点:一是把 QA 知识沉淀为可复用的跨议题记忆(呼应 EXPEPAIR/Agent KB 的双记忆思路),让相似议题不必重复探索;二是用强化学习训练 Questioner 与 Answerer(参考 RepoQA-Agent 的 MCTS+RL),把『问什么、怎么答』从提示工程升级为可优化的策略;三是把误导性 QA 检测做成显式的自一致性校验模块,结合测试反馈闭环地淘汰错误框架;四是在多语言、多生态(如 Java 的 Spring、Rust 的 cargo)基准上验证 QA 范式,并研究编译错误/类型反馈这类语言特有信号如何融入四类模板;五是把 Pass@1 之外的指标(补丁最小性、回归风险)纳入评测,回应 SWE-bench 测试充分性的质疑。

复现评估

复现性总体良好。代码与数据已在 https://github.com/LionLin2003/ACQUIRE 公开,论文专门设有 Data Availability 声明。评测基准 SWE-bench Verified(500 实例)公开可获取,骨干模型 DeepSeek-V3.2 为开源(671B 总参、约 37B 激活)、GPT-5-mini 为商用 API,基线方法均沿用各自原论文默认设置且都挂载在共享的 Mini-SWE-Agent 修复底座上,温度统一 0.0(Questioner 0.7),关键超参(每步超时、最大轨迹、单实例成本上限)在 Implementation Details 与补充材料中给出。提示模板(Questioner、Answerer、问题质量评估的 scoring 与 pairwise voting)完整收录在补充材料,LLM-as-judge 每个判断重复 10 次并做了位置偏差缓解。算力方面,每个实例成本被 cap 在 $2.0(Answerer)/ $3.0(Resolver),端到端 DeepSeek-V3.2 平均 $0.073/实例,500 实例规模在单卡或 API 配额下可承受;难点主要在于 N 个 Answerer 并行实例的编排与隔离 Docker 环境的搭建,以及对 SWE-bench 测试沙箱的依赖。综合看属中高复现难度,主结论(+3.8/+4.4 pp、轮次下降)应可在合理算力内复现。