这是对 Kaggle 基准测试挑战赛 的投稿。
我基准测试的内容
简短版本
我构建了 InsightTrack,一个开源的网络分析
平台。它具有一个名为 Pulse 的 AI 分析师。您会问 "为什么上周 /pricing 页面的流量下降?",然后 Pulse 会选择合适的工具,读取数据,并用通俗易懂的英语作答。
Pulse 需要一个语言模型作为后盾。我想用证据而不是直觉来选择该模型,所以我
把 Pulse 的实际工作变成了一个基准测试:480 个问题,自动评分,答案来自 InsightTrack 自身的代码。
问题:AI 分析师可能会自信地犯错
分析助手不仅仅是用来提供趣味事实的聊天机器人。人们会根据它的说法行动:他们可能会修改页面、暂停广告活动,或停止担心。当它出错时,错误通常表现为以下两种代价高昂的情况之一:
- 它会编造原因。 流量变化可能源于枯燥的原因(比如假期、新闻通邮或纯粹的噪声),而助手会自信地将其归咎于谷歌排名。您可能会花一天时间去修复其实并未出问题的 SEO。
- 它会忽略真实问题。 流量可能减半,而助手却说“没有显著变化”。您可能要等一个月后才发现。
这两种情况都比说“我不知道”更糟。一个有用的分析师需要具备三种习惯,而这些习惯在通用 AI
排行榜上看不到。
- 克制: 在事实确实如此时,会说“这只是噪声”或“数据未显示这一点”。
- 对数字的规则遵循: 精确应用阈值。对只有 6 位访客的 15% 变化不算趋势。
- 读取真实工具输出: 实际返回的精确字段、四舍五入方式和格式,而非教科书中的示例。
为什么通用基准无法回答这个问题
公共基准在告诉您哪个模型在数学方面更强、编码更好或
函数调用更正确方面表现出色。但为产品选择模型是一个 产品决策,它有
三个它们无法为您回答的问题:
- Accuracy on my job: 我的工具、我的数据格式、我的数据库方言(DuckDB,而非 PostgreSQL)。
回答这些问题的唯一方法是在实际工作中测试模型。这就是这个基准所做的。
它包含什么
InsightTrack 分析师基准 包含四个任务的 480 个自动评分用例。前三个是 Pulse 今天的工作;第四个是 SQL,这是 Pulse 尚未采取的一步:在没有内置工具适用时编写查询。
| 任务 | Pulse 必须做什么 | 模型获得什么 | 何时正确 |
|---|---|---|---|
| 工具选择 | 决定如何回答 | 用户问题 + InsightTrack 真实的 23 种工具目录 | 它选择正确的工具和参数,或者在没有工具能完成时说“无” |
| 数据读取 | 理解结果 | InsightTrack 真实输出格式的工具结果 | 它得到正确的数字,或者返回 not_available 而不是编造一个数字 |
| 诊断 | 解释变化 | 8 周的页面流量 + 前后的 Google 结果 | 它说明变化是否真实、方向以及 确切 的原因集合 |
| SQL | 深入挖掘(Pulse 路线图上的下一步) | InsightTrack 的 DuckDB events 和 sessions 表 |
其查询,只读执行,返回正确的行 |
每个任务有 80 标准 + 40 困难 个用例。困难用例体现在粗心的推理中:
- 恰好落在阈值上的变化(例如 15.0% 的下降)
- 若干关键词指向不同方向
- 完全停止排名的页面
- 类似的域名:
getsite.com是另一个站点,但www.site.com是您的站点
一个案例,逐步分解
以下是一个简化后的诊断问题示例:
-
每周页面浏览量:
… 495, 517, 347。上周下降了 170 次浏览,即 33%。 - Google,之前: 该页面在其关键词上的排名为 #3。
- Google,现在: 其排名为 #5。其他未变。
- 规则全部在提示中。只有当变化至少为 15% 且 至少有 20 次浏览时才算数。排名变动 1–2 位属于正常抖动,绝不是原因。
正确答案:下降是真实的,但搜索并未导致它。 在 InsightTrack 的术语中,
{"significant": true, "direction": "drop", "causes": ["unexplained_by_serp"]}。诱人的错误
答案是 "你的排名下降"。说出这种答案的模型会让用户去修复其实并未损坏的 SEO。
这就是基准的核心:模型能否区分真实原因和巧合?
为什么这些答案可以被信任
没有 LLM 会给另一个 LLM 打分:
- 诊断: 答案密钥是 InsightTrack 自身的相关引擎,已移植到 Python。测试会在每个案例以及另外 1,500 个随机案例上运行 original JavaScript,任何不一致都会导致失败。
- SQL: 答案通过 执行 模型的查询来评分,因此两个不同但正确的查询都会通过。
- 其他一切: 其他所有答案均基于模型所看到的相同数据计算得出。
- 数据: 全部为合成数据(5,940 事件,2,494 次会话),不含任何真实个人数据,且整个数据集可以逐字节重建。
每个评分者还会标注 how 模型出错:虚构原因,将真实变化称为噪声,
编造数字,拒绝回答可回答的问题,使用不存在的工具。这将把得分转化为你可以采取行动的东西。
谁会受益
- 在分析或 BI 数据上构建 AI 功能的开发者。 你面临着我曾经面临的同样的选择。这些结果以及上面的失败类型展示了对每类模型的预期。
- 预算有限时挑选模型的任何人。 这些结果为准确性定价:在哪些地方多花钱能带来很大提升,而在哪些地方多花钱却毫无用处。
- 构建和评估模型的人。 大多数测试奖励已知知识。此测试奖励 不 声称事物,这更难衡量,但在实际产品中很重要。
- InsightTrack 的用户。 Pulse 从证据而非猜测中获取其模型和安全检查。
已测试的模型
所有模型均通过 Kaggle 的模型代理在同一任务版本上运行。我按配对挑选它们,以便每个
比较都能回答一个实际问题:
- 前沿 vs. 低成本,同一公司: Claude Sonnet 5 vs. Claude Haiku 4.5,以及 Gemini 3.7 Flash vs. Gemini 3.5 Flash-Lite。 省钱会损失多少?
- 推理开启 vs. 关闭,同一模型: Grok 4.20 带有和不带有推理。 “思考”会改变答案吗?
发现
| 模型 | 工具选择 | 数据读取 | 诊断 | SQL | 总体 | 成本 (480 病例) |
|---|---|---|---|---|---|---|
| Claude Sonnet 5 | 100 | 100 | 100 | 100 | 100.0 | $2.08 |
| GPT-5.5 | 100 | 100 | 96.7 | 100 | 99.2 | $3.23 |
| Grok 4.20 (reasoning) | 100 | 96.7 | 100 | 95.0 | 97.9 | $1.21 |
| Gemini 3.7 Flash | 100 | 100 | 100 | 90.8 | 97.7 | $1.07 |
| Gemini 3.5 Flash-Lite | 98.3 | 88.3 | 49.2 | 88.3 | 81.0 | $0.20 |
| Claude Haiku 4.5 | 98.3 | 82.5 | 44.2 | 86.7 | 77.9 | $0.63 |
| Grok 4.20 (no reasoning) | 98.3 | 82.5 | 35.0 | 92.5 | 77.1 | $0.40 |
| GPT-5.4 nano | 93.3 | 61.7 | 20.0 | 93.3 | 67.1 | $0.07 |
1. 工具选择问题已解决。诊断是模型分歧的地方。
每个模型至少有 93% 的时间选择了正确的工具。因此,“它能否调用工具?”对于分析助手来说不再是有趣的问题。真正的问题是它是否理解该
数字 意味着什么。在诊断方面,前三名模型得分 100%,GPT-5.5 得分 96.7%,而每个更便宜的
模型得分在 20% 到 49% 之间。

