GEOZ

10款大模型计数能力实测:让模型自己数330个ID,最贵的Claude Opus 5只对了9次

2026/9/29
10款大模型计数能力实测:让模型自己数330个ID,最贵的Claude Opus 5只对了9次

AIAI Summary (BLUF)

这篇基准测试对比了10款大模型在工具调用场景下的计数能力。当工具直接返回精确计数时,几乎所有模型都能正确回答;但当工具返回ID列表需要模型自己数时,模型表现出现严重分化:愿意花更多token推理的模型计数准确,而快速回答的模型错误率极高。结论是:把计数逻辑放在工具端,而不是让模型自己数。

核心洞察

这个测试最让我意外的不是模型数数会出错,而是贵的不一定对。Claude Opus 5 花了最贵的钱,数 330 个 ID 只对了 9 次;一个开源小模型 Gemma 4 26B 反而对了 20 次。问题出在工具设计上:你让模型自己去数返回的列表,它就可能偷懒。


核心结论

  1. 在 330 个 ID 的计数任务中,当工具直接返回数量(count-engine)时,10 个模型中有 9 个答对了全部 21 道题,每题仅消耗 35 到 451 个输出 token,且 token 消耗不随列表长度增长。

  2. 当工具返回 ID 列表、由模型自行计数(count-rows-tool)时,8 个在 11 个 ID 上全对的模型中有 5 个在 330 个 ID 上只数对了 21 道中的 10 道或更少,且没有任何报错提示。

  3. 数得对的模型 token 消耗显著更高:Gemma 4 26B 在 330 个 ID 时每题消耗 8,153 个输出 token,数对 20/21;而最贵的 Claude Opus 5 每题仅消耗 579 个 token,只数对 9/21。

  4. 所有错误均源于算术而非查询:两个任务中没有任何一个答案是建立在错误的 ID 过滤条件上的,Rows 工具上的每个错误都是把正确的列表数错了。

  5. 使用 Python 工具时,10 个模型中有 7 个拿到 68/68 满分,前提是模型主动调用工具并打印结果。

我测了什么

起因是十一个 ID:

0, 2, 3, 20, 21, 22, 23, 10, 11, 12, 13

问模型:大于等于 10 的有几个?答案是 8 个。所有模型都答对了。十一个 ID 太短了,短到看不出任何问题,而大多数人的快速测试也就用这个量级。

语言模型不擅长数数,这事从“数一个单词里有几个字母”那类例子就有人知道了。我想测的是它在 agent 场景下的表现:工具返回一堆记录,用户问有多少条,模型自己数。这个环节平时没人单独测,因为少量数据的时候它看起来永远是对的。

测试固定了所有变量,只改一件事:谁来数。

任务 模型拿到什么 谁负责数
count-engine count_ids(where),直接返回精确数量、最小值和最大值 工具
count-rows-tool list_ids(where),返回匹配的 ID 列表 模型自己从列表里数
count-python-tool prompt 里包含所有 ID,外加一个 run_python 工具,ids 变量已定义 模型写的代码,如果它写的话

前两个任务里 ID 不会出现在 prompt 中,唯一的区别就是工具返回的是一个数字还是一个列表。两个任务都会检查模型发出的过滤条件是否正确,id > 9 对于“大于等于 10”算对。每个错误答案都能追溯到是查询写错了还是数错了。

每个任务 68 道题:列表长度分别为 11、110、330 个 ID,七种不同的阈值表述(“大于等于 10”、“不少于”、“小于”、“5 到 9 之间含两端”等等),每种三个随机种子,再加上原始那十一个 ID 重复五次。每个阈值都是列表里真实存在的 ID,所以 > 和 >= 的结果一定不同。

测了哪些模型

厂商 模型
Google Gemini 2.5 Flash, Gemini 3.7 Flash, Gemini 3.8 Flash, Gemma 4 26B A4B
Anthropic Claude Haiku 4.5, Claude Sonnet 5, Claude Opus 5
OpenAI GPT-5.4 nano, GPT-5.4 mini, gpt-oss-20b

每个厂商取了小杯、中杯、大杯,再加上 Google 和 OpenAI 的开源权重模型,这样价格、参数量、以及普通人能不能跑起来都覆盖到了。每个模型用 Kaggle 模型代理提供的默认设置运行。有些模型回答前会先推理,有些直接给答案,这个设置对结果的影响比模型大小和价格都大。

