ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ARC-AGI-2 抽象推理基准测试:用 TaoToken 统一 Key 跑通多模型泛化能力对比

ARC-AGI-2 抽象推理基准测试:用 TaoToken 统一 Key 跑通多模型泛化能力对比 1. 为什么我要自己搭一套 ARC-AGI-2 多模型对比流程ARC-AGI-2 抽象推理基准测试简单说就是一套彩色网格变换谜题给你 2 到 5 个输入输出演示对让你猜出隐藏的变换规则再把它套到 1 到 2 个测试输入上单元格级完全匹配才算对。它测的不是你背了多少知识而是面对全新任务时能不能快速适应也就是泛化能力。适合谁适合需要横向对比多个模型抽象推理表现的开发者、做模型选型的技术团队以及想验证「换模型到底有没有提升」的独立研究者。我一开始的想法很朴素既然要对比泛化能力那就把同一批 ARC-AGI-2 任务丢给不同模型看谁答对得多。真动手才发现坑不少。第一每个模型厂商的 Key、Base URL、参数命名都不一样写一套调用代码要改 N 遍第二ARC-AGI-2 的评估自由度很高temperature、few-shot 数量、是否允许思维链任何一个变量变了分数就没法直接比第三Pass2 机制要求每个测试输入给两次尝试机会如果代码里没处理重试逻辑跑出来的分数会偏低。所以这篇不是空谈基准意义而是把我实际跑通的一套流程写出来用 TaoToken 统一 Key 和 API 通道把多模型调用收敛成一份配置再配上 ARC-AGI-2 任务集的加载、推理、评分脚本。你照着做能拿到一份可复现的泛化能力对比结果。核心检索词就三个ARC-AGI-2、抽象推理、泛化能力后面所有步骤都围绕它们展开。先说清楚一个认知ARC-AGI-2 分数是能力上限的指示器不是日常表现的平均值。一个模型在这上面拿 30%不代表它只能解决 30% 的问题而是说在这批专门设计的、训练时没见过的任务上它答对了 30%。理解这一点你才不会对着分数做过度解读。2. TaoToken 前置准备统一 Key 与 API 通道怎么配多模型对比最烦的就是「一个模型一套鉴权」。我试过把 OpenAI、Anthropic、Google 的 SDK 各写一遍光是环境变量就七八个换台机器就得重新配。TaoToken 的价值在于它提供统一的 API 通道你只需要一个 Key就能通过同一套 Base URL 调用不同模型代码里改的只是 model 字段。先做前置准备。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号然后进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 创建后只显示一次记得立刻复制存到密码管理器里。API 通道的基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 Base URL 用。这里要强调一个概念TaoToken 是合规的 API 聚合通道不是所谓的中转你调用的是各模型官方能力只是鉴权和路由被统一了。这一点在团队协作里特别重要因为统一 Key 意味着权限管理、用量统计、成本核算都能在一个面板里看。环境变量我建议这样组织避免把 Key 硬编码进脚本export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用 Python装好依赖后可以先做一次最小连通性测试确认 Key 和通道都正常pip install openaiimport os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], ) resp client.chat.completions.create( modelgpt-5.2, messages[{role: user, content: 回复 OK 两个字母即可}], ) print(resp.choices[0].message.content)跑通这一步说明统一 Key 和 API 通道没问题后面所有模型对比都复用这个 client只换 model 参数。如果你更习惯用配置文件管理多模型可以建一个 models.json把要对比的模型 ID 列进去脚本循环读取。这样加模型、减模型都不用改代码。需要提醒的是不同模型对参数的支持程度不一样。有的模型不接受 temperature有的对 max_tokens 命名不同。统一通道能帮你收敛鉴权但参数兼容还得在代码里做一层适配这个我在第 4 节会给具体处理方式。3. 可复制的多模型调用配置JSON 与 Python 双份这一节是整篇的核心给你两份可直接复制的配置。第一份是模型清单 JSON第二份是调用与评分脚本。路径和字段名我都按实际能跑通的来写你改掉 Key 就能用。先建config/models.json把要对比的模型和各自的推理参数写进去。注意 ARC-AGI-2 对采样很敏感我统一把 temperature 设成 0减少随机性带来的分数波动{ base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, models: [ { name: gpt-5.2, model_id: gpt-5.2, temperature: 0, max_tokens: 4096, supports_cot: true }, { name: claude-opus-4.6, model_id: claude-opus-4.6, temperature: 0, max_tokens: 4096, supports_cot: true }, { name: gemini-3.1-pro, model_id: gemini-3.1-pro, temperature: 0, max_tokens: 4096, supports_cot: true } ] }这份 JSON 里三个字段最关键base_url固定指向 TaoToken 的 API 通道api_key_env指向环境变量名而不是明文 Keymodel_id是实际传给接口的模型标识。你要加模型往 models 数组里追加一项就行。第二份是调用脚本run_arc.py。它做三件事加载 ARC-AGI-2 任务、对每个模型发起 Pass2 推理、按单元格精确匹配评分。ARC-AGI-2 官方任务集是 JSON 格式每个任务包含 train 演示对和 test 测试对网格是二维整数数组。import json import os from openai import OpenAI def load_tasks(path): with open(path, r, encodingutf-8) as f: return json.load(f) def grid_to_text(grid): return \n.join( .join(str(c) for c in row) for row in grid) def build_prompt(task): parts [下面是若干输入输出示例请推断变换规则。] for i, pair in enumerate(task[train]): parts.append(f示例{i1} 输入:\n{grid_to_text(pair[input])}) parts.append(f示例{i1} 输出:\n{grid_to_text(pair[output])}) test_in task[test][0][input] parts.append(f测试输入:\n{grid_to_text(test_in)}) parts.append(请只输出测试输出网格每行数字用空格分隔不要解释。) return \n.join(parts) def parse_grid(text): rows [] for line in text.strip().splitlines(): line line.strip() if not line: continue try: rows.append([int(x) for x in line.split()]) except ValueError: return None return rows def score(pred, truth): return pred truth def run_model(client, model_cfg, tasks): correct 0 for task in tasks: prompt build_prompt(task) truth task[test][0][output] solved False for attempt in range(2): # Pass2 resp client.chat.completions.create( modelmodel_cfg[model_id], temperaturemodel_cfg[temperature], max_tokensmodel_cfg[max_tokens], messages[{role: user, content: prompt}], ) pred parse_grid(resp.choices[0].message.content) if pred is not None and score(pred, truth): solved True break if solved: correct 1 return correct / len(tasks) if __name__ __main__: with open(config/models.json, r, encodingutf-8) as f: cfg json.load(f) client OpenAI( api_keyos.environ[cfg[api_key_env]], base_urlcfg[base_url], ) tasks load_tasks(data/arc-agi-2-eval.json) for m in cfg[models]: acc run_model(client, m, tasks) print(f{m[name]}: {acc:.2%})这段脚本里 Pass2 的实现就是那个for attempt in range(2)两次都失败才算这道题没解出来。评分用pred truth做单元格级精确匹配和官方标准一致。你跑之前把data/arc-agi-2-eval.json换成官方公开评估集即可。如果你用 Claude Code 或 Cline 这类工具做批量实验配置三件套要写全Base URL 填https://taotoken.net/apiKey 填你的 TaoToken KeyModel ID 填claude-opus-4.6这类具体标识。三者缺一工具会报鉴权或模型找不到的错。4. 验证请求与成功结果跑通第一批任务配置写完先别急着跑全量。我建议拿 5 到 10 个任务做冒烟测试确认链路通了再放大。冒烟测试的目的是把「配置错误」和「模型答错」区分开否则你看到分数低根本不知道是代码问题还是模型能力问题。先准备一个小样本文件data/smoke.json从官方评估集里截前 5 个任务。然后跑python run_arc.py如果一切正常你会看到类似输出gpt-5.2: 20.00% claude-opus-4.6: 0.00% gemini-3.1-pro: 40.00%5 个任务样本太小百分比跳动很大这正常。关键是确认三件事请求没有报错、返回内容能被parse_grid解析成网格、评分逻辑能跑完。我实测下来最容易出问题的是模型返回带了解释文字导致parse_grid返回 None。解决办法是在 prompt 里强调「只输出网格」同时在解析时做容错比如用正则把连续数字行抠出来。确认冒烟通过后换成完整评估集再跑一次。这时候建议加个进度输出不然 120 个任务乘以 3 个模型乘以最多 2 次尝试等起来没底。可以在run_model里每处理 10 个任务打印一次当前正确数。成功跑完一轮后你会得到一份横向对比表。我建议把结果存成 CSV方便后续分析import csv with open(result.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([model, accuracy]) for m in cfg[models]: acc run_model(client, m, tasks) writer.writerow([m[name], f{acc:.4f}])这里要提醒一个评估自由度问题如果你给某个模型开了思维链另一个没开那分数不可直接比。我的做法是统一在 prompt 里不强制 CoT让模型自己决定同时把 temperature 锁死为 0。这样至少采样维度是一致的。至于 few-shot 数量ARC-AGI-2 任务自带的演示对就是天然的 few-shot不需要额外加。跑通之后你会发现顶级模型在这批任务上的分数普遍不高个位数到五十几个百分点都有。这跟 MMLU 上动辄八九十分形成鲜明对比也正好说明 ARC-AGI-2 测的是泛化而不是记忆。你可以把这份结果作为模型选型的参考之一但别当成唯一标准。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth跑多模型对比报错基本集中在四类。我把真实遇到过的错误和对应解法列出来你对着查。第一类401 鉴权失败。典型报错是Error code: 401 - {error: {message: Invalid API key}}。原因通常是环境变量没生效或者 Key 复制时带了空格。排查顺序先echo $TAOTOKEN_API_KEY确认变量有值再检查 Key 前后有没有多余空白。如果你在 IDE 里跑注意 IDE 可能没继承 shell 的环境变量需要在运行配置里手动加。还有一种情况是 Key 被删了或过期去控制台重新生成一个。第二类local proxy failed或连接超时。这类报错说明请求根本没到 TaoToken 的 API 通道。先确认base_url写的是https://taotoken.net/api没有多余路径或参数。然后检查本机网络能不能正常访问这个地址可以用 curl 测一下curl -s -o /dev/null -w %{http_code} https://taotoken.net/api如果返回 404 或 000说明网络层有问题。注意不要在任何配置里填代理地址统一通道本身已经处理了路由额外加代理反而会冲突。第三类reading choices报错完整信息类似TypeError: Cannot read properties of undefined (reading choices)。这是返回结构和你预期不一致。常见原因是模型 ID 写错了接口返回了一个错误对象而不是正常的 completion 结构。排查打印完整resp看结构确认model_id在 TaoToken 支持的模型列表里。另一个原因是 max_tokens 设得太大超过了模型上限接口直接拒绝。把 max_tokens 降到 4096 试试。第四类OAuth 相关报错。如果你用 Claude Code 或 Codex 这类工具可能会遇到OAuth token expired或要求重新登录。这类工具默认走官方 OAuth 流程你要做的是在工具配置里改成 API Key 模式把 Base URL、Key、Model ID 三件套填全。以 Claude Code 为例配置文件里需要明确指定 API 通道地址和 Key而不是让它走默认登录。Codex 的auth.json里同样要写全这三项缺一个都会回退到 OAuth 流程然后失败。除了这四类还有一个隐蔽的坑模型返回的网格行列数对但数字范围超了 0 到 9。ARC-AGI-2 的单元格值限定在 0 到 9如果模型输出了 10 或负数即使形状对也算错。我的处理是在parse_grid里加一层校验超出范围直接判为无效预测。排障的核心思路就一条先确认请求发出去了网络和鉴权再确认返回结构对模型 ID 和参数最后确认解析逻辑对格式和范围。按这个顺序查九成问题能定位。6. 把对比流程固化下来持续跟踪与 CTA跑通一次不难难的是让这套流程可复现、可迭代。ARC-AGI-2 是动态基准官方会更新任务集和评分机制你今天跑出的分数过几个月可能因为数据集更新而不可比。所以我的建议是把整个流程脚本化、版本化任务集文件带日期戳模型配置进 Git每次跑完把结果 CSV 和当时的配置一起归档。这样半年后回头看你能清楚知道分数变化是模型升级带来的还是数据集换了。另外一个实用技巧是控制成本。ARC-AGI-2 的推理成本不低尤其是开了长思维链的模型单任务成本可能到几美元。做全量对比前先用分层抽样从评估集里按任务难度或网格大小分几层每层抽固定数量跑一个小规模但代表性的子集。等模型筛选到两三个候选再跑全量。这样既省成本又不至于被单次实验的噪声误导。如果你要长期做模型编码和 Agent 方向的对比可以考虑 Coding Plan它更适合持续性的编码任务和 Agent 工作流地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。单纯想验证某个模型在抽象推理上的表现用模型对话页面快速试几个任务就行https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入过程中遇到鉴权或通道问题直接查接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Key 管理在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。最后说个我踩过的坑别用同一批任务反复调 prompt。你调着调着模型没变强是你的 prompt 过拟合了这批任务。正确做法是留一个 holdout 子集调 prompt 只用训练子集最终评分用没碰过的 holdout。这样得到的泛化能力对比才可信。ARC-AGI-2 本身设计就是为了抗过拟合你的评估流程也得跟上这个思路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进