
1. 为什么我要把 Qwen3 塞进 EvalScope 跑一遍Qwen3 发布之后很多开发者第一反应是「先拉起来聊两句」但聊两句和真正知道它行不行是两回事。EvalScope 是 ModelScope 社区推出的模型评估与基准测试框架专门用来把大语言模型、多模态模型、Embedding、Reranker 这些模型拉到统一基准上打分。它内置了 MMLU、CMMLU、C-Eval、GSM8K 等常见数据集也支持端到端 RAG 评估和推理性能压测。适合谁适合手里已经有一个 Qwen3 权重或一个 Qwen3 API 服务想快速验证「它到底能不能打」的开发者。我这次的目标很明确不折腾本地训练直接用 TaoToken 的统一 Key 和 API 通道把 Qwen3 接到 EvalScope 的 service 评估模式里跑通一次 GSM8K 评测并且读懂输出指标。整条链路分三块EvalScope 安装、TaoToken 的 Key/API 配置、评测任务启动与结果校验。下面按可复制的方式一步步来。2. TaoToken 前置统一 Key 与 API 通道准备EvalScope 的 service 评估模式要求模型以 OpenAI 兼容格式暴露接口也就是说它只认/v1/chat/completions这种请求响应结构。TaoToken 提供的统一 API 通道正好符合这个要求你不需要自己写 FastAPI 包装 Qwen3直接用它的 OpenAI 兼容端点即可。先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并进入控制台在 API Keys 页面创建一个 Key。这个 Key 就是后面 EvalScope 里--api-key要填的值。模型名方面Qwen3 系列在 TaoToken 的模型列表里可以直接选比如Qwen3-8B或你实际要评的版本。注意EvalScope 的--api-url要填完整的 chat completions 路径不是只填域名。TaoToken 的 API 基址是 https://taotoken.net/api拼接后就是https://taotoken.net/api/v1/chat/completions。这一点很多人第一次会填错只写域名会直接 404。如果你还没建 Key可以直接走这个入口https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。建好之后先别急着跑评测用一条 curl 确认通道是通的curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: Qwen3-8B, messages: [{role: user, content: 11等于几}], max_tokens: 64 }返回里能看到choices[0].message.content就说明 Key 和通道都没问题。这一步别跳过因为 EvalScope 报错时你很难判断是框架问题还是通道问题先隔离变量。3. 可复制配置EvalScope 安装与 settings.json / config.toml 骨架3.1 安装 EvalScopeEvalScope 要求 Python 3.9。建议单独建虚拟环境避免和已有依赖打架python -m venv evalscope-env source evalscope-env/bin/activate pip install evalscope如果你还要跑性能压测perf 模式再补一个依赖pip install evalscope[perf]安装完成后验证一下版本evalscope --version能打印出版本号就说明 CLI 可用了。EvalScope 的评估入口是evalscope eval性能压测入口是evalscope perf两者参数体系不同别混用。3.2 settings.json把 TaoToken 通道写成可复用配置EvalScope 支持通过配置文件传入参数避免每次命令行拼一长串。我在工作目录下建了一个settings.json把模型、API 地址、Key 都抽出来{ model: Qwen3-8B, api_url: https://taotoken.net/api/v1/chat/completions, api_key: sk-your-taotoken-key, eval_type: service, datasets: [gsm8k], limit: 20, generation_config: { max_new_tokens: 2048, temperature: 0.0, chat_template_kwargs: { enable_thinking: false } }, work_dir: ./eval_workdir }这里几个参数值得说清楚。eval_type必须是service因为我们是走 API 而不是本地权重。limit控制每个数据集抽多少条第一次跑建议 20 条以内先确认链路通。enable_thinking设成 false 是因为 GSM8K 默认 prompt 里已经带了 step by step 提示再开思考模式反而容易让输出变长、解析变慢。3.3 config.toml另一种等价写法如果你更习惯 TOMLEvalScope 也认。下面这份config.toml和上面的 JSON 等价model Qwen3-8B api_url https://taotoken.net/api/v1/chat/completions api_key sk-your-taotoken-key eval_type service datasets [gsm8k] limit 20 work_dir ./eval_workdir [generation_config] max_new_tokens 2048 temperature 0.0 [generation_config.chat_template_kwargs] enable_thinking false两种格式选一种就行我实测下来 JSON 在命令行覆盖单个参数时更顺手TOML 在团队共享配置时更清晰。Key 不要硬编码进版本库用环境变量注入更安全export TAOTOKEN_API_KEYsk-your-taotoken-key然后在配置里写api_key: ${TAOTOKEN_API_KEY}EvalScope 会做变量替换。4. 启动评测与验证请求一次跑通 GSM8K4.1 用命令行直接启动配置准备好之后最直接的启动方式是把参数摊在命令行上evalscope eval \ --model Qwen3-8B \ --api-url https://taotoken.net/api/v1/chat/completions \ --api-key $TAOTOKEN_API_KEY \ --eval-type service \ --datasets gsm8k \ --limit 20 \ --generation-config {max_new_tokens:2048,temperature:0.0,chat_template_kwargs:{enable_thinking:false}} \ --work-dir ./eval_workdir启动后终端会先打印数据集下载进度然后逐条请求模型。GSM8K 的默认 prompt 模板是Question: {query}\nLets think step by step\nAnswer:EvalScope 会自动把题目填进去再把模型返回的答案和标准答案做比对。4.2 成功结果长什么样跑完之后work_dir下会生成带时间戳的目录里面有几个关键产物eval_workdir/ └── 20250610_143022/ ├── logs/ │ └── eval_log.log ├── reviews/ │ └── gsm8k.jsonl └── reports/ └── gsm8k_report.jsonreports/gsm8k_report.json里是汇总指标核心字段是score和num。score就是准确率num是实际评测条数。reviews/gsm8k.jsonl是逐条明细每条包含query、response、gold、score用来排查「为什么这条判错了」。我实测跑 20 条 GSM8KQwen3-8B 在enable_thinkingfalse下大概能拿到 0.7 到 0.85 之间的分数具体取决于抽样。如果你把enable_thinking打开数学推理题有时会更高但输出 token 数会明显上涨评测耗时也变长。4.3 读懂输出指标EvalScope 的报告里除了score还有几个容易忽略的字段。category是数据集分类metric是评测指标名GSM8K 用的是 accuracy。如果你一次跑多个数据集报告会按数据集分块每块独立给分。性能压测模式evalscope perf输出的则是另一套指标Latency、Throughput、TTFT首 token 延迟、TPOT每 token 输出时间。这两套指标不要混着看一个是能力一个是性能。5. 本篇常见错排查5.1 报 404 或 model not found最常见的原因是--api-url只填了https://taotoken.net/api少了/v1/chat/completions。EvalScope 不会帮你补路径它只做 POST。另一个原因是--model填的模型名和 TaoToken 模型列表里的不一致大小写和版本号都要对上。5.2 报鉴权失败 401检查--api-key是否带了Bearer前缀。EvalScope 内部会自己加Bearer所以你只需要填纯 Key不要手动加前缀否则会变成Bearer Bearer sk-xxx。另外确认 Key 没有过期或者环境变量有没有被正确 export。5.3 数据集下载卡住或失败EvalScope 默认从 ModelScope 拉数据集到缓存目录。如果本地磁盘空间不足可以像下面这样把数据集单独下载到指定目录再用--dataset-args指过去wget https://modelscope.oss-cn-beijing.aliyuncs.com/open_data/benchmark/data.zip unzip data.zip -d /data/evaldata然后启动时加--dataset-args {gsm8k:{local_path:/data/evaldata/data/gsm8k}}5.4 输出解析失败、score 为 0GSM8K 的答案提取依赖固定格式如果模型返回里没有#### 数字这种结尾EvalScope 会判为解析失败。这时候去reviews/gsm8k.jsonl里看response字段确认模型是不是把答案写成了别的形式。解决办法是在generation_config里加stop参数或者在 prompt 模板里强化格式要求。5.5 评测跑得特别慢service 模式下每条请求都要走网络limit设太大、max_new_tokens设太高都会拖时间。第一次验证链路时把limit压到 10 到 20max_new_tokens压到 1024确认通了再放大。另外temperature设 0.0 能让输出更稳定减少重试。6. 后续怎么用从单次评测到持续验证链路跑通之后你可以把settings.json里的datasets换成多个比如[gsm8k, ceval, cmmlu]一次拿到多个维度的分数。如果要做长期编码或 Agent 场景的模型对比建议把评测任务接到 Coding Plan 上用固定配置反复跑观察不同版本 Qwen3 的分数变化https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。想快速对比模型对话效果可以直接在模型对话页面试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入文档里有完整的参数说明和 OpenAI 兼容细节https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。控制台里可以管理 Key 和查看调用量https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。我自己的习惯是每次换模型版本先跑 20 条 GSM8K 确认链路和分数没有异常再放大到 200 条做正式对比。这样既省时间也能在第一时间发现通道或配置问题。