Claude 就是管不住自己,非要写代码注释
闭嘴吧,SWE-bench
AI 在「什么时候该写代码注释」这件事上的判断力实在太差,我宁可它们一条都别写。我的全局 AGENTS.md(很短,一共 769 个词)里有这么两条:
除非我明确要求,否则不要添加任何注释或文档。
除非你的改动让已有注释变得不正确,否则不要改动它们。
最近我主要在用 Claude,结果它根本不听!还是经常加注释。这么强的模型,指令遵循能力居然还能这么差,挺让人意外的。
不过这只是我的个人感觉。我决定系统性地量化一下这个效果,于是就有了这个新评测:「闭嘴吧,SWE-bench」。
方法
我从 SWE-bench Verified 里随机抽了 100 个任务,来源是标注者认为需要 15 分钟到 1 小时才能完成的那 261 个任务(我排除了「15 分钟以内」那一档,因为一行修复根本没什么地方好写注释)。系统提示词取自 inspect_evals,并在末尾加上我的两条规则:
除非 issue 明确要求,否则不要添加任何注释或文档。
除非你的改动让已有注释变得不正确,否则不要改动它们。
issue 基本从来不会明确要求写注释,所以那个「除非」的从句只是为了让提示词更接近我 AGENTS.md 里的写法。
为了检测注释,评分脚本会把 agent 改动过的每个 .py 文件,分别拿到改动前和改动后跑一遍 Python 的 tokenize 模块。它收集 COMMENT token,以及出现在语句开头的 STRING token(也就是 docstring)。只要新文件里有、旧文件里没有的注释或 docstring 文本,就算作新增。只是位置挪动的注释不算数。
如果 agent 只是把已有注释改了措辞,是会被标出来的。我的做法是再看一遍 diff:如果同一段差异里有一条被删掉的相似注释,就把这条改写的标记丢掉;对于 docstring,只要新增行不到一半,也不计。这类改写算不算合理,取决于 agent 的代码改动是否“让旧注释变得不对”,但这种情形太少,我干脆信它一回,只统计新增的注释。做个小实验,这样足够了。
结果
100 个任务里,Fable 5.1 有 33 个加了新注释或 docstring,Gemini 3.8 Flash 也是 33 个。标准误差在 5 个百分点左右。GPT-6 Astra 表现不错:它解决的问题更少,但在“闭嘴,SWE-bench”这个基准上还是赢了 Claude;它只有 6% 的任务加了新注释,落在我这套粗糙启发式的误差范围内(我看了这 6 条注释,感觉都算合理)。完整记录在这里:Fable 和 Astra、Gemini。
另外还有 6 个任务,Fable 只是改了已有注释或 docstring 的措辞。我人工核对过,其中 5 个合理:要么是修复让旧文字不再正确,要么是新增了参数,docstring 必须跟着补上。
下面是一条新增注释的例子:
```
locs = locs[(vmin <= locs) & (locs <= vmax)]
+ # Avoid having an offset / scientific notation in a legend
+ # as we don't represent that anywhere so it ends up incorrect.
+ # This could become an option (e.g. Continuous.label(offset=True))
+ # in which case we would need to figure out how to show it.
+ if hasattr(axis.major.formatter, "set_useOffset"):