想象你是一位经营繁忙餐厅的厨师。你拥有一份复杂的食谱(你的软件代码)和一套严格的厨房规则(你的持续集成,或 CI 系统)。每次你调整食谱,厨房的自动化检查员都会对其进行审查。这位检查员不仅品尝食物,还会检查炉灶是否开启、食材是否新鲜、厨师是否遵守了安全规则,以及摆盘是否得当。
有时,检查员会拒绝这道菜。也许是盐放错了,也许是烤箱温度不对,又或者是食谱要求的某种食材 pantry 里已经没有了。修复这些被拒问题很难,因为问题可能不在于食谱本身,而在于厨房的设置或规则。
问题所在:修复的“黑盒”
目前,旨在修复代码的计算机程序(自动化程序修复)就像那些只盯着食谱书的厨师。它们非常擅长修正配料表中的拼写错误,但当问题出在烤箱坏了、买错了香料,或者厨房规则已变更时,它们往往束手无策。现有的针对这些修复程序的测试过于简单;它们假设厨房是完美的,仅检查食物味道是否对劲,却忽略了整个厨房混乱的现实。
解决方案:CI-Repair-Bench
本文作者构建了一个名为CI-Repair-Bench的全新、逼真的训练场。你可以将其想象为“真实且混乱的餐厅厨房模拟”。
- 真实数据:他们并非使用虚构的问题,而是从 GitHub 上 103 个实际软件项目中收集了 567 个“被拒菜肴”的真实案例。
- 全面检查:为了证明修复有效,该系统不仅仅进行“品尝测试”。它会重新运行整个厨房检查流程:检查炉灶、食材、安全规则以及最终的味道。如果这道菜在任何一项检查中失败,该修复即被视为失败。
- 多样性:他们将失败情况归类为 12 种类型,范围从“摆盘凌乱”(格式问题)到“烤箱坏了”(环境错误),再到“我们没有正确的面粉”(依赖问题)。
实验:AI 厨师能修复吗?
研究人员测试了四种不同的"AI 厨师”(大型语言模型),看它们能否仅凭检查员的笔记(错误日志)来修复这些被拒的菜肴。
以下是他们的发现:
- “简单”修复:AI 在修复“摆盘”问题上出奇地出色。如果错误是“你的代码格式不正确”或“你漏掉了一个逗号”,AI 大约有 35% 的概率能修复它。这就像一位擅长把盘子擦干净的厨师。
- “困难”修复:AI 在处理复杂问题时表现极差。当问题是“烤箱坏了”(环境问题)或“我们需要某种特定品牌的面粉但尚未安装”(依赖问题)时,成功率降至接近零(通常低于 9%)。AI 无法判断问题不在于食谱,而在于厨房本身。
- “阅读笔记”因素:AI 的成功很大程度上取决于它阅读检查员笔记的能力。
- 智能阅读(基于代理):当 AI 被指示仔细阅读冗长杂乱的笔记、进行总结并逐步思考时,它的表现要好得多。
- 关键词搜索(基于检索):当 AI 只是在笔记中搜索关键词(像简单的搜索栏一样)时,它容易混淆且失败率更高。
- 类比:这就像一位通读整封投诉信以理解语境的厨师,与一位只寻找“烧焦”一词就断定食物烧焦的厨师之间的区别。
核心结论
该论文得出结论:虽然 AI 在修复微小、具体的代码错误方面正变得更好,但在理解软件在现实世界中如何运行的宏观图景方面,它仍然非常糟糕。
- 当前局限:AI 可以修复“拼写错误”和“风格”问题,但当问题涉及环境、依赖项或复杂的系统配置时,它就会迷失方向。
- 差距:在“应用补丁”(修改代码)与“通过全面检查”(使整个系统运行正常)之间存在巨大差距。AI 做出的大多数补丁看起来是正确的,但因未能解决底层的环境或依赖问题,而在全面厨房检查中失败。
简而言之,CI-Repair-Bench 是一项更严苛的新测试,它向我们展示了我们的 AI 修复工具究竟在何处强大(修复微小的代码细节),又在何处薄弱(修复运行代码的复杂现实世界系统)。它证明,要在现实世界中修复软件,我们需要的是能够理解整个厨房而不仅仅是食谱的 AI。
以下是论文《CI-Repair-Bench:一种基于 CI 工作流的仓库感知自动化补丁验证基准》的详细技术总结。
1. 问题陈述
持续集成(CI)是现代软件开发的中心环节,通过多阶段工作流强制执行仓库级别的正确性。然而,诊断和修复 CI 失败仍然是自动化系统面临的一项重大挑战。与传统程序修复不同,CI 失败通常涉及:
- 非代码工件:构建脚本、依赖规范、环境变量和工作流配置。
- 嘈杂的执行日志:冗长的多阶段日志,其中根本原因往往被掩盖,或位于与症状不同的阶段。
- 动态环境:由依赖解析、环境漂移或工具链不匹配引发的失败。
现有的自动化程序修复(APR)基准(如 SWE-bench、Defects4J)不足以应对该领域,因为它们:
- 将修复限制为仅针对源代码。
- 依赖以测试为中心的预言机(通过/失败),而非完整流水线验证。
- 假设固定且容器化的执行环境。
- 使用基于问题的输入,而非基于日志的诊断。
- 在缺乏现实世界复杂性的简化工作流上进行评估(例如条件执行、多作业依赖)。
2. 方法论:CI-Repair-Bench
作者引入了 CI-Repair-Bench,这是一个从真实世界的 GitHub Actions 执行中构建的大规模基准,旨在解决上述差距。
数据集构建
- 来源:103 个积极维护的 Python 仓库(根据星标数量和近期活动选择)。
- 规模:567 个 CI 失败实例,源自“从失败到通过”的提交对。
- 每个实例的组件:
- 仓库元数据:所有者、名称、分支。
- CI 工作流详情:YAML 配置和验证步骤。
- CI 日志与工件:失败作业的执行日志。
- 提交对:失败的提交和最近的后续通过提交。
- 真实补丁:源自提交对的经过验证的最小补丁,仅隔离与 CI 失败有因果关系的变更。
- 错误分类:失败被分为 12 种不同类型,包括代码格式、代码检查(Linting)、语法错误、运行时错误、测试失败、依赖问题、配置错误和环境错误。
- 验证:正确性 exclusively 通过 在原始(标准化)工作流下完整重新执行 GitHub Actions 进行评估。只有当整个流水线通过且不引入新失败时,修复才算成功。
参考修复框架
为了演示基准的使用,作者提出了一个参考的代理 CI 修复流水线,包含三个阶段:
- CI 日志分析:使用基于代理的迭代 LLM 策略,将嘈杂的日志分块、过滤并总结为结构化的失败报告。
- 故障定位:通过选择变更文件、基于因果证据细化候选项以及执行细粒度的行级定位来缩小搜索空间。
- 补丁生成:生成仓库级补丁。对于规则违规,优先使用确定性工具修复(例如运行代码检查器);对于复杂逻辑,则使用基于 LLM 的代码编辑。
3. 主要贡献
- CI-Repair-Bench:首个专为 仓库级别、CI 验证 的程序修复设计的基准。它支持对非代码工件的修改,并针对完整 CI 流水线而非孤立测试来验证修复。
- 参考修复流水线:一个模块化框架,集成了日志分析、故障定位和补丁生成,并使用四种不同的大语言模型(LLM)进行实例化以建立基线。
- 实证分析:一项综合研究,刻画了修复效果如何随不同的 CI 失败模式和模型能力而变化。
4. 实验结果
作者使用四种 LLM 评估了参考框架:GPT-5-mini、DeepSeek-Coder、DeepSeek-Chat 和 GPT-4o-mini。
整体性能
- 修复成功率(Pass@1):表现最好的模型(GPT-5-mini)仅实现了 18.9% 的成功率。最低为 7.9%。
- 定位与修复之间的差距:虽然故障定位(Top-1 准确率)在不同模型间相对一致(约 42-45%),但最终修复成功率差异超过 2 倍。这表明识别正确的文件是必要的但不足够;生成满足所有 CI 阶段的 正确最小变更 是主要瓶颈。
- 补丁应用与 CI 成功:约 73–89% 的应用补丁未能通过完整 CI 重新执行,突显了该基准与仅测试评估相比的严格性。
日志分析策略的影响
- 基于代理 vs. 检索(BM25):用轻量级 BM25 检索策略替换迭代式代理日志分析导致性能大幅下降。
- Pass@1 下降:跨模型范围从 28.0% 到 75.9%。
- 定位下降:Top-1 准确率下降了 24–37 个百分点。
- 结论:准确且富含推理的日志分析对于 CI 修复至关重要;简单的关键词检索无法捕捉诊断所需的语义上下文。
按失败类型的性能
修复成功率根据错误的“信号局部性”遵循清晰的三级层次结构:
- 高成功率(顶层):代码格式(35.5%) 和 代码检查(17.8%)。这些在日志中具有明确的错误位置,允许进行直接、确定性的修复。
- 中等成功率(中层):测试失败、运行时错误和语法错误(10–13%)。
- 低/零成功率(底层):依赖问题、配置错误和环境错误(成功率 <9%,常为 0%)。这些需要跨文件推理、外部上下文和迭代验证,而当前的单次通过 LLM 无法可靠提供。
5. 意义与影响
- 现实评估:CI-Repair-Bench 揭示了当前 APR 基准的局限性,这些基准往往因忽略环境和工作流约束而高估修复能力。
- 研究方向:结果表明,未来的 CI 修复系统必须超越单次代码生成。它们需要 仓库感知推理、依赖分析 和 迭代验证循环 来处理复杂的、非局部的失败。
- 工具差距:虽然 LLM 在工具强制规则(格式/代码检查)方面有效,但它们在“系统性”失败(依赖、环境设置)方面表现挣扎,表明需要结合 LLM 与专用静态分析和依赖解析工具的混合方法。
- 开放资源:该基准、数据集和参考代码已公开,为推进 CI 原生自动化修复研究提供了标准化的基础。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。