GPT-6 Astra 被代理拒绝了 function tools(Function tools with reasoning_effort are not supported for gpt-6-astra in /v1/chat/completions)。Gemini 3.5 Flash-Lite 和两个 Qwen 3 Next 80B 模型大部分调用返回 429 或 503。

结果

330 个 ID 的时候,模型之间的差距拉开了:

模型 Rows 工具正确数 每题输出 token(Rows 工具) Engine 正确数 Rows 工具成本 vs Engine
Gemma 4 26B A4B 20/21 8,153 21/21 18.6x
Gemini 3.7 Flash 20/21 2,785 21/21 13.5x
Gemini 3.8 Flash 21/21 2,742 21/21 14.3x
gpt-oss-20b 15/21 2,684 19/21 5.2x
Gemini 2.5 Flash 0/21 580 21/21 2.6x
Claude Opus 5 9/21 579 21/21 2.4x
Claude Sonnet 5 10/21 401 21/21 1.9x
Claude Haiku 4.5 5/21 143 21/21 1.5x
GPT-5.4 mini 5/21 39 21/21 1.9x
GPT-5.4 nano 0/21 35 21/21 1.7x

Claude 系列的 Rows 工具数据来自 2026-09-25 那轮运行,同样的 68 道题、同样的工具;他们 2026-09-28 的 Rows 工具运行因为每日配额用尽中断了。其他所有数据来自 2026-09-28 的运行。

一、工具直接返回数量时,所有模型都对,成本也平稳

除了一个模型,其他所有模型在 330 个 ID 的 Engine 任务上都答对了全部 21 道题,每题输出 35 到 451 个 token,而且从 11 个 ID 到 330 个 ID,每个模型的 token 消耗基本没变。把“不少于 244”翻译成 id >= 244 再把工具返回的数字念出来,这里每个模型都能稳定做到。唯一的例外是 gpt-oss-20b,它在 68 道 Engine 题里有 5 道给出了和工具返回值不一样的数字,全是 0、1 或 2,还有一次没调工具就回答了。

二、返回列表时,短列表能过,长列表就崩

十个模型里有八个在 11 个 ID 的 26 道题上全部数对。到了 330 个 ID,这八个里有五个只数对了 21 道中的 10 道或更少。它们没有报错,也没有犹豫,每个答案都是一个自信的数字。

三、数得对的模型,token 花得多

模型按 token 消耗量分成两组,模型大小和价格都预测不了这个分组。这是最让我意外的地方。数得对的模型,列表越长花得越多:Gemma 4 26B 从 11 个 ID 时每题 394 个输出 token,涨到 330 个 ID 时的 8,153。数错的模型在每个长度上花的 token 差不多:GPT-5.4 nano 在 11、110、330 个 ID 时每题都花 35 个 token,根本没留出数数的空间。Claude Opus 5 是这里最贵的模型,330 个 ID 时每题花 579 个输出 token,数对了 9 道;Gemma 4 26B 是开源权重模型,花了 8,153 个 token,数对了 20 道。

同一个模型在每一轮 Rows 工具运行里都落在同一组,每个模型在 2026-09-25 到 2026-09-28 之间跑了三到四轮。组内排名会波动几道题。

靠推理来数对,成本是 Engine 方案的 5 到 19 倍。之前一轮把 1,100 个 ID 放进 prompt 的实验从另一个方向印证了同样的关联:输出限制在 8,192 个 token 时,Gemini 3.7 Flash 只数对了 21 道中的 1 道,不限制时是 19 道和 15 道,而且每次都照样给数字。

四、查询每次都写对了

两个任务里没有任何一个答案是建立在选错 ID 的过滤条件上的。Rows 工具上的每一个错误,都是模型把正确的列表数错了,除了 3 次没调工具就回答和 1 次答案读不出数字。问题出在算术上。

五、Python 工具只要用了就管用

prompt 里包含所有 ID,外加一个 Python 工具,10 个模型里有 7 个拿了 68/68 满分。Gemini 2.5 Flash 在 110 和 330 个 ID 的 42 道题里只调了 1 次工具,得了 37 分。

这改变了我对这些模型的看法

