加载中

同一个模型,三个 AI 编程助手同一份需求,各做三遍

AI 编程助手是你在终端里说一句话、它自己去读文件改代码跑命令的那种工具,英文叫 harness。 我们挑了三个,接上同一个大模型,发同一份 26 KB 的需求文档, 让每个自己做一版手机 App 原型。每个做三遍,跑在互不相通的容器里。

做三遍,是因为做一遍分不清「它就是更强」和「这次运气好」。

先说清楚

三个工具不在同一个阶段

Claude Code 和 Codex CLI 已经公开发行,dsh 还在内测。下面 dsh 出的那些问题,放在内测阶段看是正常的,不该读成「这产品不行」。

工具版本阶段接模型的方式

协议不对称。Claude Code 接 DeepSeek 要经过一层 Anthropic 兼容转换,另两个走原生协议。这层转换本身就可能有损耗。它属于实验的结构问题,不是谁做得好坏。

先摸一下

三个 App 都在这儿,能点

8 月 3 日第一批跑出来的三份 Web 产物,原样嵌在下面。可以滑,可以点,跟在手机上打开是一回事。

关于数据:三家各自建的表名完全不同,却共用同一个 Supabase 数据库,所以同时展示时最多只有一家能读到真数据,另两家走自己的降级路径,浏览器控制台里能看到 404。要看某一家真实的数据形态,得单独恢复它的库再访问。这件事本身也说明:判分必须逐个恢复数据,否则会系统性低估。

九个产物 · 108 张截图

同一个工具跑三遍,出来的是三个不同的产品

九份产物的同一批页面,同一个视口、同一个时机截下来,横着摆在一起。先看 Claude Code 的三张首页。

招呼语、信息结构、有没有天气、底栏怎么写,三次全不一样,连虚构的用户名都换了人。Codex 和 dsh 各自三遍也是这样。

所以跑一遍测不准的不只是快慢。连「这个工具会做出什么样的东西」都测不准。

下面十二个页面,每一页都可以自己横着比一遍。

12 个页面 × 9 份产物

点任意一张看原图
发现 02

谁做得更好?质量上没比出来

规则事先定好:先看两组均值差多少,再看各组自己三遍之间最快和最慢差多少。均值差要是没超过后者,说明差异淹在噪声里,这条比较作废。

每次跑完花了多久(分钟)
一次运行 该组最快到最慢

耗时口径是 taskWallMin,以运行日志最后一次写入为准,不含进程跑完之后的挂起时间。

两两比较 · 20 条交互验收得分
比较均值差较大一方自身极差结论
两两比较 · 耗时
比较均值差较大一方自身极差结论

发现 03

只跑一遍,会得出一个错的结论

这就是后来把每组从跑一次改成跑三次的原因。第一遍那个差距真实发生过,只是它说明不了任何事。

比排名有用

有一条标准,大家一起做不到

通过(附可复核证据) 验证过,确实没做到 找不到入口,没法验证

判分器是 gpt-5.6-sol,跟被测的 v4-flash 不是同一个模型。它给每份产物单独写一份 Playwright 脚本,逐条真实点击验证。判定分三态:pass 必须附可复核证据(选择器、点击前后的 DOM 差异、几何断言数值),fail 是验证过确实不满足,unverifiable 是找不到入口或没法验证。「没验证」不许算成通过,宁可 unverifiable 多一点。

原始记录

每次运行,逐条摊开

质量和成本得成对看。每个工具自己决定什么时候收尾,脱开耗时单说质量,比出来的东西不可靠。

组轮次验收得分耗时产物文件结束方式跑完后挂起run-id
机器自动探测的结果 (区分度很低,看下面第 2 条限制)
产物能打开首屏控制台错误探到的路由数可点击元素死按钮
读之前

这个实验有哪些毛病

这一节比上面的分数更值得看。下面每一条都会影响结论能推到多远。

  1. 三遍不够做统计检验。三次只能看出差异是不是每次都复现,做不了显著性。所以页面上所有比较都是同一套写法:均值差没超过各自的极差,就作废。
  2. 机器自动探测穿不透这批产物。三家交的都是手机端单页应用,界面靠 JavaScript 状态机切,切页时网址不变。所以探到的路由数几乎都是 1,可点击元素 0 到 9 个,明显低于实际。这一层只有「能不能打开、首屏多快、控制台报不报错」三项能用。
  3. 20 条验收的得分不拿来排名。各家的 DOM 结构、路由方式、触发词完全不同,判分脚本没法共用,每份都是一次性重写的,探索深度和选择器质量对不齐。这些差异会直接进分数,而它跟被测对象无关。要真分高下得走人工盲评:同一视口、同一时机的截图去掉标签,由人打分。
  4. 判分这套基础设施本身修过四个致命配置错误。都是会把正常产物判成完全不可用的那种。有的产物用 fetch('../data/…') 取上级目录的数据,托管根目录选错就卡在启动页、可交互元素为 0;有的自带 Node 服务提供接口,纯静态托管拿不到数据;有的是 Flutter CanvasKit 渲染,整个界面画在 canvas 上,DOM 里一个元素都没有,用 DOM 断言判它必然零分。四个都已逐个实测修掉,但没法保证不存在第五个。
  5. dsh 用的版本比另两家新。它跑在快照 deb20cd 上,而 Claude Code 与 Codex 用的是各自的正式发行版。跨工具比较时这一点要记在账上。
  6. dsh 有一次作废,原因在外部。DeepSeek 接口返回 503 Service is too busy,dsh 重试两次仍失败,这一轮以 error 结束。不是 harness 的问题,已经补跑一次顶替,三次都是有效样本。
  7. dsh 干完活经常不自己退出。无人值守跑批必须外挂回收机制,否则一次白占几个小时。
  8. Claude Code 多过一层协议转换。它经 DeepSeek 的 Anthropic 兼容端点接入,另两个走原生协议。工具调用和推理内容的透传都可能有损耗,它和另两家的差别不能全算在 harness 头上。
  9. 两轮指令合并成了一轮。原始用例是两轮:先发需求文档,再发自主迭代指令。但 dsh 的无头模式和会话续跑互斥(--prompt 不接受 --resume)。为了让三家条件一致,两轮合并成一次发出。
  10. 「能在 Xcode 里 build」这条没法验。三家都跑在 Linux 容器里,编译不了 iOS,统一记为不适用。三家自己也都如实声明了这一点。