资讯动态

【ASE 2026】MultiFixer:协调者-提议者多智能体框架修复多 hunk 缺陷|从自动化程序修复视角

发布时间:2026/10/3 2:39:57 来源:尧图企业网站定制
摘要本文解读 ASE 2026 论文《MultiFixer: A Coordinator-Proposer Based Multi-Agent Framework For Fixing Multi-Hunk Bugs》。该论文提出协调者-提议者Coordinator-Proposer多智能体修复框架 MultiFixer通过融合工具增强的 Bug 分析、五类细粒度修复上下文与hunk 级动态调度与候选选择把多 hunk 缺陷修复从一次性整包生成改造为逐步协调的搜索--选择过程其特别之处在于把修复顺序与候选是否可信都变成可测量、可消融的显式决策。实验表明在 Defects4J 全量 835 个缺陷上修复 326 个其中 62 个多方法、27 个多文件缺陷95 个唯一修复里有 46 个属于多 hunk并且该机制可迁移到 VUL4J、SEC-bench 与 PatchEval 三个漏洞基准为真实场景下的自动程序修复APR提供了重要借鉴。视频讲解点击观看 B 站视频摘要论文基本信息背景与动机研究主线从问题到结论基准/方法设计分类全景方法细节实验设计与结果结果对比总结关键发现局限性常见问题FAQMultiFixer 与 PReMM 到底差在哪里为什么 hunk 级补丁不能单独用测试验证提议者越多是否修复效果越好补丁规模只有 35为什么还能超过规模上千的基线这套机制能用在 Java 以外的语言吗论文自身有哪些需要读者留意的地方参考链接论文基本信息项目内容标题英文MultiFixer: A Coordinator-Proposer Based Multi-Agent Framework For Fixing Multi-Hunk Bugs标题中文协调者-提议者多智能体框架修复多 hunk 缺陷作者Haichuan Hu, Chunrong Fang, Ye Shang, Jiawei Liu, Weifeng Sun, Guoqing Xie, Chenxing Zhong, Quanjun Zhang机构南京理工大学 南京大学 新加坡管理大学会议ASE 2026Munich, Germany2026-10-12 至 10-16arXivarxiv.org/abs/2607.26591项目网站zenodo.org/records/21223018背景与动机多 hunk 缺陷是自动程序修复APR长期回避的一块硬骨头。论文引用的一项 835 个 Defects4J 缺陷的统计显示接近 50% 的真实缺陷涉及多个 hunk而修复成功率随 hunk 数显著上升而明显下降。更关键的是评测口径问题ChatRepair 与 ThinkRepair 这类主流方法只评测单行、单 hunk、单方法的 483 个缺陷这意味着剩下 352 个更复杂的缺陷被排除在评测之外。论文对这一现象给出了一个相当直接的判断——选择性评测实质上损害了 LLM 真实修复能力的客观性。图 1修复成功率随 hunk 数显著下降。Defects4J 中近 50% 的缺陷涉及多个 hunk而 ChatRepair / ThinkRepair 只评测 483 个单 hunk 缺陷。从研究脉络看这条线上的工作分成四代。第一代是模板与预训练模型式修复依赖大量训练数据且泛化受限第二代是免训练提示词方法ChatRepair 用对话式反馈、ThinkRepair 用思维链迭代但它们把修复当作一次性生成第三代是智能体方法RepairAgent 把外部工具交给 LLM开始具备规划能力第四代才专门处理多 hunkITER 最早区分单 hunk 与多 hunk 修复并提出迭代精修PReMMOOPSLA 2025与本文最接近——它用依赖聚类把多方法缺陷分解成若干簇再套用固定的分治策略MultiMend 与 BIRCH 也沿着依赖分解这条线走。真正的缺口有两个。其一是修复顺序多个 hunk 之间存在语义与逻辑依赖例如某个 hunk 必须先引入字段另一个 hunk 才能初始化它顺序错了下游 hunk 就失去了可依据的不变量。PReMM 的分治顺序是预先固定的而真实缺陷的依赖关系会随修复进度变化。其二是hunk 级补丁无法用测试单独验证hunk 之间的交互会掩盖单个补丁的效果把某个 hunk 的补丁单独拿去跑测试通过与否都不能说明问题。论文因此提出三个必须解决的挑战——仓库级修复上下文、修复顺序调度、以及 hunk 级的补丁生成与选择。研究主线从问题到结论图 5MultiFixer 论文的研究主线——从多 hunk 缺陷占比与成功率下降到顺序与选择成为显式决策最终落到 326 个正确修复与 46 个多 hunk 唯一修复Mermaid 流程图。基准/方法设计MultiFixer 的整体设计由四阶段组成每一阶段对应上文一个缺口。阶段 1 是工具增强的 Bug 分析。专职 AgentBugAnalyzer模拟人类开发者在 IDE 里的调试路径先看错误栈对应的代码再用工具判断可疑变量、方法调用与相关元素逐步缩小范围。它装备了8 个工具GetProjectStructure、GetImportOfFile、GetClassSkeleton、GetFieldType、GetVariableType、GetMethodBody、SummarizeContext与Exit。其中SummarizeContext值得单独注意——它让 Agent 自主压缩工作上下文对应人类有限的短期记忆。所有工具基于JavaParser做静态分析实现工具调用上限为20 次。最终输出一份含根因、相关代码与初步修复方案的 bug 报告。阶段 2 构造修复上下文。论文只用五类信息buggy hunk 列表含所在类与方法、hunk 周边代码、失败测试用例的代码、失败报告的前五行、以及阶段 1 的 bug 报告。上下文粒度是消融实验的变量之一line-level 与 method-level 表现接近class-level 明显更差。阶段 3 是协调者-提议者循环。协调者负责两件事挑下一个待修 hunk以及在 $K$ 个提议者产出的候选里选出最优者。提议者的温度在 $[0,1]$ 区间均匀分布三个提议者时取 0、0.5、1.0以保证候选多样性。阶段 4 是两阶段精修。补丁若编译失败进入语法精修循环编译通过后若测试失败进入测试精修循环。补丁规模因此有一个显式上界$B_{\text{patch}} \le R \times (1I_{\text{syn}}I_{\text{test}})$取 $R5$、$I_{\text{syn}}3$、$I_{\text{test}}3$上限为35。作为对照ChatRepair 的补丁规模上限是 500RepairAgent 约 117。分类全景图 6MultiFixer 的组成结构——BugAnalyzer 工具分析、五类修复上下文、协调者-提议者循环依赖图调度、聚类置信度选择、结构回退检查与两阶段补丁精修Mermaid 流程图。方法细节方法的真正创新集中在阶段 3可以拆成三个可独立消融的模块。第一是 hunk 依赖图。协调者用静态分析工具配合 bug 报告构造有向图 $G(H,E)$每条边 $e_{ab}$ 带有关系类型 $r_{ab}$ 与置信度 $w_{ab}$。关系类型的来源是对人类开发者补丁的观察论文归纳出三种代表性模式对称修复多个 hunk 是同类缺陷一个 hunk 上的修复策略可以复用例如 Chart_19 需要为两个不同对象插入 null 检查、逐步修复存在明确前置关系先引入字段再初始化、先定义辅助函数再调用、以及失败相关性由 bug 报告或失败信息把 hunk 关联起来。修复过程中协调者依据依赖图与当前修复状态选下一个 hunk$h_{\text{next}}C(G,S_t,U_t)$。一个 hunk 的补丁被接受后修复状态与依赖图同步更新。第二是候选聚类与打分。$K$ 个提议者独立生成候选集 $C_t{c_1,\dots,c_K}$ 后协调者先归一化并按相似度聚类为 $\mathcal{P}t{P_1,\dots,P_m}$定义聚类置信度 $\kappa(c)|P(c)|/K$——被越大簇支持的候选越可信。再加上三项归一化到 $[0,1]$ 的打分$s{\mathrm{ctx}}(c)$ 衡量与 bug 报告及局部代码上下文的一致性$s_{\mathrm{state}}(c)$ 衡量与当前部分补丁的状态一致性$s_{\mathrm{rel}}(c)$ 衡量与目标 hunk 的相关性。最终 $S(c)\kappa(c)s_{\mathrm{ctx}}(c)s_{\mathrm{state}}(c)s_{\mathrm{rel}}(c)$取 $c^*\arg\max S(c)$。第三是结构回退检查。接受 $c^$ 之前协调者会检查它是否违反基本结构约束缩进不一致、括号不配、非法替换函数签名、或把目标 hunk 之外的上下文代码复制进来。一旦违规就回退到得分最高且结构合法*的候选。更保守的一条是替换型 hunk 若没有任何结构安全的候选就保留原 hunk宁可少改也不引入编译失败插入型 hunk 则退回得分最高的非空候选。图 2MultiFixer 总览——Bug 分析 → 修复上下文构造 → 协调者-提议者补丁生成 → 两阶段补丁精修。论文把这一设计的认知依据归结为生成-识别不对称Generation-Recognition Asymmetry模型从候选中识别正确解比直接生成正确解更容易。动机例子是 Defects4J 的 Mockito_17——GPT-3.5 连续五次自我纠错都修不对但把失败补丁与开发者补丁放在一起让它选它能选中正确的那个。这也解释了为什么提议者负责探索、协调者负责比较与筛选自我纠错容易陷入认知固着反复探索相似的修复方向。实验设计与结果评测覆盖四个基准、五种语言。Defects4J提供 395v1.2加 440v2.0共835个真实 Java 缺陷并按故障位置划分为单行、单 hunk、单方法、多方法、单文件与多文件六类漏洞侧使用VUL4J的 79 个 Java 漏洞35 单 hunk 加 44 多 hunk、SEC-bench的 65 个 C 多 hunk 用例以及PatchEval的 120 个 JavaScript、Go 与 Python 多 hunk 用例。指标有两个Correct FixCF要求补丁通过全部测试且人工核对与开发者补丁语义一致Plausible FixPF只要求通过测试。两者的差额正是过拟合补丁的活动空间。消融实验在 Defects4J 的372 个多 hunk 缺陷上进行。主结果如下表。同处 835 缺陷全量 scope 时MultiFixer 修复 326 个、产生 412 个 plausible 补丁比最强的全量基线 PReMM 多19个正确修复、37个 plausible 修复。方法ScopeCFPF多方法多文件ChatRepair (337)162—00ThinkRepair (483)205—00RepairAgent (835)16418673MultiMend (835)149259179PReMM (835)3073754515MultiFixer (835)3264126227优势的来源很清晰在单行、单 hunk 这类简洁类别上MultiFixer 与基线几乎持平一旦进入多方法与多文件类别它分别做到 62 与 27明显超过 PReMM 的 45 与 15、MultiMend 的 17 与 9、RepairAgent 的 7 与 3。这说明收益确实来自跨 hunk 的协调能力而不是普遍性的修复能力提升。调度机制的消融进一步支撑了这一点。GPT-3.5 底座下完全去掉调度、一次生成整包补丁只有52个多 hunk 修复按开发者补丁顺序逐个修复提升到81随机打乱顺序是79而协调者-提议者达到89。调度策略GPT-3.5 / Claude-3.5多 hunk 缺陷GPT-3.5Claude-3.5w/o Scheduling整包生成5273Sequential Schedulingproposer381116Random Schedulingproposer379113Coordinator-Proposerproposer389129换底座时Claude-3.5-Sonnet 把正确修复推到 420 个、plausible 补丁 514 个修复率 50.29%刷新了 Defects4J 的公开记录Qwen2.5-Max 为 349DeepSeek-V3.2-Exp 为 339Qwen2.5-72B 为 311。提议者数量的敏感性实验则给出一反直觉的结论把提议者从 3 增加到 5三次运行的补丁选择变得不稳定性能下降 3% 到 10%——候选池过大反而引入了噪声与冲突补丁。漏洞修复是这套机制能否迁移的关键检验结果在三个基准上一致领先。基准多 hunk 子集本文ChatRepairPReMMMultiMendVUL4J7935 单 hunk / 44 多 hunk24含 5 个多 hunk15——SEC-benchCN6511925PatchEvalJS/Go/PythonN120196178VUL4J 上最强的对照是 APR4Vul16 个MultiFixer 多修 8 个去掉 oracle 故障定位后仍修复 22 个其中多 hunk 从 5 降到 3说明端到端场景下会损失一部分能力但仍具竞争力。成本方面多 hunk 缺陷平均每例约 929 秒、15 万 token、0.30 美元约为单 hunk373 秒 / 6 万 token / 0.12 美元的 2.5 倍平均下来每例 620 秒与 0.20 美元仍优于 ChatRepair210,000 token / 0.42 美元与 RepairAgent270,000 token / 0.54 美元。方法Patch/BugTime/BugToken/BugMoney/BugChatRepair (2024)≤ 500≤ 5h210,000$0.42RepairAgent (2024)117920s270,000$0.54MultiFixer (SH)≤ 35373s60,000$0.12MultiFixer (MH)≤ 35929s150,000$0.30MultiFixer (Avg)≤ 35620s100,000$0.20图 3Defects4J-v1.2 上的修复重叠分析——MultiFixer 相对四个最强基线新增 44 个唯一修复。图 4Defects4J-v2.0 上新增 51 个唯一修复95 个唯一修复中有 46 个属于多 hunk 缺陷。重叠分析回答了它是不是只是把基线修好的缺陷再修一遍。在 Defects4J-v1.2 上MultiFixer 相对 RepairAgent、ChatRepair、ThinkRepair、PReMM 四个最强基线新增44个唯一修复在 v2.0 上新增51个。合起来看95 个唯一修复里有 46 个是多 hunk 缺陷——恰好对应论文开篇指出的那部分被主流评测排除的缺陷。结果对比总结图 7调度策略消融对比——整包生成 52、顺序调度 81、随机调度 79、协调者-提议者 89最终在 Defects4J 全量 835 个缺陷上修复 326 个Mermaid 流程图。关键发现顺序本身承载语义约束同样是逐 hunk 修复按开发者顺序是 81随机顺序掉到 79而由依赖图驱动的协调者-提议者达到 89GPT-3.5plausible 124。顺序不是形式问题而是 hunk 间依赖的外显。收益集中在复杂类别多方法修复 62、多文件修复 27而简洁类别与基线基本持平说明机制的适用边界与设计目标一致。更小的补丁池也能赢补丁规模上限 35不足 MultiMend≥100的三分之一、ChatRepair≤500的十三分之一却取得 326 CF / 412 PF。平均成本 620 秒与 0.20 美元。精修的增益主要来自语法层无精修 40加语法精修到 67再加测试精修到 89GPT-3.5。五个底座都因语法精修多修 19 至 38 个缺陷而测试精修更难触发。候选池不是越大越好提议者从 3 增到 5三次运行的选择稳定性下降性能跌落 3%–10%噪声候选的代价超过了多样性收益。跨语言可迁移VUL4J 24/79、SEC-bench 11/65、PatchEval 19/120在非 Java 基准上同样领先说明起作用的是机制而非数据集特异性。局限性作者在 Discussion 部分自己报告了两类主导失败模式。第一类是过量 hunk 循环当缺陷包含 10 个以上 hunk 时协调者容易把 20 步预算耗在反复修订已经修好的 hunk 上——16 个此类缺陷里有 11 个68.75%出现该行为。第二类是复杂跨 hunk 依赖当依赖是多方向或多层级时某个 hunk 的正确编辑依赖另外多个 hunk 的决策随机抽样的 20 个失败样本中有 7 个35%属于这一类。此外还有三点需要读者留意。其一是定位依赖主实验使用 oracle 函数级故障定位去掉之后 VUL4J 的单 hunk 修复维持 19/35但多 hunk 从 5 降到 3。其二是成本随 hunk 数上升多 hunk 缺陷的成本约为单 hunk 的 2.5 倍因为每个 hunk 都要并行请求多个提议者。其三是数据泄漏风险Defects4J 与 VUL4J 中的缺陷修复时间可能早于现代 LLM 的发布论文用同一底座与设置、多种修复类型、多种编程语言以及时间分离分析2022 年之后的漏洞修复四道防线来降低该风险但无法完全排除记忆污染。作者的判断是主要瓶颈在 hunk 级协调策略本身而不是候选数量——更可靠的依赖建模与调度预算分配比扩大提议者池更有效。常见问题FAQMultiFixer 与 PReMM 到底差在哪里PReMM 同样面向多 hunk但它用依赖聚类把多方法缺陷分解成若干簇后套用一套预先固定的分治策略MultiFixer 把修复顺序当作动态决策依据依赖图与当前修复进度在每一步重新选择 hunk并允许回改已经生成的 hunk。消融实验里去掉调度只剩 52顺序调度 81协调者-提议者 89这个差额就是动态调度的价值。为什么 hunk 级补丁不能单独用测试验证因为 hunk 之间存在生产者-消费者式依赖。例如动机例子中的 Mockito_17一个 hunk 记录序列化意图另一个 hunk 在组装接口时消费这个意图单独把任一 hunk 的补丁拿去跑测试都无法判断它是否正确。论文因此改用上下文一致性$s_{\mathrm{ctx}}$、状态一致性$s_{\mathrm{state}}$与相关性$s_{\mathrm{rel}}$三项打分配合聚类置信度来选择候选。提议者越多是否修复效果越好不是。论文用 100 个多 hunk 缺陷做敏感性实验提议者从 3 增加到 5 后补丁选择在三次运行间变得不稳定性能下降 3% 到 10%。原因是大候选池会引入噪声或相互冲突的补丁其代价超过多样性收益。补丁规模只有 35为什么还能超过规模上千的基线因为规模小并不等于搜索空间小。MultiFixer 把预算花在选对而不是多生成上每个 hunk 只保留被协调者判定为结构安全且上下文一致的候选完整补丁才会被计入规模。对比结果显示 35 个候选的上限仍取得 326 CF / 412 PF平均每例 620 秒与 0.20 美元低于 ChatRepair 与 RepairAgent。这套机制能用在 Java 以外的语言吗目前证据支持机制可迁移。除 Java 的 Defects4J 与 VUL4J 外论文在 SEC-benchC65 个多 hunk 用例上修复 11 个、在 PatchEvalJavaScript、Go、Python120 个多 hunk 用例上修复 19 个均优于 ChatRepair、PReMM 与 MultiMend。不过静态分析工具目前基于 JavaParser迁移到新语言需要替换工具层实现。论文自身有哪些需要读者留意的地方除了上述限制阅读时还应注意两点正文反复使用在本文报告的比较中in the reported comparisons收窄结论摘要与引言的口径不完全一致另外提交版本的正文保留了多处空花括号组说明仍带有修订工具留下的痕迹。这些不影响方法本身但提示读者在引用具体数字时回到原表核对。参考链接论文 arXiv 摘要页论文代码与实验配置ZenodoDefects4J真实 Java 缺陷基准ChatRepairISSTA 2024RepairAgentICSE 2025PReMMOOPSLA 2025ITERICSE 2024给大家推荐一款自用写文献综述、无虚构文献的 AI复旦大学 FudanNLP 团队自研 切问学术官网qiewenpaper.com覆盖3.6 亿篇可溯源真实中英文文献能自动整合文献观点生成规范综述还能挖掘研究创新点、复现实验配合视频教学新手快速上手文献综述写作后记博客的关键词集中在编程、算法、机器人、人工智能、数学等等持续高质量输出中。讨论QQ群白拾的小屋 (750365700)⭐B站账号白拾的物理AI组会活跃于知识区和动画区✨GitHub主页YhbCode000工程文件

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