在这些运行里,数一个列表是模型用 token 做的工作,直接给答案的模型根本没做这个工作。一个返回列表的工具把这项工作转嫁给了模型,让准确率取决于调用方可能从来没看过的某个设置。数量应该放在工具里:返回数量、最小值和最大值,这个阵容里的每个模型都能以零头的 token 成本答对。

对比

Engine Rows 工具 Python 工具
谁数 工具 模型,从返回的列表里数 模型的代码,如果它写的话
330 个 ID 时每题输出 token 35 到 451 35 到 8,153 —
出了什么问题 念了一个和工具返回值不同的数字 把正确的列表数错了 跳过工具,没写 print()
建立在错误过滤条件上的答案 0 0 —

所以选哪个

  • Engine — 把数量、最小值和最大值放进工具。每个模型都对,成本平稳。
  • Python 工具 — 模型用了就可靠,前提是它打印结果并把结果念出来。
  • Rows 工具 — 只有在模型会逐条推理列表时才正确,每题成本是 Engine 的 5 到 19 倍。

接下来想测什么

同一个模型开推理和关推理的对比。 Claude Opus 5 开扩展思考对比默认设置。这里的运行显示 token 和准确率跨模型是联动的;这个实验能看出对单个模型来说打开推理是否就够了。

其他算术操作。 求和、平均值、返回行里的最大值,同样的工具形态问题也适用于这些。

更难的过滤条件。 “至少 10 但小于 20”和“5 到 9 之外”,这种条件下如果过滤写错了但数量算对了就会暴露出来。

怎么复现

以下步骤从仓库重建整个基准测试;任务、运行、以及上面每一张表都来自这些命令。

准备工作

  • 一个 Kaggle 账号,装好 Kaggle CLI(pip install kaggle,这里用的是 2.2.4 版本),用 kaggle auth login 登录
  • Python 3,用于本地检查和报告生成;任务导入的 kaggle_benchmarks 库在 Kaggle 上已经装好了
  • 克隆仓库:git clone https://github.com/xbill9/devto-kaggle,然后 cd devto-kaggle

第一步 — 本地检查题目

每道题都是代码生成的,期望数量来自对 ID 跑一遍过滤条件。check.py 构建全部 68 道题,不调模型也不需要 Kaggle 库:

python3 tasks/check.py
ok: 68 rows per task, by size {11: 26, 110: 21, 330: 21}

第二步 — 推送每个任务

tasks/ 里每个文件是一个 Kaggle 任务。文件里第一个 @kbench.task 返回正确率,因为 Kaggle 用第一个找到的任务来命名和读取分数。第二个任务回答一道题,每道题运行一次:

