aider 在 SWE Bench 主榜取得 18.9%:交互式代码编辑与自动化评测方法的完整剖析
本文基于 aider 官方仓库中的评测博文(aider/website/_posts/2024-06-02-main-swe-bench.md),完整还原 aider 在 SWE Bench 主榜上以 18.9%(pass@1、无提示)取得当时 SOTA 的具体方法:双模型两轮回避式评测流程、"plausibly correct" 判定标准、验收测试的隔离机制,以及评测流程中实际使用的 --yes、--test-cmd 等命令行参数在仓库源码中的落地实现。读完本文,你可以理解一次"像开发者一样使用 aider 解决 GitHub issue"的自动化评测是如何构建的,并能在自己仓库中复现相应的命令行配置。
核心成绩:18.9% 的主榜 SOTA
aider 在 SWE Bench 主榜上取得 18.9% 的成绩,构成一项 SOTA 结果。当时榜单上最高的公开条目是 Amazon Q Developer Agent 的 13.8%,另一份被广泛引用的公开结果是 Devin 报告的 13.9%(后两者均出自其各自的技术报告与官方榜单,本文仓库仅作为评测文章记录这些数据)。
需要强调的评测口径:
- 所有成绩均为 pass@1:agent 内部可以多次尝试,但最终只挑选、返回唯一一个候选解,只有这个候选解参与验收测试并计入分数;
- 未使用 SWE Bench 提供的
hints_text; - 评测样本与 Devin 评测相同:随机抽取的 570 个 SWE Bench 问题,便于与已有公开结果直接对比。
这一结果建立在 aider 此前在更易的 SWE Bench Lite 上取得 SOTA 的基础上(见仓库内的另一篇博文 SWE Bench Lite 结果)。
设计哲学:交互式工具,而非 Agentic Agent
博文中最值得注意的论点是:aider 达到这一成绩,主要依赖其既有的三个方向的能力,而不是某种大规模 agentic 编排:
- 静态代码分析:通过 repo map 等机制为模型提供代码库结构上下文;
- 可靠的 LLM 代码编辑:结构化的编辑格式与落盘校验;
- 务实的 UX:自动修复 lint 与测试错误:编辑后自动跑 lint、跑测试,把失败信息喂回模型迭代修复。
aider 刻意保持"agentic 行为"窄而有限,以规避三个代价:长延迟、高 token 成本、用户需要反复 review 错误方案。博文中还明确说明,评测时 aider 不使用 RAG、向量检索、外部工具,也不给 LLM 联网搜索或单方面执行代码的权限。
定位上,aider 首先是一个"工程师在真实代码库中用聊天界面完成真实工作的交互式工具":用户提出变更,实时看到代码编辑;模型可以顺带修 lint/测试错误,但用户始终保有完整的交互控制权,可以随时把误解拉回正轨,避免时间与 token 的浪费。
从源码结构看,这一"交互可控"的定位贯穿实现:aider/coders/base_coder.py 中的编辑落盘、lint 修复、测试回喂循环是核心路径,而不是一个自主规划执行器。
评测方法:两轮尝试与"plausibly correct"判定
评测流程如下(与 Lite 评测相同思路,为控制主榜成本将总尝试次数限制为两次):
- 第一轮:在每个问题的 git 仓库中启动 aider + GPT-4o,把问题描述作为"用户"的第一条聊天消息提交。此后 aider 按正常运行,但所有建议一律自动接受,无需用户确认。
- plausibly correct 判定:使用一个简单 harness 检查 aider 产出的代码是否"貌似正确"——即 aider 报告自己成功编辑了仓库,没有引入语法错误,也没有破坏任何既有测试。若不满足,则重试。
- 第二轮:若第一轮无貌似正确的解,harness 从零启动 aider + Claude 3 Opus 再试一次。
- 兜底:两轮都没有貌似正确的解时,harness 选择"最貌似正确"的那个——即编辑/lint/测试问题最少的解。
一个关键的公平性约束:
aider 与评测 harness 在整个过程中只能看到每个问题仓库中"既有"的测试。 被扣出的"验收测试"(held-out acceptance tests)只在评测结束后,用于统计哪些问题被正确解决,全程对 aider 不可见、不可运行。
这一点直接决定了该成绩的可信度:它不是"看过答案"的成绩。
命令行视角:评测等价于 aider --yes --test-cmd pytest
博文指出,整个评测过程"与开发者用 aider 解决一个 GitHub issue 的方式相同",具体对应三条操作:
- 在仓库里启动
aider --yes --test-cmd pytest——告诉 aider 自动接受每个建议,并用 pytest 跑测试; - 在聊天中粘贴 GitHub issue 的 URL 或文本,aider 会拉取 URL 内容并尝试解决 issue;
- 若产出未通过 lint/测试,开发者可以 用 git 回退改动,换
aider --opus再试。
这些参数在当前仓库中都有明确实现:
--test-cmd:定义于 aider/args.py,help 为 "Specify command to run tests",默认空列表。它会被传入 coder(见 aider/main.py 中test_cmd=args.test_cmd),并写入系统提示的平台信息段落——在 aider/coders/base_coder.py 中,若开启了--auto-test,提示会说明"用户的 pre-commit 会运行该测试命令",否则说明"用户偏好该测试命令",从而让模型知晓可用的验证手段。- 自动接受确认:博文写作时使用的
--yes,在当前仓库中已更名为--yes-always(定义于 aider/args.py,help 为 "Always say yes to every confirmation")。根据 aider/website/HISTORY.md 的记录,命令行上仍可缩写为--yes,因此aider --yes --test-cmd pytest这一写法至今有效。 - 测试执行的落点:
/test命令最终调用 aider/commands.py 的cmd_test,当未显式传参时回退到self.coder.test_cmd;实际执行走cmd_run,仅在命令非零退出时才把输出追加进聊天(见 aider/commands.py 的add_on_nonzero_exit分支),失败输出会以用户/助手消息对的形式喂回模型,驱动下一轮修复。 - 相关开关:
--auto-lint默认开启(aider/args.py),--auto-test默认关闭(aider/args.py)。评测 harness 在自动接受的前提下,把 lint/测试结果作为"是否 plausibly correct"的信号。
此外仓库还提供了非交互入口:--test 标志表示"运行测试、修复发现的问题后退出"(aider/args.py),配合 aider/main.py 中在 --test 且无 --test-cmd 时报错 "No --test-cmd provided."(aider/main.py)的逻辑,构成脚本化调用场景。
结果明细:GPT-4o 与 Opus 的分工
先给出一个重要事实:aider + GPT-4o 单独做一次尝试就取得了 17.0%,本身已是 SOTA;主结果是在此基础上叠加 Opus 补救轮得到的 18.9%。
下表完整继承自原文档,拆解 570 个问题中各轮"提出的解"(proposed solutions)与最终被验证正确的 108 个解的来源。"提出的解"要么是一个 plausibly correct 的解(编辑、lint、测试均无遗留错误),要么是两轮中"最貌似正确"的解(编辑/lint/测试错误最少):
| 轮次 | 模型 | 提出的解 | 占提出解比例 | 正确解决的解 | 占正确解比例 | 对主榜分数的贡献 |
|---|---|---|---|---|---|---|
| 1 | aider + GPT-4o | 419 | 73.5% | 87 | 80.6% | 15.3% |
| 2 | aider + Opus | 151 | 26.5% | 21 | 19.4% | 3.7% |
| 合计 | 570 | 100% | 108 | 100% | 18.9% |
可以看到 GPT-4o 贡献了绝大多数正确解(87/108),Opus 轮作为低成本补救贡献了 21 个。注意"对主榜分数的贡献"一列(15.3% + 3.7%)与"GPT-4o 单独评测的 17.0%"之间的差异,这正是下一节要解释的。
"貌似不正确但实际正确"的解,与分数非单调性
plausible 的判定只是 aider 自己报告"编辑完成、lint 修复、测试通过",但一个解不 plausible 并不意味着它不能通过验收测试。博文列出了几种典型原因:
- 既有失败的测试:仓库在 aider 介入前就有失败的测试。aider 可能没修它们,但验收测试只关心"测试的通过/失败模式是否与人类金补丁(gold patch)一致"——只要某个测试在金补丁下同样失败,它的失败就是允许的;
- 既有的 lint 问题:如果遗留的 lint 问题落在测试覆盖不到的代码路径上,就不会影响验收结果;
- 编辑报错:当 LLM 未按系统提示中的编辑格式给出编辑、aider 无法落盘时会报告编辑错误。此时模型可能已经"跑偏",要求了冗余或无关的编辑,但这类未落盘的编辑未必是致命的。
由此引出一个反直觉的统计现象:GPT-4o 在双模型合表里只占 15.3%,但单独跑一轮 GPT-4o 却能得 17.0%。原因是:允许 Opus 在 GPT-4o 之后补救时,Opus 可能产生一些"不正确但更 plausible"的解,它们在"挑最貌似正确者"的规则下挤掉(eclipse)了 GPT-4o 那些"不 plausible 但实际正确"的解。
结论由此推出:
增加尝试次数不保证单调提升解决数量。 新解可能解决新问题,也可能挤掉丢弃先前"不 plausible 但正确"的解。幸运的是,净效果通常是提升或至少持平——在这两次(主榜与 Lite)评测的所有尝试中都是如此。
分数的最终计算方式
评测 harness 对 570 个问题各产出一个"提出的解"后,由独立的评估脚本完成最终计分:
- 对每个解运行完整测试套件,包括扣出的验收测试;
- 丢弃 aider 对测试文件的任何修改,确保验收测试使用的是正确的、未被改动的测试套件(防止"改测试凑结果");
- 将该解的测试结果与人类金补丁的测试结果逐一对比:通过/失败模式一致,即判定该问题被正确解决;
- 验收测试只在 aider 与 harness 之外运行,只用于事后统计;在 aider 尝试解决问题的全程中,它们从未被运行、使用或暴露。
最终结果:aider 正确解决了 570 个实例中的 108 个,即 18.9%。
博文致谢部分还提到,Albert Örwall 将 SWE Bench 评测脚本容器化(Docker 化),使验收测试跑得更快、更容易、更可靠——这是该结果能在有限成本内完成的工程基础。
pass@1 口径与参考基线
最后明确计分口径,避免与 pass@N 混淆:
- 文中所有成绩为 pass@1 且无 hints_text;
- agent 内部可以多次尝试,但最终只挑选一个候选解参与验收测试并计入分数;
- 对比之下,pass@N(N>1)是 N 次尝试、N 个解全部评测,任一通过即算成功。
原文档给出的同口径(pass@1、无 hints)公开参考结果:
| 系统 | 成绩 | 评测规模 |
|---|---|---|
| Devin(认知 AI 技术报告) | 13.9% | 570 个实例 |
| Amazon Q Developer Agent(官方榜单) | 13.8% | 2,294 个实例 |
| SWE-Agent + GPT-4(官方榜单) | 12.5% | 2,294 个实例 |
| AutoCodeRover | 10.6% | 2,294 个实例 |
| SWE-Agent + Opus(官方榜单) | 10.5% | 2,294 个实例 |
其中 AutoCodeRover 的 10.6% 取其论文 Table 2 中 ACR-avg 的平均 pass@1 值(其 GitHub 页面展示的是未明确标注的 pass@3 结果),以保证同口径可比。
可继续深入的仓库入口
- 评测方法原始文章:aider/website/_posts/2024-06-02-main-swe-bench.md,Lite 版本方法:aider/website/_posts/2024-05-22-swe-bench-lite.md
- 命令行参数定义:aider/args.py(
--test-cmd、--auto-test、--auto-lint、--yes-always、--test) - 测试命令执行与失败回喂:aider/commands.py
- 系统提示中 lint/test 命令注入:aider/coders/base_coder.py
- 参数到 coder 的装配:aider/main.py
- git 回退操作文档:aider/website/docs/git.md
需要说明的适用前提:本文成绩与流程对应 2024 年 6 月的评测设定(GPT-4o + Claude 3 Opus、570 个抽样实例、两轮尝试)。仓库后续版本中部分参数已更名(如 --yes → --yes-always,命令行仍可缩写为 --yes),若要在当前版本复现类似流程,建议以 aider/website/docs/config/options.md 中的参数说明为准。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
