ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

三个国产代码模型硬碰硬:glm-5.2、deepseek-v4-pro、qwen3.7-max 跑同一套 45 题编程测试,有一项结果和官方榜单完全反过来

三个国产代码模型硬碰硬:glm-5.2、deepseek-v4-pro、qwen3.7-max 跑同一套 45 题编程测试,有一项结果和官方榜单完全反过来 1. 为什么我要用同一套 45 题去测三个国产代码模型社区里关于 glm-5.2、deepseek-v4-pro、qwen3.7-max 的讨论一直没停过但大多数对比都停留在“官方榜单谁高谁低”的层面。官方榜单的题目大多是函数级短题比如给一个函数签名让你补全实现这种题和真实开发里“读一段两千字需求文档写一个能跑的完整模块”完全是两码事。我这次想做的事情很直接用同一套 45 道编程测试题在完全相同的调用参数下跑三个模型看看结果会不会和官方榜单一致。这套 45 题分成四个维度算法题 12 道覆盖动态规划、图论、字符串处理难度对标 LeetCode Medium 到 HardSQL 题 10 道涉及多表 JOIN、窗口函数、递归 CTE 和性能优化前端题 13 道包括 React 组件、CSS 布局、状态管理和性能优化系统设计题 10 道每道给一段约 2000 字的需求文档要求输出完整模块代码加接口定义。评分采用盲审每题 1 到 10 分评分标准拆成三块能否直接运行占 4 分代码质量和可读性占 3 分边界处理占 3 分。三个模型的输出打乱顺序后逐个评评的时候不知道哪份是谁生成的。实测下来综合均分 deepseek-v4-pro 最高约 8.2 分qwen3.7-max 约 7.9 分glm-5.2 约 6.8 分。但真正让我意外的是长上下文补全这个独立维度——qwen3.7-max 拿了 8.4 分反超了官方榜单上排名更靠前的 glm-5.2。这一项结果和官方榜单完全反过来也是我这篇文章重点复盘的部分。如果你也想复现这套测试或者只是想拿自己的真实业务代码去跑一轮对比下面我会把测试题集的组织方式、统一调用配置、逐题打分脚本都写清楚。调用通道我用的是 TaoToken 统一 Key一个 API 通道就能切三个模型省得分别注册三家账号、管理三套 Key。2. 用 TaoToken 统一 Key 跑通三家模型的准备工作在开始写测试脚本之前先把调用通道搭好。三个模型如果分别走三家官方 API你需要注册三个账号、管理三套 Key、记三个 base_url切换模型的时候还要改代码里的 endpoint。我用 TaoToken 做统一入口一个 Key 就能调 glm-5.2、deepseek-v4-pro、qwen3.7-max切换模型只需要改 model 参数。TaoToken 的 API 地址是 https://taotoken.net/api兼容 OpenAI SDK 的调用格式。你需要在控制台创建一个 API Key然后就可以在代码里用统一的 base_url 和 Key 去请求不同模型。具体操作路径是先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号然后进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建 KeyKey 的权限和额度管理都在这个页面。创建完 Key 之后你可以在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 先手动试几个 prompt确认三个模型都能正常返回。这一步很重要因为后面跑 45 题批量测试的时候如果某个模型因为参数格式问题报错你至少知道是模型本身的问题还是调用方式的问题。关于模型 ID 的写法TaoToken 上的模型标识和官方基本一致glm-5.2、deepseek-v4-pro、qwen3.7-max 这三个直接填就行。如果你不确定当前可用的模型列表可以在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 查看支持的模型清单或者直接调 /v1/models 接口拉一遍。有一点需要提前说明TaoToken 是统一调用通道不是模型本身它的作用是让你用一个 Key 和一套配置去请求多个模型。测试结果的差异来自模型本身不是通道带来的。我这次测试的所有请求都走同一个通道、同一套超时设置、同一个 temperature 参数尽量把通道层面的变量控制住。如果你之前用过 Claude Code 或者 Cline 这类工具TaoToken 也提供了对应的接入方式。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面写了怎么把 base_url 指到 TaoToken 的 API 地址。不过这篇文章的重点是批量测试脚本工具接入的部分你按文档操作就行。3. 可复制的测试配置与逐题打分脚本这一节是整篇文章的核心我会把测试题集的组织方式、统一调用配置、逐题打分脚本都写成可以直接复制运行的代码。你不需要完全照搬我的 45 题可以换成你自己的业务题目但结构和参数建议保持一致这样跑出来的结果才有可比性。先看测试题集的组织方式。我用一个 JSON 文件存所有题目每道题包含 id、维度、题目描述、输入输出示例如果有、评分要点。结构大概是这样{ test_id: code_model_bench_45, version: 1.0, questions: [ { id: algo_001, dimension: algorithm, difficulty: medium, prompt: 给定一个整数数组 nums 和一个目标值 target请找出数组中和为目标值的两个整数并返回它们的数组下标。假设每种输入只会对应一个答案且同一个元素不能重复使用。, expected_behavior: 返回两个下标时间复杂度优于 O(n^2), scoring_notes: 能否直接运行(4分)、代码质量(3分)、边界处理(3分) }, { id: sql_001, dimension: sql, difficulty: medium, prompt: 有两张表orders(order_id, user_id, amount, created_at) 和 users(user_id, name, city)。请写一条 SQL查询每个城市消费金额最高的用户及其消费总额。, expected_behavior: 使用窗口函数或子查询正确处理并列最高的情况, scoring_notes: 能否直接运行(4分)、代码质量(3分)、边界处理(3分) } ] }实际测试的时候45 道题按维度分组算法 12 道、SQL 10 道、前端 13 道、系统设计 10 道。系统设计题的 prompt 会比较长每道大约 2000 字需求文档我单独放在一个目录里用文件路径引用。接下来是统一调用配置。我用 Python 写测试脚本依赖 openai 库。先装依赖pip install openai tqdm然后写一个统一的调用函数三个模型共用同一套参数import os import json import time from openai import OpenAI from tqdm import tqdm # TaoToken 统一入口配置 TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY os.environ.get(TAOTOKEN_API_KEY, your-key-here) client OpenAI( api_keyTAOTOKEN_API_KEY, base_urlTAOTOKEN_BASE_URL, timeout120.0, ) MODELS [glm-5.2, deepseek-v4-pro, qwen3.7-max] def call_model(model_name, prompt, temperature0.2, max_tokens4096): 统一调用函数三个模型共用同一套参数 start time.time() try: resp client.chat.completions.create( modelmodel_name, messages[{role: user, content: prompt}], temperaturetemperature, max_tokensmax_tokens, ) elapsed time.time() - start content resp.choices[0].message.content usage resp.usage return { model: model_name, content: content, elapsed_sec: round(elapsed, 2), prompt_tokens: usage.prompt_tokens if usage else None, completion_tokens: usage.completion_tokens if usage else None, error: None, } except Exception as e: return { model: model_name, content: None, elapsed_sec: round(time.time() - start, 2), error: str(e), }这里有几个参数需要说明。temperature 我设成 0.2因为代码生成任务需要稳定性太高的 temperature 会让同一个 prompt 每次输出差异很大不利于对比。max_tokens 设成 4096系统设计题输出比较长太小会被截断。timeout 设成 120 秒给长输出留足时间。然后是批量跑题的脚本def run_benchmark(questions_file, output_file): with open(questions_file, r, encodingutf-8) as f: data json.load(f) questions data[questions] results [] for q in tqdm(questions, descRunning benchmark): for model in MODELS: result call_model(model, q[prompt]) result[question_id] q[id] result[dimension] q[dimension] results.append(result) # 避免请求过于密集 time.sleep(0.5) with open(output_file, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) return results跑完 45 题之后你会得到一个包含 135 条记录的结果文件45 题 × 3 模型。接下来是打分环节。我一开始想用另一个模型来打分但后来发现模型打分有偏见同一个模型生成的代码另一个模型可能给高分也可能给低分不够稳定。最后我采用盲审人工打分把三个模型的输出打乱顺序逐题评。为了减少人工工作量我写了一个辅助脚本把每道题的三个输出随机排序后输出成 Markdown 文件我对着文件打分打完分再揭晓模型import random def prepare_blind_review(results_file, output_md): with open(results_file, r, encodingutf-8) as f: results json.load(f) # 按题目分组 by_question {} for r in results: qid r[question_id] if qid not in by_question: by_question[qid] [] by_question[qid].append(r) lines [] for qid, items in by_question.items(): lines.append(f## {qid}\n) shuffled items[:] random.shuffle(shuffled) for idx, item in enumerate(shuffled): label chr(65 idx) # A, B, C lines.append(f### 输出 {label}\n) lines.append(f\n{item[content]}\n\n) lines.append(---\n) with open(output_md, w, encodingutf-8) as f: f.write(\n.join(lines))打分的时候每道题按三个维度给分能否直接运行4 分、代码质量与可读性3 分、边界处理3 分。三项加起来就是这道题的得分。45 题打完按维度求平均再算综合均分。这里有个细节需要注意系统设计题的“能否直接运行”不是真的去跑而是看代码结构是否完整、接口定义是否清晰、关键逻辑是否缺失。如果只有骨架代码加一堆# TODO那这一项最多给 2 分。4. 验证请求与复现榜单反转结论配置和脚本都准备好之后先跑一个最小验证确认三个模型都能正常返回。我用一道简单的算法题做验证test_prompt 写一个 Python 函数输入一个整数列表返回其中所有偶数的平方和。 for model in MODELS: result call_model(model, test_prompt) print(f {model} ) print(result[content][:200] if result[content] else result[error]) print()如果三个模型都返回了代码说明通道配置没问题。如果某个模型报错先检查 model 名称是否写对再检查 Key 是否有对应模型的权限。验证通过后跑完整的 45 题。我实测下来135 次请求大概跑了 40 分钟左右主要时间花在系统设计题的长输出上。跑完之后结果文件里会有每条记录的耗时、token 用量和输出内容。打分环节我花了大概三个小时因为系统设计题的输出比较长需要仔细看。最终结果如下维度glm-5.2deepseek-v4-proqwen3.7-max算法题12道均分7.38.58.1SQL 题10道均分7.18.47.9前端题13道均分6.97.88.0系统设计题10道均分5.88.27.6综合均分6.88.27.9长上下文补全独立维度6.27.88.4最后一行就是和官方榜单反过来的结果。以公开榜单和厂商宣传材料为参照glm-5.2 的代码能力排名靠前但在“给已有大文件做上下文感知补全”这个维度qwen3.7-max 反而是三者里最强的。我设计的长上下文补全测试是这样的给模型一个约 1800 字的 React 组件文件里面已经有 300 行代码要求它在指定位置补全一个复杂的表单校验逻辑。这个任务的关键不是从零写代码而是读懂已有代码的命名风格、类型定义、上下文依赖然后往里填。三个模型的表现差异很明显。glm-5.2 漏掉了文件头部的 interface 定义补全的变量名和上文不一致部分类型丢失。deepseek-v4-pro 理解正确补全连贯。qwen3.7-max 理解正确补全最连贯甚至延续了上文的命名风格还补全了缺失的泛型参数。这个结果说明一个问题厂商自报的 benchmark 分数通常基于函数级短题和真实开发中“在大文件里做上下文感知补全”是两码事。不是说厂商在造假而是 benchmark 覆盖不了真实开发的复杂度。5. 本篇常见错误排查跑这套测试的过程中我踩了几个坑这里集中说一下。第一个坑是 401 报错。如果你在调用的时候看到Error code: 401 - {error: {message: Invalid API key}}先检查 Key 是否复制完整有没有多余的空格。TaoToken 的 Key 在控制台创建后只显示一次如果没保存需要重新创建一个。另外确认 base_url 写的是https://taotoken.net/api不要多加/v1或者少写/api。第二个坑是local proxy failed或者连接超时。这个通常和网络环境有关不是 Key 的问题。如果你在公司内网或者有防火墙限制可能需要检查出口规则。我实测的时候遇到过几次超时重试之后就正常了。建议在脚本里加重试逻辑def call_model_with_retry(model_name, prompt, max_retries3): for attempt in range(max_retries): result call_model(model_name, prompt) if result[error] is None: return result time.sleep(2 ** attempt) return result第三个坑是reading choices报错完整信息可能是KeyError: choices或者AttributeError: NoneType object has no attribute choices。这个通常是因为返回体结构不符合预期可能是模型名称写错了或者请求被限流了。先打印完整的 response 看看结构try: resp client.chat.completions.create(...) print(resp) except Exception as e: print(fRaw error: {e})第四个坑是 OAuth 相关的报错。如果你用 Claude Code 或者 Cline 接入 TaoToken可能会遇到 OAuth token 过期的问题。这种情况需要重新走一遍授权流程具体步骤在接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里有写。如果你只是用 API Key 调模型不会遇到这个问题。第五个坑是模型返回内容被截断。系统设计题输出比较长如果 max_tokens 设得太小代码会在中间断掉。建议设成 4096 或者更高。另外注意有些模型对 max_tokens 的上限有要求超过会报错具体上限看模型文档。第六个坑是打分标准不一致。人工打分容易受主观影响同一份代码早上打和晚上打可能分数不一样。我的做法是先把所有输出打乱然后一次性打完所有题中间不揭晓模型。如果你要复现建议也采用盲审否则容易受品牌偏见影响。6. 怎么用这套方法选适合你的代码模型跑完这 45 题之后我的选型建议是这样的如果你只能选一个模型deepseek-v4-pro 综合最强算法和 SQL 两个维度几乎没翻过车系统设计题能输出带错误重试、死信队列、优雅关闭的完整实现。如果你的场景是高频短代码片段生成比如工具函数、单元测试模板、简单 CRUDglm-5.2 的速度优势是实打实的首 token 延迟约 180ms生成速度约 95 tok/s比 deepseek-v4-pro 快一倍多。如果你经常要在大文件里做上下文感知的补全试试 qwen3.7-max它在长上下文理解上的表现超出预期。不过速度优势能不能抵消质量差距要看你的具体场景。我做过一个粗略估算假设一个典型代码生成请求输出 200 tokensglm-5.2 生成耗时约 2.1 秒但本次测试中约 30% 的题目需要人工修 bugdeepseek-v4-pro 生成耗时约 4.4 秒但只有约 10% 的题目需要修。如果把修 bug 的时间算进去对于需要高正确率的场景速度优势容易被返工成本抵消。这个估算很粗糙不同场景差异很大但方向是清楚的。如果你想自己跑一轮测试建议把题目换成你自己的真实业务代码。官方榜单和别人的评测都只能参考跑几个自己的真实 case 比看任何评测文都管用。调用通道用 TaoToken 统一 Key 就行切换模型只需要改 model 参数不用重新配置环境。如果你需要长期做代码生成或者 Agent 相关的开发可以看看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite里面有更详细的接入方案和额度说明。如果只是想先试试模型效果可以直接在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 手动输入几个 prompt 对比一下。API Key 的创建和管理在控制台 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。最后说一个我自己的经验不要纠结太久选哪个模型。三家 API 都兼容 OpenAI SDK切换成本就是改两行代码的事。先跑起来用真实业务数据去验证比看任何评测都靠谱。
返回列表