@kbench.task(name="count-engine")
def count_engine(llm) -> float:
    runs = count_engine_row.evaluate(
        llm=[llm], evaluation_data=pd.DataFrame(ROWS), n_jobs=4,
    return summarize(runs, len(ROWS), "engine")

每道题的结果保留了答案、模型发出的每个过滤条件、以及 Kaggle 模型代理报告的 token 和成本。推送的 slug 必须和任务名一致:

kaggle b t push count-engine -f tasks/count_engine.py --wait
kaggle b t status count-engine
Task:     count-engine
Version:  13
Status:   Completed
Created:  2026-09-28 16:11:45

第三步 — 跑模型

kaggle b auth -y 获取 Kaggle 模型代理的短期密钥,kaggle b t models 列出模型 slug。一次运行每个模型一个 -m:

kaggle b t run count-rows-tool -m gemini-2.5-flash -m gemini-3.8-flash -m gemma-4-26b-a4b-it -m gpt-oss-20b -m gpt-5.4-nano-2026-03-17 -m gpt-5.4-mini-2026-03-17 --wait
All runs completed:
  gpt-5.4-mini-2026-03-17: COMPLETED
  gpt-5.4-nano-2026-03-17: COMPLETED
  gpt-oss-20b: COMPLETED
  gemma-4-26b-a4b-it: COMPLETED
  gemini-3.8-flash: COMPLETED
  gemini-2.5-flash: COMPLETED

提示:限制输出以节省配额

Kaggle 模型代理会按输出 token 上限预留最坏情况的成本,当预留超过当天剩余配额时会拒绝调用。不设限制时,GPT-6 Astra 每次调用预留 6.40 美元,Claude Opus 5 预留 3.20 美元。传一个限制能把预留压到几美分:

llm.prompt(prompt, schema=int, extra_api_params={"max_completion_tokens": 8192})

第四步 — 下载运行结果并生成表格

report.py 从下载的运行结果生成这篇文章里的每一张表,包括每题的 token 和成本:

for t in count-engine count-rows-tool count-python-tool; do kaggle b t download $t -o results; done
python3 tasks/report.py results
| Model | Size | Engine correct | Engine out tokens | Engine $ | Rows correct | Rows out tokens | Rows $ |
|---|---|---|---|---|---|---|---|
| Gemini 3.8 Flash | 330 | 21/21 | 140 | 0.0010 | 21/21 | 2,742 | 0.0146 |
| GPT-5.4 nano | 330 | 21/21 | 35 | 0.0002 | 0/21 | 35 | 0.0003 |

第五步 — 把任务组合成基准测试

基准测试在 Kaggle 网页端创建。在基准测试页面上,Add Tasks 添加任务,Add Models 添加模型。在 Settings 下,把总分设为 Average of task scores:默认的 Percentage of tasks passed 会忽略返回数字的任务。可见性设为 Public 后不可撤销。

提示:排行榜显示每个模型的最新一轮

排行榜每个格子显示该模型该任务最近一次运行的结果,所以一次因配额失败的运行会覆盖之前完整的结果。运行前检查配额,如果有一个失败了就重新跑那一对。pending.py 列出最新运行不完整的配对。

我的基准测试

总结

这篇文章的目标是测量模型能否正确数出工具返回的内容。关键在于只改工具返回什么,一个数字还是一个列表,并记录每个过滤条件和每个 token。

结果:

  • 工具里带数量时,除了 gpt-oss-20b,每个模型在 330 个 ID 的题目上都答对了。
  • 返回列表时,每题花 2,700 到 8,200 个输出 token 的模型,在 330 个 ID 的 21 个列表中数对了 15 到 21 个。
  • 600 个 token 以内就回答的模型,21 个里只数对了 0 到 10 个,Claude Opus 5 也在其中,而且没有任何报错提示。

每个模型用 Kaggle 模型代理的默认设置运行每个任务,输出限制在 8,192 个 token;Engine 和 Rows 工具的数据来自 2026-09-28 的运行,Claude 的 Rows 工具数据来自 2026-09-25,Python 工具数据来自 2026-09-28,token 上限的结果来自更早的 1,100 个 ID 上下文内运行。

跨 10 个模型测试数数的策略,是用逐步递进的方式验证的。

参考

常见问题(FAQ)

AI搜索优化中,工具返回ID列表让模型自己数,为什么长列表容易出错?

模型需要自己数列表,长列表时快速回答的模型token消耗少,没留出数数空间,错误率高;愿意花更多token推理的模型才数得对。

如何优化AI搜索中的计数任务,避免模型数错?

把计数逻辑放在工具端,让工具直接返回精确数量、最小值和最大值,而不是返回ID列表让模型自己数。这样所有模型都能答对,成本也平稳。

为什么Claude Opus 5在计数任务上表现不如Gemma 4 26B?

Claude Opus 5虽然贵,但快速回答,token消耗少,数330个ID只对9次;Gemma 4 26B愿意花更多token推理,对了20次。模型大小和价格预测不了计数能力。

晓婷深圳
本文由 晓婷 审核,最后更新于 2026年9月29日
联系编辑 →
← 返回文章列表
分享到:微博

版权与免责声明:本文仅用于信息分享与交流,不构成任何形式的法律、投资、医疗或其他专业建议,也不构成对任何结果的承诺或保证。

文中提及的商标、品牌、Logo、产品名称及相关图片/素材,其权利归各自合法权利人所有。本站内容可能基于公开资料整理,亦可能使用 AI 辅助生成或润色;我们尽力确保准确与合规,但不保证完整性、时效性与适用性,请读者自行甄别并以官方信息为准。

若本文内容或素材涉嫌侵权、隐私不当或存在错误,请相关权利人/当事人联系本站,我们将及时核实并采取删除、修正或下架等处理措施。也请勿在评论或联系信息中提交身份证号、手机号、住址等个人敏感信息。