NEE's Blog

SWE-CI: 基于持续集成评估 AI Agent 的代码库维护能力

March 08, 2026

本文翻译自 SWE-CI: Evaluating Agent Capabilities in Maintaining Codebases via Continuous Integration,原载于 Hacker News。

引言:从「修 Bug」到「维护代码」的范式转变

大语言模型(LLM)驱动的 AI Agent 在自动化软件工程任务方面已经展现出强大的能力,SWE-bench 等基准测试证明了这一点。但这里存在一个关键问题:现有的基准测试都聚焦于静态的、一次性的任务,而现实世界中的软件开发是一个长期维护的过程。

想想你日常的工作状态:需求不断变更、功能持续迭代、代码库在数月甚至数年间不断演进。这种动态的维护过程,恰恰是当前基准测试所忽略的。

阿里巴巴和中山大学联合团队提出的 SWE-CI 基准测试,正是为了填补这一空白。

为什么需要新的评估范式?

现有基准的局限性

从 HumanEval、MBPP 到 SWE-bench,再到 Terminal-bench 和 τ-bench,这些基准测试构建了一个多粒度、多场景的代码智能评估生态。但它们都采用了一个共同的范式:快照式评估(snapshot-based evaluation)

在这种范式下,Agent 接收一个完整的需求,然后一次性生成解决方案。问题在于:

  • 一个写出了硬编码的脆弱修复的 Agent
  • 另一个写出了干净、可扩展代码的 Agent

两者可能通过相同的测试套件。它们在可维护性上的差异,在这种评估范式下是不可见的

Lehman 定律与软件维护成本

经典的软件工程研究告诉我们:

  1. Lehman 定律指出:软件质量在维护过程中会内在地下降
  2. 维护活动占软件生命周期成本的 60%-80%

只有当代码库必须演进时——新需求到来、接口变更、模块需要扩展——早期设计决策的代价才会显现。一个习惯于产出结构混乱代码的 Agent,会发现每一次后续修改都变得更加困难,最终无法跟上变化。

这带来了一个关键洞察:Agent 的代码维护能力只能通过长期演进过程来揭示,过去决策的后果会在连续的变化中累积。

SWE-CI:首个基于 CI 循环的代码库级基准

核心设计理念

SWE-CI 的核心创新在于从静态的、短期的功能正确性转向动态的、长期的可维护性

每个任务由真实仓库中的 base committarget commit 定义,平均跨越 233 天71 个连续 commits 的真实演进历史。Agent 需要从 base commit 出发,通过多轮迭代最终通过 target commit 的所有测试。

数据构建流程

SWE-CI 的数据构建经过四个精心设计的步骤:

Step 1: 仓库收集
├── GitHub 上所有 Python 仓库
├── 维护时间 >= 3 年
├── Stars >= 500
├── 包含配置文件和单元测试
└── 开源许可证(MIT/Apache-2.0)
    → 筛选后:4,923 个仓库

Step 2: Commit 区间提取
├── 仅保留主分支
├── 识别依赖不变的最大子序列
└── 排除修改行数 < 1000 的区间
    → 得到:8,311 个候选对

Step 3: 环境构建
├── 自动生成 Dockerfile
├── 运行单元测试验证
└── 自修复机制注入缺失依赖
    → 得到:1,458 个候选对

Step 4: 案例过滤
├── 验证测试可启动
├── 测试通过数差异 >= 5
└── 按时间跨度和 commit 数排序取 Top 100
    → 最终:100 个任务

最终数据集包含来自 68 个不同仓库 的 100 个样本,每个样本的 base/oracle 代码库之间至少涉及 500 行源代码修改(不含测试文件)。

双 Agent 评估协议

SWE-CI 采用 Architect-Programmer 双 Agent 协议来模拟真实世界的持续集成循环:

Architect Agent(架构师)

职责:基于测试差距生成高层需求文档

工作流程:

  1. Summarize(总结):审查所有失败的测试,识别根本原因
  2. Locate(定位):检查源代码,将失败归因于具体缺陷
  3. Design(设计):制定改进计划,输出需求文档

文档规范:

  • 增量式:每次不超过 5 个最紧急需求
  • 高层级:描述预期行为,将实现选择留给程序员

Programmer Agent(程序员)

职责:根据需求文档维护代码

工作流程:

  1. Comprehend(理解):将高层需求转化为明确的代码规范
  2. Plan(规划):规划实现这些规范所需的编程工作
  3. Code(编码):实践计划,实现需求

这种设计刻意让 Programmer 由需求文档驱动而非直接由测试差距驱动,这与持续集成的快速迭代理念保持一致。

