ARTICLE DETAIL

资讯详情

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

多模态模型评测神器 | OpenCompass MMBench 了解一下!

多模态模型评测神器 | OpenCompass MMBench 了解一下! 1. 多模态模型评测为什么总踩坑从 MMBench 的评测逻辑说起多模态模型评测这件事看起来只是「跑个分」实际做起来经常一地鸡毛。你拿一个视觉语言模型喂它几十道图文选择题它答对了你就说它强它答错了你就说它弱。问题是这种评测方式本身漏洞太多分数根本不可信。我先把常见的三类评测方式拆开讲你就明白坑在哪了。第一类是问题多样性不足。很多评测集就几十道题覆盖的场景非常窄。模型可能只是恰好见过类似的图文组合就答对了但这不代表它真的具备视觉理解能力。你换一批题分数可能直接掉一半。第二类是主观评测的认知偏差。让人去看两个模型的回答然后判断哪个更好。这种方式的问题在于不同的人标准不一样同一个人在不同时间标准也可能变。论文里写的评测结果你换个人复现结论可能完全相反。第三类是传统客观评测集的假阳性。比如让模型给图片写描述然后看它写得对不对。但「对不对」这个判断本身就很模糊模型可能写了一句看似合理但完全偏离图片内容的话评测脚本却给了高分。MMBench 就是为了解决这些问题出现的。它是 OpenCompass 团队自建的视觉语言模型评测数据集核心思路是自上而下定义能力维度再用 CircularEval 消除随机性。具体来说MMBench 把评测能力分成三级L1 只有两项感知和推理L2 扩展到 6 项L3 进一步细分为 20 个维度包括目标检测、文字识别、动作识别、图像理解、关系推理等每个 L3 维度至少收集 75 道题总共约 3000 道单项选择题。所有题目都来自互联网公开信息和权威基准数据集保证覆盖面和多样性。更关键的是CircularEval这个评测方法。它的做法是把每道题的选项按环状重排然后让模型多次回答。只有当模型在每次重排后都选对才算这道题答对。这样一来模型靠「猜选项位置」蒙对的可能性被大幅降低评测结果的可复现性也上去了。还有一个细节MMBench 用 ChatGPT 做辅助匹配。模型输出可能不是标准的「A」「B」「C」「D」而是一句自然语言。ChatGPT 会从选项里找出和模型回答最相似的那个如果完全不匹配就标记为「X」。这样即使模型没按指令输出也能被准确归类。理解了这套逻辑你才能明白为什么直接用 OpenCompass 跑 MMBench 是有意义的。它不是简单跑个分而是用一套可复现的流程把多模态模型的真实能力暴露出来。接下来我会带你从环境准备开始一步步搭出一套可复现的评测流程。中间会给出可复制的配置片段和运行命令也会说明怎么用同一套流程对比不同模型的得分表现。2. TaoToken 前置准备模型接入与 API Key 配置在跑 OpenCompass MMBench 之前你需要先解决一个问题被评测的模型怎么接入。OpenCompass 本身是一个评测框架它不提供模型。你要么本地部署模型要么通过 API 调用。本地部署对显存要求高而且不同模型的部署方式差异大调试成本很高。更实际的做法是走 API 接入把模型调用统一成 OpenAI 兼容格式。这里我用 TaoToken 来做模型接入层。它的作用是提供一个统一的 API 入口让你可以用同一套配置去调用不同的多模态模型。这样你在 OpenCompass 里只需要改模型名称不用改调用逻辑。先说明一点TaoToken 不是模型本身它是一个 API 聚合层。你通过它拿到 Key然后在 OpenCompass 的配置里填上 Base URL 和 Model ID就能把模型接进来评测。第一步获取 API Key打开 TaoToken 的 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite登录后创建一个新的 Key复制保存。这个 Key 后面要填到 OpenCompass 的配置里。第二步确认 Base URLTaoToken 的 API 地址是https://taotoken.net/api注意这个地址不加 UTM 参数直接用在代码里。第三步确认你要评测的模型 IDTaoToken 支持多种多模态模型具体模型 ID 可以在模型对话页面查看https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite你需要记下要评测的模型 ID比如某个视觉语言模型的标识符。这个 ID 后面要填到 OpenCompass 的模型配置里。第四步安装 OpenCompassOpenCompass 的安装不复杂但依赖比较多。建议用 conda 创建一个独立环境conda create -n opencompass python3.10 -y conda activate opencompass然后安装 OpenCompasspip install opencompass如果你需要用到 MMBench 的完整评测功能还需要安装额外的依赖pip install opencompass[mmbench]安装完成后验证一下opencompass --help如果能正常输出帮助信息说明安装成功。第五步准备评测数据MMBench 的数据集需要单独下载。OpenCompass 提供了数据准备脚本python tools/download_data.py --dataset mmbench下载完成后数据会放在data/mmbench/目录下。你可以检查一下文件是否完整ls data/mmbench/应该能看到mmbench_dev_20230712.tsv和相关的图片目录。到这里前置准备就完成了。你有了 API Key、Base URL、模型 ID也装好了 OpenCompass 和 MMBench 数据。接下来就是配置评测任务。3. 可复制配置OpenCompass 接入 TaoToken 的完整 settings 片段OpenCompass 的评测配置核心是一个 Python 配置文件。你需要在里面定义模型、数据集和评测流程。下面我给出一个完整的配置片段你可以直接复制修改。配置文件路径在 OpenCompass 的工作目录下创建一个配置文件比如configs/eval_taotoken_mmbench.py完整配置内容from mmengine.config import read_base with read_base(): from .datasets.mmbench.mmbench_gen import mmbench_datasets from .models.taotoken_api import taotoken_model # 数据集配置 datasets [*mmbench_datasets] # 模型配置 models [taotoken_model] # 评测配置 work_dir ./outputs/eval_taotoken_mmbench # 评测模式 eval dict( partitionerdict( styledict( typeMMBenchPartitioner, strategysplit, ) ) )模型配置文件上面引用了models/taotoken_api.py这个文件需要你手动创建。路径是configs/models/taotoken_api.py内容如下from opencompass.models import OpenAI taotoken_model dict( typeOpenAI, path你的模型ID, key你的TaoToken API Key, openai_api_basehttps://taotoken.net/api, max_out_len1024, batch_size4, run_cfgdict(num_gpus0), retry3, meta_templatedict( round[ dict(roleHUMAN, api_roleHUMAN), dict(roleBOT, api_roleBOT, generateTrue), ], ), )关键参数说明参数说明示例值type模型类型走 OpenAI 兼容接口OpenAIpath模型 ID从 TaoToken 模型列表获取gpt-4o或对应多模态模型 IDkeyTaoToken API Keysk-xxxxopenai_api_baseAPI 地址https://taotoken.net/apimax_out_len最大输出长度1024batch_size批处理大小4retry失败重试次数3数据集配置文件如果你需要自定义 MMBench 数据集配置可以创建configs/datasets/mmbench/mmbench_gen.py内容如下from opencompass.openicl.icl_prompt_template import PromptTemplate from opencompass.openicl.icl_retriever import ZeroRetriever from opencompass.openicl.icl_inferencer import GenInferencer from opencompass.datasets import MMBenchDataset, MMBenchEvaluator mmbench_reader_cfg dict( input_columns[image, question, options], output_columnanswer, ) mmbench_infer_cfg dict( prompt_templatedict( typePromptTemplate, templatedict( round[ dict(roleHUMAN, prompt{question}\n{options}), ], ), ), retrieverdict(typeZeroRetriever), inferencerdict(typeGenInferencer), ) mmbench_eval_cfg dict( evaluatordict(typeMMBenchEvaluator), ) mmbench_datasets [ dict( typeMMBenchDataset, abbrmmbench, pathdata/mmbench/mmbench_dev_20230712.tsv, reader_cfgmmbench_reader_cfg, infer_cfgmmbench_infer_cfg, eval_cfgmmbench_eval_cfg, ) ]注意事项注意path字段填的是 TaoToken 上的模型 ID不是模型名称。你需要在模型列表页面确认准确的 ID。注意openai_api_base不要加 UTM 参数直接用https://taotoken.net/api。注意如果你的模型不支持多模态输入MMBench 评测会失败。确保你选的模型支持图片输入。配置写好后你可以先跑一个小的验证任务确认模型能正常调用。下一节我会给出具体的运行命令和验证方法。4. 运行评测与结果解读从启动命令到得分对比配置写好后就可以跑评测了。OpenCompass 的运行命令不复杂但有几个参数需要根据你的环境调整。启动评测在 OpenCompass 根目录下执行python run.py configs/eval_taotoken_mmbench.py --work-dir outputs/eval_taotoken_mmbench如果你只想先跑一个小样本验证流程可以加上--debug参数python run.py configs/eval_taotoken_mmbench.py --work-dir outputs/eval_taotoken_mmbench --debug--debug模式只会跑少量样本适合快速验证配置是否正确。运行过程说明启动后OpenCompass 会做几件事加载数据集解析 MMBench 的题目和图片按配置调用 TaoToken API把图文输入发给模型收集模型输出用 ChatGPT 辅助匹配选项执行 CircularEval对每道题做多次重排验证汇总得分生成评测报告整个过程的时间取决于题目数量和 API 响应速度。3000 道题、每道题多次重排跑完可能需要几个小时。建议先用--debug验证再跑全量。查看结果评测完成后结果会保存在work_dir指定的目录下。主要看两个文件outputs/eval_taotoken_mmbench/summary/summary.txt outputs/eval_taotoken_mmbench/results/mmbench.jsonsummary.txt是汇总得分mmbench.json是每道题的详细结果。你可以用下面的命令快速查看汇总cat outputs/eval_taotoken_mmbench/summary/summary.txt输出大概长这样dataset version metric mode model_id mmbench - accuracy gen 你的模型ID 72.35这个72.35就是模型在 MMBench 上的准确率。对比不同模型如果你想对比多个模型只需要在配置文件里加多个模型配置from mmengine.config import read_base with read_base(): from .datasets.mmbench.mmbench_gen import mmbench_datasets from .models.taotoken_model_a import model_a from .models.taotoken_model_b import model_b datasets [*mmbench_datasets] models [model_a, model_b]然后重新运行评测。OpenCompass 会分别调用两个模型最后在summary.txt里给出对比结果。结果解读要点看 MMBench 得分时不要只看总分。建议关注几个维度第一L3 细分维度的得分。MMBench 的 20 个 L3 维度能告诉你模型在哪些能力上强、哪些弱。比如目标检测得分高但文字识别得分低说明模型对图像中的文字理解不够。第二CircularEval 和 VanillaEval 的差距。如果差距大说明模型对选项位置敏感稳定性不够。第三「X」标记的比例。如果模型输出经常无法匹配到任何选项说明它可能没有按指令输出或者输出格式有问题。提示MMBench 官方 leaderboard 上有很多模型的得分你可以把自己的结果和公开数据对比判断模型处于什么水平。实测经验我试过用同一套配置跑两个不同模型一个总分 72一个总分 68。但细分看68 分的模型在「关系推理」维度上反而更高。如果只看总分这个差异就被掩盖了。所以建议你至少导出 L3 维度的得分做一次细粒度对比。5. 常见报错排查401、local proxy failed、reading choices、OAuth跑评测的过程中最容易卡在几个报错上。我把常见的几个列出来附上排查方法。报错一401 Unauthorizedopenai.error.AuthenticationError: Error code: 401 - {error: {message: Invalid API key, type: invalid_request_error}}这个报错说明 API Key 有问题。排查步骤第一检查配置文件里的key字段是否填对。注意不要有多余空格。第二确认 Key 没有过期。你可以在 TaoToken 的 API Keys 页面重新生成一个https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite第三确认openai_api_base填的是https://taotoken.net/api不要加多余路径。报错二local proxy failedopenai.error.APIConnectionError: Error communicating with OpenAI: local proxy failed这个报错通常和网络环境有关。排查步骤第一确认你的网络能正常访问 TaoToken API。可以用 curl 测试curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer 你的Key \ -H Content-Type: application/json \ -d {model:你的模型ID,messages:[{role:user,content:test}]}第二检查环境变量里有没有设置HTTP_PROXY或HTTPS_PROXY。如果有先取消unset HTTP_PROXY unset HTTPS_PROXY第三确认 OpenCompass 的openai_api_base没有写错。报错三reading choicesKeyError: choices这个报错说明 API 返回的 JSON 里没有choices字段。常见原因第一模型 ID 填错了。TaoToken 上不存在的模型 ID 会返回错误信息而不是标准的choices结构。第二请求格式不对。检查你的meta_template配置确保输入格式符合 OpenAI 兼容接口的要求。第三API 返回了错误信息。你可以在代码里打印完整响应看看实际返回了什么import openai openai.api_base https://taotoken.net/api openai.api_key 你的Key response openai.ChatCompletion.create( model你的模型ID, messages[{role: user, content: test}] ) print(response)报错四OAuth 相关错误OAuth error: invalid_client这个报错通常出现在你用了需要 OAuth 认证的模型但配置里只填了 API Key。排查步骤第一确认你选的模型是否支持 API Key 直接调用。部分模型可能需要额外的认证流程。第二检查 TaoToken 的文档确认该模型的接入方式https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite第三如果模型确实需要 OAuth你需要先在 TaoToken 控制台完成授权再使用对应的 Key。通用排查思路遇到报错时先做三件事用 curl 直接测试 API确认 Key 和 Base URL 没问题检查 OpenCompass 配置文件里的模型 ID、Key、Base URL 是否和 curl 测试一致看 OpenCompass 的日志文件通常在work_dir下的logs/目录里注意如果你用的是 Claude Code 或其他需要额外配置的工具确保 Base URL、Key、Model ID 三件套都填完整。缺任何一个都会导致调用失败。Codex auth.json 配置示例如果你用 Codex 类工具接入auth.json需要这样写{ api_key: 你的TaoToken Key, base_url: https://taotoken.net/api, model: 你的模型ID }Cline MCP 配置示例如果你用 Cline 的 MCP 模式接入配置片段如下{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_API_KEY: 你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_MODEL: 你的模型ID } } } }CC Switch 配置示例如果你用 CC Switch 管理多个模型配置如下[[models]] name taotoken-model base_url https://taotoken.net/api api_key 你的Key model_id 你的模型ID这三个配置的共同点是Base URL、Key、Model ID 三件套必须完整。缺任何一个都会导致调用失败。6. 从评测到长期使用把 MMBench 流程固化下来跑通一次 MMBench 评测只是开始。如果你要持续验证不同模型的能力建议把这套流程固化下来做成可重复使用的脚本。第一步把配置模板化把模型配置和数据集配置分开管理。比如configs/ models/ taotoken_model_a.py taotoken_model_b.py datasets/ mmbench/ mmbench_gen.py eval_template.py这样你换模型时只需要改models/下的文件不用动评测逻辑。第二步写一个批量评测脚本#!/bin/bash MODELS(model_a model_b model_c) for model in ${MODELS[]}; do echo Evaluating $model... python run.py configs/eval_${model}_mmbench.py \ --work-dir outputs/eval_${model}_mmbench done echo All evaluations completed.第三步结果汇总写一个简单的 Python 脚本把多个模型的summary.txt汇总成一张表import os import re results [] for model_dir in os.listdir(outputs): summary_path os.path.join(outputs, model_dir, summary, summary.txt) if os.path.exists(summary_path): with open(summary_path) as f: content f.read() match re.search(rmmbench\s-\saccuracy\sgen\s(\S)\s([\d.]), content) if match: results.append((match.group(1), float(match.group(2)))) results.sort(keylambda x: x[1], reverseTrue) for model, score in results: print(f{model}: {score})第四步定期复跑模型更新很快建议每隔一段时间重新跑一次评测。你可以把上面的脚本放到定时任务里自动执行。长期使用的建议第一固定评测数据集版本。MMBench 的数据集会更新不同版本的得分不能直接对比。建议在配置里固定数据集版本。第二记录每次评测的环境信息。包括 OpenCompass 版本、模型 ID、API 版本等。这样出问题时能快速定位。第三关注细分维度。总分只能反映整体水平细分维度才能告诉你模型的具体能力边界。如果你需要长期跑评测任务可以考虑用 Coding Plan 来管理 API 调用配额https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite对于需要频繁调用模型的评测场景Coding Plan 能提供更稳定的配额管理。最后一步验证模型对话在正式跑全量评测之前建议先用模型对话页面手动测试几个 MMBench 的题目确认模型能正确理解图文输入https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite手动测试能帮你快速发现模型是否支持多模态输入、输出格式是否符合预期。如果手动测试就有问题跑全量评测只会浪费时间。整套流程跑下来你就有了一套可复现的多模态模型评测方案。换模型只需要改配置评测逻辑不用动。这样你就能用同一套标准持续对比不同模型的能力表现。
返回列表