让三个AI编程工具独立实现同一打砖块游戏,然后匿名互评。结果显示各工具在物理实现、架构设计、测试覆盖等方面有明显差异,评测者能准确识别不同工具的风格特征。
我之前想做一个有趣的小实验。
而且,正如这类小实验偶尔会发生的那样,它的结果比我预想的要有趣得多。
我给三个编码 Agent 布置了完全相同的任务:
Gemini(Gemini 3.7 Flash)
题目是根据同一份规格说明书构建一个 Arkanoid 风格的浏览器游戏。
这算不上什么特别开创性的事情。Arkanoid 的体量足够小,一个 Agent 可以在一轮会话中构建完整版本,但也足够复杂,能暴露出物理效果、架构、UI、音频、控制、测试以及整体决策能力上的差异。
重要的是,它们都从相同的指令出发。
然后我让它们开始工作。
事后不再帮它们修正错误。不会说"你漏掉了这个功能"。也不会因为某个东西看起来有点奇怪就再给某个人一次机会。
它们自己认定完成的就是提交物。
但构建游戏本身其实并不是最有趣的部分。
之后,我把三款游戏匿名化(分别标记为 CL、CO 和 GE)还给了三个 Agent。
它们不知道哪款游戏是谁做的。只是被告知它们在评判三份参赛作品,提交者以姓名首字母署名。
然后事情就变得——怎么说呢——有意思起来了。
你其实可以玩到这三个版本:
Gemini:https://arkanoid-gemini.pinkpixel.dev
Codex:https://arkanoid-codex.pinkpixel.dev
Claude:https://arkanoid-claude.pinkpixel.dev
三款游戏都能运行,但它们完成任务的思路差异很大。
这种差异在我仔细看代码之前就已经显现出来了。
第一个差异:工作时间
我原本并没有打算把运行时间纳入实验考量,所以很遗憾我没有拿秒表坐在那里。
这些是粗略的观察,不是基准数字。
但差异大到不可能被忽视。
Gemini:大约 5 分钟 Codex:大约 10 分钟 Claude:超过 20 分钟
Gemini 绝对是飞速完成。
这并不特别令人震惊,因为 Gemini Flash 模型本身就非常快,但看到它如此迅速地生成一个完整的可玩游戏仍然令人印象深刻。
Codex 的用时符合我的预期。它按合理的节奏推进实现,做了检查,然后完成。
Claude 完全是另一种生物。
它运行测试。它启动游戏。它截图。它检查那些截图。它回溯自己的工作。它执行视觉检查。它验证行为。
Claude 总运行时间中有相当大一部分似乎是在测试和验证,而不是实现。
它消耗的 token 数量也显著多于另外两个 Agent。
乍一看,你可以这样总结:
Gemini 直接交付了。Codex 在工程化。Claude 则像是在为审判准备证据一样审查自己的工作。
但后来我看了看它们实际构建了什么。
它们不同的思路在代码中体现出来
Claude 产出的实现体量最大。
它的版本有 12 个阶段、一个包含音乐的大型程序化音频系统、详细的碰撞处理、无障碍功能、响应式行为、多阶段 DOH Boss,以及大量的额外打磨。
Codex 几乎是走向了另一个方向。
它的实现更小、更克制,但工程角度极其审慎。它构建了一个无头游戏核心,将游戏状态与渲染和输入分离,包含自动化测试,甚至编写了工具来验证源文件保持在原始规格说明的最大行数限制内。
Gemini 快速交付了一个扎实、可玩的实现,包含了大量真实的 Arkanoid 功能,但相比另外两个,它在过度验证和架构工作上投入较少。
到这一步,我已经觉得很有趣了。
然后我对它们做了匿名化处理。
是时候让 Agent 们互相评判了
评委只知道参赛作品如下:
我让每个 Agent 检查这些提交并排名。
是的,我没有告诉它们谁做了哪个。
CL 是 Claude。CO 是 Codex。GE 是 Gemini。
所以 Claude 在不知情的情况下为自己投票了。
Codex 在不知情的情况下为自己投票了。
Gemini 把 Claude 投了第一。
我没有想到这个结果会如此有趣。
Claude 和 Codex 对自己有偏见吗?
技术上是的。它们各自选择了自己的作品。
但我不认为"AI 模型是自恋狂"是一个特别有用的结论。
它们不知道哪个实现是自己的。它们甚至不知道这些是 AI 做的。
可能有其他什么事情正在发生,而我发现这有趣得多。
每个 Agent 似乎都喜欢反映其自身"好软件"理念的软件。
Claude 的评判标准非常重视完整性、深度、碰撞质量、音频 sophistication、无障碍功能、响应式行为以及对完整功能集的遵循。
这些恰好是 Claude 在实现阶段投入了大量努力的领域。
Codex 更强调架构、自动化测试、自包含性、验证、正确性和工程纪律。
这些恰好是 Codex 自身提交物最突出的特征。
换句话说,一个 Agent 的实现选择和评判标准可能来自相同的底层偏好。
模型根据其内心"好"的定义来构建软件。
然后,当被问到好软件是什么样的,它会选择与这些优先考量最匹配的实现。
这是一个比简单的自我偏好有趣得多的可能性。
而 Gemini 让整个事情变得更有意思了,因为它打破了这个模式。
Claude 实际上在视觉上更喜欢 Codex
有一个细节让这个结果更难被 dismissal 为偶然的自我选择。
在检查代码之前,Agent 们被要求评估截图。
Claude 对视觉设计的排名是:
所以 Claude 并不认为自己的游戏看起来最好。
它明确认为 Codex 有更强的视觉构图。
直到检查了实现之后,Claude 才把 CL 推到总排名第一。
它的理由基本上是:Codex 有更好的视觉构图和出色的工程纪律,但 Claude 的作品覆盖了原始规格说明的更多内容,并将几个困难的系统实现得更深入。
Codex 得出了几乎相反的结论。
它也喜欢 CO 的视觉设计,但认为其测试、紧凑的架构、自包含的实现和验证足以将 CO 置于更大的 Claude 提交物之上。
这个分歧可能是整个实验我最喜欢的部分。
没有一个评委简单地说"我的看起来更好"。
它们对什么才是最重要的存在分歧。
仍然有一个共识赢家
使用一个简单的评分系统:
最终分数是:
Claude 赢得了盲评共识。
它获得了两张第一名的票和一张第二名的票。
更重要的是,其中一张第一名票来自 Gemini。
所以 Claude 额外投入的时间和 token 似乎确实买到了一些东西。
但这引出了另一个问题。
Claude 实际上是最佳性价比吗?
Claude 产出了共识赢家。
但根据我的粗略观察,它花费的时间是 Codex 的两倍多,是 Gemini 的四倍左右。
它消耗的 token 数量也远远超过其他两者。
那么到底谁"赢"了?
如果你唯一的衡量标准是最佳最终产物,Claude 有强有力的论据。
如果你需要尽快获得一个可用的原型,Gemini 突然看起来更有吸引力。
而 Codex 可能落在中间:比最快的提交物有显著更多的工程严谨性,但又没有像 Claude 那样花费那么多时间和算力。
这给了我们至少三种不同的赢的定义:
最快的可用结果
相对于 Agent 投入的最佳结果
我原本并没有打算测试这些。
我只是想让三个 AI 构建 Arkanoid。
我在下一次实验中要改变什么
现在我想再做一次。
第一轮教会了我应该收集的不仅仅是最终应用。
对于未来的轮次,我想记录:
精确的墙上时钟完成时间
创建的文件数量
大致的代码行数
浏览器或截图检查
完成前的自我修正次数
我特别感兴趣的是看到相同的行为模式是否会在不同类型的应用中重复。
Arkanoid 奖励游戏逻辑、物理效果、控制、渲染和打磨。
开发者工具可能会以不同的方式奖励架构和可用性。
一个 UI 密集型的项目可能会产生另一个完全不同的结果。
而一个故意模糊的产品 prompt 可以测试当我不告诉它具体要构建什么时,每个模型会展现出多少产品判断力。
如果 Claude 反复花费四倍的时间并获胜,这是有用的信息。
如果 Gemini 反复在四分之一的时间内惊人地接近,这也是有用的。
如果 Codex 反复以强大的工程能力和合理的效率落在两者之间,这也同样有趣。
而如果这些模式中没有任何一个在下一轮中保留下来?
那也很有趣。
这绝对不是科学基准
三个 Agent 构建一个 Arkanoid 游戏显然没有足够的证据对任何模型做出泛泛的断言。
不同的 harness、工具访问、上下文、模型更新、采样以及纯粹的随机性都很重要。
我不是想从我的浏览器里创建一个新的权威编程基准。
这主要是为了好玩。
但我认为以这种方式来看待编码 Agent 是有用的。
大多数比较完全集中在模型是否能解决一个任务。
Agent 增加了另一个维度。
当你放手让模型工作时,它选择如何工作?
它立即交付?
它检查自己的 UI?
它在应用已经能运行之后还在继续打磨?
它认为什么重要到值得花费 token?
以及,也许最有趣的是:
当它看别人的工作时,它认为"更好"实际上意味着什么?
我开始这个实验是想看看哪个 AI 能构建最好的 Arkanoid 游戏。
最后我对三个 Agent 揭示的它们认为软件应该如何构建的思考方式更感兴趣了。
对于一个随意的周六下午实验来说,不算糟糕。