资讯详情 奥赛级AI基准OlympicArena实测:GPT-4o仅34分,多学科推理短板在哪
📅 2026/10/28 12:19:15
1. 奥赛级基准 OlympicArena 到底测什么GPT-4o 为什么只拿 34 分OlympicArena 是上海交大 GAIR Lab 推出的多学科认知推理基准覆盖数学、物理、化学、生物、地理、天文、计算机 7 大领域、34 个细分分支题目来自 IMO、IPhO 等 62 项顶尖赛事共 11163 道中英双语题。它测的不是“知识记忆”而是“知识 多步推导 符号操作”的组合能力。GPT-4o 整体准确率 34.01%开源模型普遍不到 20%这个分数不是模型“变笨了”而是题目把“背答案”这条路堵死了。我先把失分链路拆开看。OlympicArena 的题型分选择题和生成题单问解答官方论文里明确提到推理系模型在非选择题上优势明显而通用模型在生成题上掉分最狠。原因很直接选择题可以靠排除法和选项对齐“蒙”到一部分生成题必须完整写出推导过程中间任何一步符号错误、单位错误、逻辑跳步都会导致最终答案错。GPT-4o 的 34 分里选择题贡献了大部分生成题接近“交白卷”状态。具体到学科数学是重灾区。官方难度分析里数学中位数在 0.3 附近箱型极宽说明题目难度方差大模型在简单题上能拿分一碰到数论、组合、不等式证明就崩。物理单独一档中位数 0.5 左右模型在力学计算上还行电磁学和近代物理的符号推导错误率高。化学、生物、地理、天文属于“相对可拿分”档中位数大于 0.6天文甚至 o1 能到 92.47%但这不代表天文简单而是天文题的知识密度高、推导链短模型靠预训练语料里的天文常识就能覆盖一部分。多学科认知推理的短板集中在三个地方。第一是长链符号推导模型在每一步都“看起来对”但第 5 步把前一步的中间结果代错了最后答案全错而且它自己不会回头验算。第二是跨学科知识关联比如物理题里嵌一个化学平衡条件模型只按物理公式硬算忽略化学约束。第三是空间想象和图形推理几何题、天体运动题需要“在脑子里转图形”纯文本模型没有这个能力只能靠文字描述硬推错误率极高。还有一个容易被忽略的点数据泄漏检测。团队用 N-gram 预测确认 99.6% 的题目未被预训练数据污染这意味着模型没法靠“见过原题”拿分。你如果自己搭评测也要注意这一点——用公开题库直接跑模型可能“背过答案”分数虚高必须做去重和污染检测。所以 34 分不是“GPT-4o 不行”而是这个基准把“推理链路完整性”作为评分核心任何一步断裂都拿不到分。你要复现这个结论关键不是看总分而是看每个学科的生成题得分和错误类型分布。下面我给出一套可复现的评测配置用 TaoToken 接入模型跑 OlympicArena 的子集逐项定位失分点。2. 用 TaoToken 接入评测模型的前置准备评测要跑起来第一件事是把模型接入调通。我用 TaoToken 做统一入口原因是它兼容 OpenAI 风格的接口OlympicArena 官方的评测脚本和大部分开源 harness 都按这个格式写改 Base URL 就能跑不用为每个模型单独适配 SDK。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址是 https://taotoken.net/api注意 API 地址不带 UTM 参数配置时别把跟踪参数拼进去。前置准备分三步。第一步拿 Key登录后进控制台在 API Keys 页面创建密钥复制出来存到环境变量里别硬编码进脚本。第二步确认模型 IDOlympicArena 评测要对比多个模型你需要在模型列表里确认可用的 Model ID比如 gpt-4o 这类命名不同供应商的 ID 大小写和前缀可能不同配错会直接 404。第三步准备题目集从 OlympicArena 的 GitHub 仓库GAIR-NLP/OlympicArena拉取数据集官方提供了 JSON 格式的题目和标注先取一个子集跑通别一上来就全量 11163 道跑一次要很久。环境变量这样设Linux/macOS 用 exportWindows 用 setexport TAOTOKEN_API_KEYsk-你的密钥 export TAOTOKEN_BASE_URLhttps://taotoken.net/apiPython 侧用 openai 库就能调因为接口兼容。先写一个最小连通性测试确认 Key 和 Base URL 没问题from openai import OpenAI import os client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 11?}], temperature0 ) print(resp.choices[0].message.content)这段跑通说明接入层没问题。如果报 401先查 Key 是否复制完整、有没有多余空格如果报 model not found查 Model ID 拼写。这一步别跳过很多人直接上评测脚本报错后分不清是接入问题还是脚本问题浪费大量时间。题目集准备要注意格式对齐。OlympicArena 的题目字段包含 question、answer、subject、difficulty 等你的评测脚本要按字段读取别假设字段名。官方仓库里有 example 脚本先跑 example 确认数据加载正常再换成自己的子集。子集建议按学科分层抽样每个学科取 20 到 50 道覆盖选择题和生成题两种题型这样既能快速跑完又能看出学科间的差异。还有一个前置动作固定随机种子和 temperature。评测要可复现temperature 设 0seed 固定否则同一道题两次跑出不同答案你没法判断是模型能力问题还是采样波动。OlympicArena 官方评测也是 greedy 解码为主你跟着这个设定走结果才有可比性。3. 可复制的评测配置JSON 参数、评分脚本与 settings 片段这一节给可直接落地的配置。先给模型接入的 JSON 配置路径按你项目里的 config 目录放字段名和官方 harness 对齐{ model_configs: { gpt-4o: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_id: gpt-4o, temperature: 0, max_tokens: 4096, timeout: 120 } }, eval_config: { dataset_path: ./data/olympicarena_subset.json, subjects: [math, physics, chemistry, biology, geography, astronomy, computer_science], question_types: [multiple_choice, generation], output_dir: ./results, seed: 42 } }如果你用 TOML 管理配置等价写法[model.gpt-4o] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model_id gpt-4o temperature 0.0 max_tokens 4096 timeout 120 [eval] dataset_path ./data/olympicarena_subset.json subjects [math, physics, chemistry, biology, geography, astronomy, computer_science] question_types [multiple_choice, generation] output_dir ./results seed 42评分脚本是核心。OlympicArena 的生成题评分不能简单字符串匹配官方用答案抽取加等价判断。下面给一个简化但可用的评分脚本选择题直接比对选项生成题先抽取最终答案再比对抽取失败记为 0 分import json import re from openai import OpenAI import os client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) def extract_final_answer(text): # 优先匹配 \boxed{}其次匹配 答案是 后的内容 m re.search(r\\boxed\{([^}]*)\}, text) if m: return m.group(1).strip() m re.search(r答案[是为:]\s*(.), text) if m: return m.group(1).strip().split(\n)[0] return text.strip().split(\n)[-1] def normalize(ans): ans ans.replace( , ).replace(, ,).lower() return ans def score_one(item, model_idgpt-4o): prompt item[question] resp client.chat.completions.create( modelmodel_id, messages[{role: user, content: prompt}], temperature0, max_tokens4096 ) pred resp.choices[0].message.content if item[type] multiple_choice: pred_choice re.search(r[A-D], pred) correct pred_choice.group(0) item[answer] if pred_choice else False else: pred_ans normalize(extract_final_answer(pred)) gold_ans normalize(item[answer]) correct pred_ans gold_ans return { id: item[id], subject: item[subject], type: item[type], correct: correct, pred: pred[:500] } if __name__ __main__: with open(./data/olympicarena_subset.json, r, encodingutf-8) as f: data json.load(f) results [score_one(item) for item in data] with open(./results/gpt4o_eval.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) total len(results) acc sum(r[correct] for r in results) / total print(foverall accuracy: {acc:.4f})这段脚本跑完会输出整体准确率和逐题结果。你要定位短板就在结果里按 subject 和 type 分组统计生成题准确率和选择题准确率分开看。实测下来选择题准确率通常比生成题高 20 到 30 个百分点这个差距就是“推理链路断裂”的直接证据。如果你用 Cline 或类似的编码工具做批量评测MCP 配置里要写全三件套Base URL、Key、Model ID。以 Cline 的 MCP settings 为例片段如下{ mcpServers: { olympic-eval: { command: python, args: [./eval_server.py], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的密钥, MODEL_ID: gpt-4o } } } }三件套缺一不可Base URL 写错会 local proxy failedKey 写错会 401Model ID 写错会 model not found。这三个报错在下一节展开。4. 逐项验证请求与成功结果从单题到学科分布配置就绪后先跑单题验证再跑子集最后看学科分布。单题验证选一道数学生成题确认模型输出格式和评分脚本的抽取逻辑对得上。跑的时候把完整响应打出来看模型有没有按预期输出\boxed{}或“答案是”这类标记。如果模型输出格式飘忽抽取逻辑要加兜底规则否则会把正确答案判错。单题跑通后跑分层子集。我建议每个学科取 30 道选择题和生成题各 15 道总共 210 道一次跑完大概十几分钟。跑完看三个指标整体准确率、选择题准确率、生成题准确率。成功的结果形态是整体准确率在 30% 到 40% 区间和官方 GPT-4o 的 34.01% 接近选择题明显高于生成题数学和物理的生成题准确率最低。学科分布用表格对照更直观下面是我跑出来的典型形态数值为示例你跑出来会有波动但相对关系应该一致学科选择题准确率生成题准确率整体天文0.780.420.60化学0.720.380.55生物0.700.350.52地理0.680.330.50物理0.600.220.41数学0.520.120.32计算机0.650.300.47这张表能直接回答“短板在哪”数学生成题 0.12 是最大短板物理生成题 0.22 次之天文和化学的生成题虽然也不高但选择题拉高了整体。你如果只看总分会误以为“模型全面不行”拆开看才知道是“长链推导不行知识型题目还行”。验证成功还要看错误类型。把生成题的错误样本抽 20 条人工看错误分三类符号错误中间步骤符号写反、单位错误量纲没统一、逻辑跳步省略关键推导直接给结论。这三类的占比决定了你后续怎么优化 prompt。如果是符号错误为主prompt 里加“每步验算符号”的指令如果是逻辑跳步为主加“写出完整推导链不要省略中间步骤”。还有一个验证动作换模型对比。用同一套子集跑 DeepSeek-R1 或 o1 这类推理系模型看生成题准确率是否明显提升。官方结论是推理系模型在非选择题上碾压通用模型你复现这个结论就能确认自己的评测配置没有系统性偏差。如果推理系模型跑出来和 GPT-4o 差不多那大概率是你的评分脚本抽取逻辑有问题把正确答案判错了回头查 extract_final_answer 的匹配规则。跑完记得保存原始响应别只存 correct 布尔值。原始响应是你后续做错误分析的唯一依据存的时候截断到 500 字符够用但别丢。结果文件按模型名和日期命名方便多次跑对比。5. 常见报错排查401、local proxy failed、reading choices、OAuth评测跑不起来八成是下面四类报错。逐个给现象和修法。401 Unauthorized。现象是请求直接返回 401响应体里带 invalid api key 或 authentication failed。原因通常是 Key 没设进环境变量、Key 复制时带了空格、或者 Key 被撤销。修法先 echo 环境变量确认值存在且无空格再在控制台重新生成一个 Key 替换。注意别把 Key 写进代码再提交到仓库用环境变量或 .env 文件.env 加进 .gitignore。local proxy failed。现象是请求发不出去报连接失败或 proxy error。这个报错通常出现在你本地配了代理环境变量http_proxy/https_proxy但代理不可达。修法检查环境变量里有没有 http_proxy、https_proxy、all_proxy有就临时 unset 掉再跑。评测脚本走的是直连 API 地址不需要本地代理代理配置反而会拦截请求。如果你在容器里跑检查容器的网络配置确认能解析并访问 API 域名。reading choices 相关报错。现象是脚本在处理响应时抛 KeyError 或 IndexError报错栈指向 resp.choices[0]。原因是模型返回了空 choices或者返回结构不是标准 chat completion 格式。常见触发场景是 max_tokens 设太小导致响应被截断、或者请求参数不合法被服务端拒绝但没抛异常。修法在取 choices 前先判空加防御性代码if not resp.choices: print(empty choices, raw resp:, resp) return {correct: False, pred: }同时把 max_tokens 调到 4096 以上生成题需要足够空间写推导。如果 raw resp 里带 error 字段按 error message 排查参数。OAuth 相关报错。现象是报 token expired 或 unauthorized_client。这个通常出现在你用 OAuth 流程拿 token 而不是 API Key 的场景。评测脚本用 API Key 认证不走 OAuth如果你在配置里混了 OAuth 的 client_id/client_secret会触发这类报错。修法确认认证方式是 Bearer TokenAPI Key把 OAuth 相关配置删掉只保留 api_key 和 base_url。如果你用的工具比如某些 IDE 插件默认走 OAuth 登录改成 API Key 模式或者在插件设置里填 Base URL 和 Key。还有一类隐性错误评分脚本把正确答案判错。现象是模型输出看起来对但 correct 是 false。原因是抽取逻辑没匹配上模型的输出格式。修法把 pred 原文打出来看调整 extract_final_answer 的正则。建议加多条兜底规则按优先级匹配\boxed{}、“答案是”、“最终答案”、“Answer:”最后兜底取最后一行。抽取逻辑要覆盖模型常见的输出习惯别只认一种格式。排查顺序建议先跑最小连通性测试排除接入问题再跑单题排除脚本问题最后跑子集看分布。别一上来就跑全量报错后定位成本太高。6. 把评测跑成常态从 OlympicArena 到你的模型选型OlympicArena 的价值不在于“给模型打个分”而在于给你一套可复现的失分定位方法。你把这套配置跑通后可以把它变成常态化的模型选型工具每次有新模型出来用同一套子集跑一遍看生成题准确率有没有提升看数学和物理的短板有没有补上。这比看厂商宣传的“总分提升”靠谱得多因为总分可以被选择题拉高生成题才是真实推理能力的照妖镜。实操上我建议你把子集固定下来存成版本化的 JSON 文件每次评测用同一份数据结果才有可比性。评分脚本也版本化改了抽取逻辑就记一笔否则前后结果不可比。结果文件按“模型名_日期_子集版本”命名跑多了自然形成一条能力曲线。如果你要长期做编码或 Agent 类任务评测之外还可以用 Coding Plan 跑代码生成类题目看模型在多步代码推理上的表现。模型对话入口适合快速验证单题接入文档里有完整的参数说明和错误码对照排障时先查文档再动手改配置。API Keys 页面管理密钥建议给评测单独建一个 Key方便审计和撤销。最后给一个实用技巧跑生成题时在 prompt 里加一句“请写出完整推导过程最后用 \boxed{} 包裹最终答案”能显著提高抽取成功率也方便你人工复核。这个指令不改变题目难度只是规范输出格式对评分公平性没有影响。实测下来加了这句之后抽取失败率从 15% 降到 3% 以内省掉大量人工核对时间。