9 月 13 号,凌晨一点多,我在 arXiv 上刷到一篇新东西。标题很直白——Not All Agents Are Equal,五个商业编码 agent 的代码质量和合并后维护。37,623 个 PR,2,807 个仓库。9 页,5 张图 2 张表。
我没读正文,直接翻到有数的那一页。
第一个跳出来的是回滚率:Codex 6.1%,人类基线 11.5%,Devin 14.5%。
画外音:那一刻我算盘都打完了,Codex 是不是人类的两倍好。
这个念头我压了三分钟,掐了。回滚率不测代码质量,它测的是"人类愿不愿意把这段代码撤掉"。这两件事隔着十万八千里——一个是代码的属性,一个是运维现场的心情。
revert 的触发条件我数得出来:CI 挂了、需求改了、作者自己发现写歪了、scope creep 了,还有最经典的一种,另一个 PR 先合进去,手快有手慢无,它被顶掉了。里面只有前两条跟"这段代码好不好"沾点边。agent 的 PR 通常窄、聚焦,一个 PR 就干一件事。人类不一样,人类会在同一个 PR 里顺手改个变量名、顺手升一格依赖,而恰恰是这种"顺手",最容易在 merge 之后被人一笔 revert 掉。
所以 6.1% 对 11.5%,读出来的更像是"agent 的 PR 比人类窄",不是"agent 写的代码好一半"。至于那个 OR 0.50,我见过太多人直接把它当百分比念,OR 不是这么用的。
我没有分层数据。但如果作者下一版愿意补一刀,按 diff 改动行数切层,我赌差距会被吃掉一大半:
按 changed_lines 分层(我猜的,不是论文的数)
1-20 行 Codex ~4.8% Human ~7.2%
21-100 行 Codex ~6.0% Human ~10.1%
>100 行 Codex ~9.3% Human ~13.8%
依据是:改动越大,需求在其中变化的概率越高,被撤的概率就越高。跟你代码是 agent 写的还是人手敲的,关系不大。
第二个数是安全异味。全厂商合起来,agent 代码含安全异味的可能性低于人类,OR 0.63。作者说功劳主要在硬编码凭证和 eval 类构造更少。
我信一半。
eval 我完全信。agent 基本不写 eval——这东西在训练语料里从头到尾都以反面教材出场,它没理由去碰。硬编码凭证那半,我持保留意见。不是 agent 更谨慎,更可能是它压根不知道你的 secret 该从哪来——它写的是新代码,而新代码里读 env 是默认姿势。人类往老代码里硬塞凭证,是因为上一版就是这么写的,他照抄。这是新老代码的差别,不是人和 agent 的差别。
更麻烦的是取数范围:只扫 diff 的新增行。真正出事的 agent 代码,往往不在新增行里,在新增行和原有代码的接缝上——权限边界、事务范围、并发、错误码的语义。这些东西没有一个静态扫描器看得见。
所以 OR 0.63 的偏差方向是确定的:它只会让 agent 显得比真实情况干净。有方向的偏差比随机噪声危险得多。噪声多跑几遍还能平均掉,有方向的偏差你采样一万次,它还是朝那边歪。
顺带说一句数据窗口。2024 年 12 月到 2025 年 7 月。论文 2026 年 9 月 12 号挂上去,DOI 还没注册。
十四个月。
我不觉得这是作者的疏忽,这是这个领域度量本身的困境:任何 agent 横评,发布那天就已经开始过期,而你总得冻结一个窗口才有的算。这五家在窗口两端根本不是同一个东西,把整段混进一个桶里取均值,算出来的数在描述一个不存在的对象。
所以拿它当"现在该用哪个工具"的操作指南,那是缴智商税。拿它当"一年前的历史切片"读,才对。这个区别我最近越来越在意——我发现自己会不自觉地,把任何带百分比的东西默认成今天的现实。
方法上有一件事我想夸。AIDev 数据集加 58,792 条缓存的 GitHub API 响应,这个组合挺聪明,绕开了跑全量 API 的限流地狱。作者还把流水线代码、统计报告和图全公开了。不可复现的 agent 横评我这半年见得太多,有流水线我就能自己去挑子集重跑。
那到底还剩哪个数能看?
Copilot 的 PR 拿到最多的人工审查和变更请求;Claude Code 的 PR 等第一次人工 review,中位数 12.6 小时。
这是全文我唯一一个不打算拆的数——等等,它也有混杂,我不能因为上面拆累了就放过它。
Copilot 是 IDE 内联的,人写代码的时候它就在旁边递,review 是顺手的事,成本极低。Claude Code 是"我把任务交出去然后去干别的",PR 出来的时候人根本不在电脑前。所以 12.6 小时测的是交互形态,不是"这份代码看着可疑"。
这个解释太顺了,顺到我有点警惕。顺着它走下去,"审查强度"本身也成了混杂因素,那这篇论文里就找不出一个能直接读的指标。
也许这就是正确的结果。
我最后给自己留下的判断只有一条:这篇论文的价值不在它给的那几个百分比,在于它把"审查"从背景板拽到了台前。它把 review 等待时长、变更请求数当一等公民指标在统计,一年前没人这么干。它等于在说:agent 的产出质量不是 agent 的属性,是 agent 加审查者这个联合系统的属性。
沿着这条往下推,会撞上一个让人不太舒服的推论:五家之间的差距里,至少有一部分是人的注意力分布不均造成的,跟模型能力无关。Copilot 的 PR 被改那么多次,那它到底算质量好还是差?取决于你怎么定义"好"。Devin 那 14.5% 的回滚里,有多少是它自己写歪了,有多少是把它当黑箱甩出去、没人盯,人自己造的?
我没答案。我猜作者也没有——他只是把这个口子留在这儿了。
扯远了,回正题。
我现在需要的是一个自己仓库的基线,不是任何行业均值。
my_baseline():
last_100_human_prs.revert / 100
last_