EvoScore:可维护性的量化指标

ISO/IEC 25010 标准将可维护性定义为:软件在不引入缺陷或降低现有质量的情况下被有效修改的程度。关键在于,可维护性无法在单个快照中观察——它只能通过连续修改来体现。

为此,SWE-CI 引入了 EvoScore(Evolution Score)

首先定义 归一化变化(Normalized Change)

当改进基准时:a(c) = (n(c) - n(c₀)) / (n* - n(c₀))
当退化时:a(c) = (n(c) - n(c₀)) / n(c₀)

其中 n(c) 是代码库 c 通过的测试数量,c₀ 是基准代码库,c* 是目标代码库。

然后通过未来加权平均聚合 N 次迭代:

EvoScore = Σᵢ γⁱ · a(cᵢ) / Σᵢ γⁱ

γ > 1 时,后期迭代获得更大权重。这直接反映了 ISO 定义:真正可维护的代码库是那些随着演进仍然易于修改的代码库。一个牺牲短期速度换取更干净、更可扩展设计的 Agent,将获得更高的 EvoScore。

实验结果:三个关键发现

研究团队对来自 8 个提供商的 18 个模型进行了全面评估,总消耗超过 100 亿 tokens

发现 1:LLM 的代码维护能力正在加速提升

在同一个提供商家族内,新模型总是获得更高的分数。2026 年之后发布的模型比其前代表现出更大幅度的提升,这表明当前 LLM 的代码能力正在从静态的 Bug 修复快速演进到持续的长期代码维护。

在所有评估的模型中,Claude Opus 系列在整个观察期内保持领先,GLM-5 也是表现突出的强劲选手。

发现 2:不同提供商对代码可维护性的重视程度不同

通过调整 γ 值来观察模型排名的变化:

  • γ < 1:早期迭代权重更高,奖励优先考虑即时收益的模型
  • γ > 1:后期迭代权重更高,奖励优化长期改进的模型

结果显示:

  • MiniMax、DeepSeek、GPT:倾向于长期收益
  • Kimi、GLM:倾向于短期回报
  • Qwen、Doubao、Claude:在不同设置下保持相对稳定

这种差异可能反映了不同提供商采用的训练策略,而同一提供商内部的相对一致性表明其内部训练流水线基本稳定。

发现 3:当前 LLM 在长期维护中仍难以控制回归

回归(Regression) 是衡量软件质量稳定性的核心指标——如果一个单元测试在代码更改前通过但更改后失败,这个更改就被认为引入了回归。

SWE-CI 测量了在整个代码维护过程中没有发生回归的样本比例(零回归率):

  • 大多数模型的零回归率 低于 0.25
  • 只有 Claude-Opus 系列 中的两个模型 超过 0.5

这表明,尽管 LLM 在基于快照的代码修改任务上表现出显著进步,但在完全自动化、长期、多轮的软件开发和维护场景中仍面临重大挑战。

对开发者的启示

如果你正在使用 AI 辅助编程

  1. 不要只看一次性任务的表现:一个模型在「修复这个 Bug」上表现出色,不代表它在「长期维护这个代码库」上同样出色
  2. 关注代码质量而非只是功能正确:让 AI 生成代码时,要审查其可扩展性和结构设计
  3. 警惕回归风险:在多轮迭代中,务必运行完整测试套件,防止 AI 的修改破坏已有功能

如果你正在评估 AI 编程工具

  1. 选择符合实际场景的基准:如果你的使用场景涉及长期维护,SWE-bench 可能不足以反映真实能力
  2. 考虑引入 EvoScore 式的评估:将后期迭代表现纳入考量,而非只看最终结果
  3. 关注零回归率:对于生产环境,稳定性比单次成功率更重要

总结

SWE-CI 的出现标志着 AI 代码能力评估的一个重要转折点:从「能否写出正确的代码」到「能否维护健康的代码库」。这对于我们理解和改进 AI 辅助编程工具具有重要意义。

关键要点:

  • 范式转变:从快照式评估到演进式评估,从功能正确性到长期可维护性
  • 真实数据:100 个任务来自真实仓库,平均跨越 233 天和 71 个 commits
  • 双 Agent 设计:模拟真实 CI 循环,让过去决策的后果在后续迭代中累积
  • EvoScore 指标:未来加权设计,奖励真正可维护的代码
  • 现状揭示:即使是 SOTA 模型,在长期维护场景下仍面临回归控制的挑战

论文资源:

  • Hugging Face: https://huggingface.co/datasets/skylenage/SWE-CI
  • GitHub: https://github.com/SKYLENAGE-AI/SWE-CI
comments powered by Disqus