2. 同一模型,推理开启 vs. 关闭:100% 对比 35%
Grok 4.20 带有推理功能在所有诊断病例中答对。同一模型在没有推理功能的情况下答对率为
35%。它在所有 16 个多因素病例中失误,以及 12 个干扰项中的 9 个。结果中其他方面没有移动如此
程度。如果你的助手回答“X 为什么会变化?”,推理功能不是可有可无的。
3. 便宜模型以两种相反的方式失效
危言耸听者。 没有推理,Grok 凭空编造了 34 次搜索原因。 在一种情况下,流量
上升 从 437 次浏览增加到 538 次浏览,而该页面在 Google 上的排名从第 3 位下降到第 5 位。 提示明确说明,1–2 位的变动是正常抖动,绝不是原因。 Grok 回答:
{"significant": true, "direction": "spike", "causes": ["rank_drop"]}
他们把流量 rise 的增长归因于排名 drop 的下降。正确答案是 unexplained_by_serp:这一变化
并非来自搜索。
耸肩者。 GPT-5.4 nano 则走向了另一方向,将真实的变化称为噪声,共 73 次。一个页面的浏览量
从 209 降至 110 次(−47%),就在它从 Google 排名 #14 滑落到 #26 之后。Nano 回答:
{"significant": false, "direction": null, "causes": []}
对一款分析产品来说,这种失误最危险:报假警的模型让你白忙活一下午,满不在乎的那个
则在你流量被腰斩时,还一直告诉你一切正常。
4. 信号混杂时,所有更便宜的模型全部失灵:8题0分
在最难的那批案例里,一个关键词排名下滑,另一个关键词却在上升,而整体流量是下降的。正确答案应当
只指出那处下降,因为上升解释不了流量为何减少。Flash-Lite、Haiku、不开推理模式的 Grok,以及
nano,8道题全部得 0 分。比如 Haiku 把流量下滑归咎于 ai_citation_gained,可提示词里写明
这条规则只在流量上涨时才适用。真实页面往往同时排上多个关键词,所以这种情况是
家常便饭,而非罕见边角案例。
5. 读取数据:便宜的模型要么拒答,要么瞎编
在读取数据这项上,面对数据本身无法回答的 24 道标准题,7 个模型全都正确地回复了
not_available。但难题集里的陷阱让它们高下立判:
- 凭空编数:要求统计一列页面的独立访客总数(这本不可能,因为同一个人可能访问多个页面),nano 却笃定地报出 9,149。
- 拒答本可回答的问题:nano 出现了 13 次,其他几个便宜模型也各有 5–7 次。明明一次简单计算就能得出答案,它们却回复“不可用”。
一个分不清“我算不出来”和“这根本算不出来”的模型,两头都靠不住。
6. SQL 出错是习惯问题,不是逻辑问题
Gemini 3.7 Flash 在 JSON 类题目上得了 0/7,而其余题目几乎全对。每一次,
它都写出这样的代码:
WHERE properties->>'name' = 'signup'
在 PostgreSQL 中这没问题。在 DuckDB 中,->> 的优先级低于 =,因此会被解析为
properties ->> ('name' = 'signup') 并导致崩溃。加上一对圆括号即可解决。这看起来是从 PostgreSQL 带来的习惯,而在示例中 PostgreSQL 的使用远多于 DuckDB。
Claude Haiku 在回答过程中自我纠正。 在 9 次 SQL 回答中,它先写出一个查询,然后发出 "等等,让我
重新考虑……",接着给出第二个查询。提示只要求给出查询,因此评分者采用第一个答案。在这 9 次中,有 8 次第二个查询是正确的。如果以最后一个查询为准,Haiku 的 SQL 分数本应为 93.3%,而实际上只有 86.7%。这正是在工具调用中大声思考的真实成本:模型与数据库之间的任何中间内容都会读取第一个答案。
7. GPT-5.5 的唯一失误来源于我的提示
GPT-5.5 在诊断上恰好犯了四次错误,且这四次错误完全相同。每次,一个页面刚好滑过第 10 名(#10 到 #11 两次,#10 到 #12 一次,#9 到 #11 一次):它掉出了第一页,因此答案是 page_one_exit。GPT-5.5 每次都回答 unexplained_by_serp。
重新审视我的提示后,我发现其中有两条规则相互冲突:
-
page_one_exit: "位置之前在 1–10 范围内;现在低于 10"。 - "1–2 个位置的变动是正常抖动,并且绝不是原因。"
我本意是让抖动规则覆盖 rank_drop 和 rank_gain。GPT-5.5 将 “never” 理解得字面意思。Claude Sonnet 5、Gemini 3.7 Flash 以及带有推理能力的 Grok 都理解了我的意图。两种理解都不算粗心。有一种模型遵循指令的字面意思,而其他模型则遵循其精神,这一点值得我们在为任何模型制定规则时了解。这也提醒我们 基准测试的提示本身也是代码。下一个版本将会说明 “never 不应计入 rank_drop 或 rank_gain”,而我将按现状报告得分,而不是悄悄修复它。
8. 价值:Gemini 3.7 Flash 是最佳选择
Gemini 3.7 Flash 在大约 Claude Sonnet 5 一半的成本下达到了 97.7%。GPT-5.5 是成本最高的一次运行(3.23 美元),但仍然仅次于 Sonnet。在前四名之后出现断崖:每次运行成本低于 0.65 美元的模型没有一个得分超过 81%,而且它们在诊断环节全部失效。
Pulse 将由什么驱动?
Gemini 3.7 Flash 默认使用。 在判断相关的三项任务中,它得分 100%,而成本仅为最准确模型的一半。其唯一的弱点可以通过代码修复:在运行任何生成的 SQL 前,将 ->> 比较用括号括起来。
Claude Sonnet 5 作为后备 对于任何 SQL 密集型任务,因为它在所有地方都表现完美,并且
相比 GPT-5.5 更具成本优势。
没有更便宜的模型用于诊断。 一个在面对 47% 下降时耸耸肩的助手,成本高于其所能节省的。
基准测试也支持 InsightTrack 已经采用的这一设计选择。在产品中,Pulse'sexplain_traffic_change 工具在代码中计算显著性和原因,而模型仅用纯英文解释结果。这些结果说明了原因:如果让模型独自完成这种推理,每个更便宜的模型至少有一半时间会出错。
如果你正在构建 AI 助手,这意味着什么?
这些经验适用于任何处理数字的助手:
- 计算而非询问。 任何涉及阈值(显著性,“这是趋势吗?”)的任务都应放在代码中。让模型解释结果,而非自行决定。
- 将“无变化”和“我不知道”设为有效答案,并进行测试。 如果你的测试仅包含有原因的案例,你将永远看不到耸肩者或报警者,除非用户亲自遇到。
- 在答案为“为什么”时使用推理。 这是结果中最大的单一因素:同一模型在 100% 与 35% 之间的差距。
- 将生成的 SQL 与你的实际数据库方言进行对比。 这里的大多数失败源于 PostgreSQL 的使用习惯,而非逻辑错误,少量重写或检查即可捕获。
- 不要解析模型说的第一句话。 请求一个干净的最终答案,或读取 最后 一句话,因为模型会自行纠正。
- 按任务路由。 工具选择成本低且易于正确,因此小模型可以胜任。诊断则不然。
我想要测量的下一步是什么?
- 一致性: 对每个模型运行三次,统计同一案例翻转的频率。
- 固定抖动规则: 重新运行每个模型,观察 GPT-5.5 是否达到 100%,以及其他模型的得分是否发生变化。
- 真实工具调用: 多轮运行中,模型实际调用 InsightTrack 的工具,而不仅仅是提及它会调用的工具。
坦白说,局限
- "正确" 意味着符合 InsightTrack 的规则。 所有规则和阈值都写入了提示,因而这考察的是仔细应用,而不是猜测某种隐藏的惯例。
- 合成数据,每模型一次运行,全部通过 Kaggle 模型代理。
- SQL 的评分严格以第一个查询为准。 如上所述,这会产生 Haiku 费用。
-
诊断提示中的一条规则存在歧义(抖动规则 vs.
page_one_exit)。这解释了 GPT-5.5 的全部四次失误。下个版本计划对其措辞进行修正。
我的基准
Kaggle 基准: https://www.kaggle.com/benchmarks/nishikantaray/insighttrack-analyst-bench
数据集(案例、示例表格、评分器): https://www.kaggle.com/datasets/nishikantaray/insighttrack-analyst-bench
它所基于的产品: https://github.com/NishikantaRay/InsightTrack
您如何使用它
- 测试另一个模型: 四个任务在 Kaggle 上公开可用,任何人都可以在 Kaggle 目录中的任何模型上运行它们,并与上面的表格比较。
- 为自己的产品重用此方法: 取您代码已经强制执行的一条规则,将其转换为由您代码提供答案的生成测试用例,包含正确答案为“无”的情况,并标记错误的 类型 以及得分。
基于 Kaggle Benchmarks 构建。任务模式参考其
其 dataset_evaluation.py 示例。它的覆盖范围接近 BFCL 和 τ-bench(工具调用),
InfiAgent-DABench 和 DSBench(数据分析),以及 Spider 2.0 和 BIRD(文本到 SQL)。它的区别在于:
对某个真实产品的工作进行端到端测试,以及评估模型是否能够识别出 什么都没发生 的情况。

