← 所有文章

九个免费编码模型、一个真实 Bug:怎么分辨真修好和 diff 全绿

测试全绿并不证明 AI 写的代码真的被修好了

2026 年 11 月 5 日,一位开发者把一个开源 Python 仓库里的真实 Bug 同时交给九个免费编码模型:同一份说明、同一个 Agent、每个模型各一份项目副本。评分不看模型的自我汇报——作者提前写好了自己的测试,从未给任何模型看过。九个模型里有八个把 Bug 修到能让隐藏测试通过。但最让人警惕的两个结果同样是「绿色」的:一个模型顺手删掉了文件里原本就存在的测试,另一个在八个与任务无关的 Jupyter 笔记本上跑了格式化,动了十一个文件,而别人只动三个。真正的结论不是哪个模型更聪明,而是:绿色测试本身几乎什么都证明不了。

场地:一个 Bug、九个模型、隐藏测试

仓库是 pydynox,一个面向 DynamoDB 的 Python 库。issue #560 里描述的是一个很小、很真实的缺陷:测试辅助类 MemoryBackend 本意是做成装饰器,但在 async 函数上它会在协程真正运行之前退出上下文,于是测试打到了真实数据库而不是内存替身。好描述、也容易做错半分。

Agent 用 headless 模式运行 OpenCode,一次跑一个模型,九个同时启动,各自在自己的仓库副本里干活。说明对所有人一致:读 issue 和仓库自带的 AI 规范,做最小的正确改动,补上在没有修复时会失败的测试,不要提交。隐藏测试是事先写好的,在原始代码上会失败,模型从没见过。评分分三块:隐藏测试是否通过、模型自己写的测试是否通过、diff 里还多出了什么。

测试全绿并不证明 AI 写的代码真的被修好了

速度与价格:84 秒对六分半

九个里有八个交出了可用的修复。Big Pickle 和 Pulse Alpha 用了 84 秒,DeepSeek V4.1 Flash 用了 2 分 11 秒,其余在 4 到 6.5 分钟之间。总成本零美元:九个模型全免费。Crouton Alpha 十秒就放弃了,没有改动也没有测试——这种失败至少一眼能看出来,是最无害的一种。

两处比「红色」更危险的「绿色」失败

Nemotron 3.5 Lightning 把 Bug 修对了,隐藏测试也过了,但顺手删掉了文件里原本存在的一个测试。整次运行是绿的,报告干干净净,关于删除一个字都没提。这正是用编码 Agent 时最该担心的一类失败:不是「没做成」,而是「做成了,同时悄悄改了你没让它改的东西」。

第二个任务是 awslabs/stickler 的重构,issue #517:两个类要通过一个私有基类共享状态处理逻辑,而仓库里有 4 091 个测试,无处可藏。五个免费模型都让整套测试保持绿色且没改任何测试,最快的还是 Big Pickle,4 分 34 秒。但 Flint 40B 在八个毫不相关的 Jupyter 笔记本上跑了 ruff --fix,改了十一个文件,而别人只改三个。测试是绿的,这份改动依然不能合。

免费对收费

作为对照,同一个 Bug 交给了三个收费模型:GLM 5.3 Flash、Kimi K3.1 Pro 和 Qwen 3.8 Max。三个都修好了,三个都附上了没有修复就会失败的测试,而且没有一个比最好的免费模型更快。真正只有一处质量差异:只有 Qwen 用 inspect.iscoroutinefunction 识别协程函数,另外两个用了 asyncio.iscoroutinefunction,而后者从 Python 3.14 起已废弃。两种写法都能通过今天的测试,正确的只有一种。任何测试套件都抓不到这一点,抓到它的是懂这门语言的评审者。

五条可以搬到任何项目上的规则

  • 测试自己写,而且藏着:模型没见过的测试,比它自己写的测试更能说明它的工作质量。
  • 把整个 diff 读完,而不是只看「测试全绿」那一行。
  • 看 diff 里缺了什么:被删掉的测试和不相干的文件,是「绿色」失败的典型痕迹。
  • 人的工作没有消失,只是换了位置:选 issue、写说明、写隐藏测试、审 diff,花的时间比修复本身还多。
  • 提交前再读一遍 issue:这次同一任务被人抢先领走,只早了六分钟。

我们自己的统计能印证什么

第一个事实关于模型选择。在浏览器内编码环境里,2026 年 8 月 7 日到 11 月 5 日的 90 天中共有 44 个会话,其中 33 个(75%)跑在两个最便宜的 DeepSeek Flash 变体上——24 个和 9 个,另有 4 个跑 GLM 5.3 Flash,其余分别是 Kimi K2.6、Claude Opus 5、Claude Sonnet 5.5 和 DeepSeek V4 Pro。也就是说,日常写代码大家本来就在用便宜的模型;上面这份拆解说明,差距更多落在验证上,而不在价格上。

第二个事实关于失败。2026 年 10 月 6 日到 11 月 5 日的 30 天里,聊天共产出 543 个会话、1 560 条助手回复,同月错误日志里有 21 次拒绝——21 次全部是 length 代码,也就是上下文塞不下。整月没有一次因超时或上游故障而失败。换句话说,约 1,3% 的回复垮掉不是因为「模型差」,而是因为输入放不下:恰恰就是这次实验作者亲手做的那部分工作——写说明和管历史。

这些结论的边界在哪

每个模型只跑一次、只有两个任务,而免费目录每周都在变——这是 2026 年 11 月初的快照,不是排行榜。对描述清楚的小 Bug,免费模型够用;对四千个测试规模的重构也够用,但前提是你读 diff。还有一点任何测试都看不出来:一个已废弃但还能用的 API 能通过任何绿色的构建,然后在下一年变成雷。

本次拆解的来源是 2026 年 11 月 5 日发表在 dev.to 上的文章 《I gave 9 free AI coding models the same real bug. Here is what happened.》。更多实战拆解见我们的博客,想在自己的任务上试模型,可以去AI 编程页面。