记一次对 Claude、GPT、Gemini、GLM、DeepSeek 真实评测
这是一个正在开发中的 Unity C# 项目。
本次我进行测试的是一份需求案,我已经做了好预制体,而模型需要编写代码。
这是一个皮肤系统的开发,主要需要实现皮肤界面 SkinUI 和皮肤属性界面 SkinAttrUI。
但是我们项目有需求实现的规范,所以模型需要阅读已有的代码并遵循这些规范。
界面大概是这样子的:
这是我提交给模型的所有指令:
可以说很多细节并未完全在需求案里讲清楚,如果不阅读项目代码那么很难完成任务。
而且细节非常多,指令遵循不好的模型可能会遗漏很多细节的实现。
环境
- 统一使用 VSCode Copilot + Unify Chat Provider。
- 统一使用 皮肤功能开发.md 文档。
- Kimi K2.5 来自官方 API。
- Minimax M2.1 来自 iFlow。
- GLM 4.7 来自官方 API。
- DeepSeek V3.2 来自官方 API。
- GPT 5.2(xhigh)、GPT 5.2-Codex(xhigh)、GPT 5.1-Codex-mini(medium) 来自 CodeX 订阅。
- Gemini 3 Pro、Gemini 3 Flash 来自 Copilot 订阅。
- Claude Opus 4.5、Claude Sonnet 4.5 来自中转站(宣称官 Key)。
速度
以下速度仅供参考,因为未排除受网络状况影响的因素。
- Minimax M2.1: 5 分钟。
- Kimi K2.5: 11 分钟。
- GLM 4.7: 12 分钟。
- DeppSeek V3.2: 22 分钟。
- GPT 5.2(xhigh): 25 分钟。
- Gemini 3 Flash: 22 分钟。
- Gemini 3 Pro: 11 分钟。
- Claude Opus 4.5: 15 分钟。
- Claude Sonnet 4.5: 16 分钟。
代码行数
- Minimax M2.1: (由于表现较差,所以直接没看,实在抱歉)
- Kimi K2.5: +1808, -148
- GLM 4.7: +1809, -4
- DeppSeek V3.2: +1947, -13
- GPT 5.2(xhigh): +1544, -10
- Gemini 3 Flash: +732, -4
- Gemini 3 Pro: +1191, -7
- Claude Opus 4.5: +1915, -4
- Claude Sonnet 4.5: +1670, -5
完成度
各模型:
Minimax:
- Minimax 最后总结留下了待确认事项:皮肤ID与物品ID的映射关系 - TbskinList 表格中没有直接的 itemId 字段,需要确认映射方式。灰色材质 - 需要确认项目中置灰材质的具体路径。资源加载方式 - 需要根据项目实际使用的 YooAsset 或其他资源管理系统调整。JumpSys 跳转 - 需要确认跳转ID的具体类型和使用方式。以上第一条其实在需求案中第 35 行已经写明:item 表格,皮肤 id 对应着物品 id。灰色材质也在第 149 行写明:如何置灰:获取 m_goGray 的材质设置为需置灰组件的材质。可参考其它界面的用法。资源加载方式和 JumpSys 跳转均可通过查看项目其它代码的写法来确认,不应该需确认。且查看实际代码,Minimax 编造了 JumpMgr.Instance.Jump(skin.jumpTo); 跳转代码和置灰材质代码,即使真的需要确认,那也应该留下 TODO。
- 未修改皮肤按钮的响应事件,无法打开皮肤管理界面。
- 未注册系统,这会导致 sys 的生命周期函数不生效。
- 未处理服务器数据,并说因为不知道数据结构,实际上是有的。
- 项目中的属性值类型比较特殊,有百分比、万分比和纯数值,Minimax 只处理了百分比和纯数值。
- 总结:由于编造了代码,所以项目无法编译,感觉 Minimax 并未参考足够的项目代码,且出现了很多幻觉,可能还有更多问题,但是没有再继续审查。
Kimi K2.5:
- 未注册系统,这会导致 sys 的生命周期函数不生效。
- 未修改皮肤按钮的响应事件,无法打开皮肤管理界面。
- 未对
m_textTitleUserLevel赋值。 - 没有使用
AddUIEvent注册事件。 - 未对服务器 Type 做转换。
- 总结:有一些没有正确处理的细节,但总体上还行。
GLM 4.7:
- 需求案没有说要做这个赋值:
m_textPreviewTypeSelect.text = _isWorldPreview ? "世界" : "城镇";,本意是好的,但这不应该做。 - 未按照需求案的要求显示
m_goBuildingPreview。 - 加载资源使用
AssetLoader.Instance.LoadAsset,项目中并不存在这个接口。 - 未修改皮肤按钮的响应事件,无法打开皮肤管理界面。
- 总结:本来刚开始 GLM 4.7 大部分代码都做的感觉挺好,但是竟然出现了好几个幻觉错误,使我没有继续审查下去。
DeepSeek V3.2:
- 需求案没有说要做这个赋值:
m_textPreviewTypeSelect.text = _isWorldPreview ? "世界" : "城镇";,本意是好的,但这不应该做。 - 编写了
LoadSprite函数,但是调用处是注释的:// m_imgTitleBg.sprite = LoadSprite(bgPath);。 - 对
m_textTitleUserLevel赋值Lv.99,但项目中存在用户等级数据,应该使用真实数据。 - 有一些奇怪的代码,看起来绝对不太对劲。
- 用错了
CloseWindow函数,应该使用Close关闭界面,这个函数根本不存在。 - 未描述红点如何实现,自行实现了错误的红点逻辑。
- 总结:存在很多幻觉错误,唯一一个感觉它在注释里进行自我讨论,出现一些偏差较大的代码,没必要继续审查。
Gemini 3 Pro:
- 自言自语的注释很多,比 DeepSeek V3.2 更严重。
- 未实现跳转逻辑,留下了一堆我看不明白的自言自语的注释。
- 虽然并不是错误,但对网络数据的处理明显未参考项目已有代码,处理得不太规范。
- 未注册系统,这会导致 sys 的生命周期函数不生效。
- 未正确实现属性展示,留下了一大堆自言自语的注释。
- 出现幻觉
GameModule.Resource.LoadImageAsync调用,项目中并不存在这个接口。 - 唯一一个未在要求的文件续写文件的模型,自己拷贝了一份内容创建了一个新的文件到自认为正确的位置。
- 总结:与 DeepSeek V3.2 半斤八两,更加自言自语,比 Gemini 3 Flash 更差,没必要继续审查。
Gemini 3 Flash:
- 使用了不存在的
UIManager.Instance.OpenWindow函数打开界面,项目中并不存在这个接口。 - 未实现跳转逻辑,留下了 TODO 注释,但我在指令中提到不允许 TODO 需直接报告。
- 未注册系统,这会导致 sys 的生命周期函数不生效。
- 未修改皮肤按钮的响应事件,无法打开皮肤管理界面。
- 虽然并不是错误,但对网络数据的处理明显未参考项目已有代码,处理得不太规范。
- 未对
m_textTitleUserLevel和m_textTitleUserName赋值,但编写了注释。 - 总结:Gemini 3 Flash 代码注释非常少,且写法非常简洁直接,能看到一些自言自语的注释:
// Title preview also shows building? Yes, according to requirements.。由于出现了幻觉错误,所以没必要继续审查。
GPT 5.2(xhigh):
- 存在重复事件接收,但只会造成性能问题。
- 总结:严谨、细节周到、虽然还达不到完美,但是已是最好的一个。
GPT 5.2(medium):
- 出现重复事件接收,但只会造成性能问题。
- 总结:没有仔细审查,部分代码编写的没有 5.2 好,但总体是一致的。
GPT 5.2 Codex(xhigh):
- 未注册系统,这会导致 sys 的生命周期函数不生效。
- 总结:没有仔细审查,只是粗略看了一下与 5.2 的区别,可以发现部分代码编写的没有 5.2 好,有些代码结构也与 5.2 有所不同,但总体是一致的。
GPT 5.1 Codex mini(medium):
- 做了一半,突然跟我说
抱歉,我没能将 SkinUI 的实现按计划完成。你希望我继续吗?,我问为什么,他只是说了一下当前的工作进度,然后我回复继续,就继续直到完成了。 - 出现了直接在原有文件内容上直接新增导致出现两个相同的类的情况。
- 总结:没有仔细审查,总体而言代码质量还可以,由于出现两个相同的类导致无法编译。
Claude Opus 4.5:
- 未对服务器 Type 做转换。
- 未在显示称号时更新建筑的预览。
- 总结:代码风格看着舒服,在细节上有些缺失。
Claude Sonnet 4.5:
- 未对服务器 Type 做转换。
- 未在显示称号时更新建筑的预览。
- 总结:本次与 Opus 4.5 写的没有什么差距。
无关对错的选择:
- 需求案未提到属性总览弹窗在没有属性加成的情况下该如何处理:Minimax: 做了隐藏所有内容的处理,也就是会弹出一个空弹窗。Kimi K2.5: 由于没准备空提示节点,使用了一个列表项隐藏背景和图标,只显示“暂无激活的皮肤属性”文本。GLM 4.7: 没有做任何处理,也就是会弹出一个空弹窗。DeepSeek V3.2: 有做判断,但是仅仅是 return 并且继续在进行自我讨论:// 没有属性加成,显示空状态?。Gemini 3 Flash: 没有做任何处理,也就是会弹出一个空弹窗。Gemini 3 Pro: 没有做任何处理, 但留下了自言自语的注释。GPT 5.2 系列: 没有做任何处理,也就是会弹出一个空弹窗。Claude 4.5 系列: 由于没准备空提示节点,使用了一个列表项隐藏背景和图标,只显示“暂无皮肤属性加成”文本。
- 颜色处理:Kimi K2.5: 选择了 new Color32(0x2B, 0x73, 0xB6, 0xFF) 性能最好的写法。GLM 4.7: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。DeepSeek V3.2: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。Gemini 3 Flash: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。Gemini 3 Pro: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。GPT 5.2 系列: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。Claude 4.5 系列: 参考了项目最常见的写法 ColorUtility.TryParseHtmlString("#" + outlineColor, out color)。
- 注释:Kimi K2.5: 基本都注释了,注释只有描述,没有参数、返回值等字段。GLM 4.7: 基本注释了,注释的详细程度好像有一定的规则,私有函数只有描述,公共函数则有参数和返回值等字段。DeepSeek V3.2: 在注释里进行自我讨论。Gemini 3 Flash: 注释很少,并且未发现明显规律,并不是靠函数的访问权限来区分注释详细程度。Gemini 3 Pro: 有意义的注释很少,比 Flash 更少,但行间自言自语的注释最多。GPT 5.2(xhigh): 注释比较规范,公共函数有参数和返回值等字段,私有函数只有描述。Claude 4.5 系列: 编写了很多行间注释,文档级别的注释中,私有函数要不没有,要不只有描述,公共函数则有参数和返回值等字段。
- 判空处理与防御性编程:Kimi K2.5: 正常。GLM 4.7: 大量的判空,在我看来,绑定预制体组件的判空不必要:if (m_goBuildingPreview != null)。DeepSeek V3.2: 正常。GPT 5.2(xhigh): 极其严谨,做了很多很好的处理,虽然少数地方显得有一点冗余。Gemini 3 Flash: 最乐观了,几乎没有任何判空处理,像人写的。Gemini 3 Pro: 和 Flash 差不多。Claude 4.5 系列: 正常。
- 虽然并未要求,但 GPT 5.2(xhigh):为 SkinAttrUI 增加了数据刷新同步更新界面的处理。应该是读取到了项目中存在功能解锁系统,把解锁逻辑也写上了(Kimi K2.5 也做了)。
最终总结
在这个复杂度的需求下,是否应该说国产模型几乎全军覆没,或者说除了 Claude / GPT 之外,没有一个能打的?
Tier 3
- DeepSeek V3.2
- GLM 4.7
- Minimax M2.1
- Gemini 3 Pro
- Gemini 3 Flash
- GPT 5.1 Codex mini(medium)
该梯队的模型存在幻觉,需要改的太多,无法编译。
Minimax M2.1 的时间最快,也是我第一个审查的,也是一眼就能看出无法通过编译的,但只有他在总结中留下了待确认事项,其它模型对于不确定的地方只是编造代码或者留下注释。
GLM 4.7、DeepSeek V3.2 存在很多幻觉,也是无法编译的。
GPT 5.1 Codex mini 的代码其实和 Tier 2 或者 Tier 1 的模型差不多,但可惜在有一个文件里直接新增了一个重复类,导致无法编译。
最令人失望的是 Gemini 3 系列,可能是 Copilot 提供的模型思考程度不高?Gemini 3 Pro 刚出来的时候我作为了一段时间的主力模型,当时感觉它可能比 Opus 还要好,但这次的表现实在惊讶。只能说下次有机会再看看吧。
但 GLM 4.7 绝对是这几个里表现最好的。
Tier 2
- Kimi K2.5
该梯队只有一个模型 Kimi K2.5,漏做了一些细节,有一些错误,但总体上还能接受,至少已经可以编译通过。
Tier 1
- GPT 5.2(medium)
- GPT 5.2 Codex(xhigh)
- Claude Opus 4.5
- Claude Sonnet 4.5
该梯队的模型存在本次测试模型中常犯的错误,但极少,表现已经很不错。
Claude 4.5 系列的两个模型在本次测试的差距没拉开,犯了一样的错误。
GPT 5.2(medium) 是唯二的两个没有出现逻辑错误的模型,是本梯队表现最好的模型。
Tier 0
- GPT 5.2(xhigh)
GPT 5.2(xhigh) 我是和 MiniMax M2.1 一起审查的,但两者的差距较大。
相对其它梯队的模型,它几乎将每个细节都处理到位,每一个简短的指令都遵循了,并且在需求案中没有提到具体如何做的地方它也做出了不能称得上是问题的处理。
当然,对于这个需求案的实现上还称不上完美,我需要调整一些细节才能合并到项目中,如果他能遵循我对于不确定的需求要进行询问的指令的话那就更好了,但相较于其它模型确实是当之无愧的 T0。
1.31 补充
Copilot 订阅的争议比较大,所以我又使用 Gemini CLI 和反重力订阅重新对 Gemini 3 Pro 和 Flash 测了一遍,结果是基本上一致,问题依然存在。
补测 Doubao 的两个模型:
Doubao Seed 1.8:
- 虚构了
IsPercentage字段,配置表中没有该字段 - 没有注册 sys
- 没有在打开皮肤界面按钮上注册事件
- 第一个写死 Tabs(tab1,tab2,tab3)实现的模型,其它模型是通过 Map 支持扩展更多 Tab
- 虚构了
GameModule.Resource.LoadSprite方法 - 网络事件处理不符合项目规范
- 像是 Claude 一样有很多行间注释,但文档注释比 Claude 更全。
- 最终结果:无法编译,排在 Tier3,比 GLM 4.7 弱。
Doubao Seed Code:
- 虚构了
JumpSys.Instance.Jump函数。 - 没有注册 sys
- 没有在打开皮肤界面按钮上注册事件
- 没有实现所有图片加载代码
- 没有实现获取属性名称
- 像是 Claude 一样有很多行间注释,但文档注释比 Claude 更全。
- 最终结果:无法编译,Doubao Seed 1.8 和 Code 之间互有对方没有的问题,但总体还是排在 Tier3,都比 GLM 4.7 弱。
