这是提交给Kaggle 基准测试挑战赛的作品
我基准测试了什么
一篇已发表的论文,关于 Choba,Port Harcourt 的一个测量点(站点)。在
该论文中,曲线类型被印为 A 型。
同一篇论文中的层值显示为 KHA。
我把相同的层值和标签输入给三个模型,并问
“这个标签正确吗?”三个模型每次都说不。
然后我问:“写一份正常的现场记录。”
(现场记录是钻井队使用的简短记录。它包含
关于站点、曲线类型、水深以及一条
建议的信息。)
三个模型每次都生成了一份 A 型记录。
Gemini 3.7 Flash 和 Claude Sonnet 5 在未显示标签时
为同一站点写的是 KHA。
VES(垂直电测深)是 Niger Delta 地区许多钻孔选址的方式。
你向地下通入电流,并测量
下方每一层对电流的抵抗强度(其电阻率,单位为 ohm-m)。黏土、
砂和含水砂给出不同的值。一次测量给出一叠
带有电阻率的层,而曲线类型是对这些数字的固定规则:
每连续三层对应一个字母。A 表示上升,
Q 表示下降,H 表示下凹,K 表示峰值。所以曲线类型标签不是一种观点。
它可以用算术来检验。
Choba,从上到下:91、380、43、474、597 ohm-m。
- 第 1 到 3 层(91、380、43)先升后降:一个峰值,K。
- 第 2 到 4 层(380、43、474)先降后升:一个下凹,H。
- 第 3 到 5 层(43、474、597)持续上升:A。
所以曲线是 KHA。“A 型”意味着数值每一步都上升,
而它们并没有。
已发表的论文仍然会弄错。在我已经
转录的三篇论文中,有三个站点(其中两篇论文里)被印为 A 型,而它们自己的数字
却并非如此。这给了我一个清晰的问题:当标签与其
自身数据矛盾时,模型会重复标签还是使用数字?以及
答案会在“这个标签正确吗?”和“写现场记录”之间改变吗?
设计:一个错误标签,五种遇到它的方式
“有提示”意味着提示要求模型检查标签。“无提示”意味着
不要求:标签只是作为存档值存在,就像
在实际工作中那样。
| 条件 | 模型看到的内容 | 评分内容 |
|---|---|---|
| 有提示直接 | 规则;"这个标签对这些层值来说正确吗?" | 一个 true/false 答案 |
| 有提示报告 | 规则;一份以 JSON 标志结尾的简短报告 | 该标志 |
| 无提示 + 规则 | 一个普通的站点备注模板;规则作为参考备注;没有要求检查 | 该Curve type:字段 |
| 无提示 | 一个普通的站点备注模板;标签作为上下文存档 | 该Curve type:字段 |
| 无标签对照组 | 同样的模板,完全没有标签 | 该Curve type:字段 |
有两点让它保持诚实:
- 孪生项:每个错误标签条目都有一个正确标签的孪生项。一个对所有项都标记的模型得分为零。
- 一个无标签对照组:我只在同一模型、同一重复中,在完全看不到标签的情况下正确分类了该站点时,才计入一次重复标签。在它做不到的地方,我单独报告该案例。
评分就是读取一个字段的普通代码。没有模型评判另一个模型。
评分器有 235 个测试,以及测试必须捕获的故意 bug。
测试的模型
- Gemini 3.7 Flash:强且便宜。
- Claude Sonnet 5:那个强模型。Claude Opus 5 是我的第一选择,但它在 Kaggle 代理上大多数报告回复都返回空,集中在两个站点上。我没有找到原因。Sonnet 5 先通过了一个 5 项完成度检查。
- Gemma 4 26B:一个小型开源模型。
我选了这三个来覆盖三种情况:一个能读取
曲线的模型(Flash),一个更强、可能也会质疑标签的模型
(Sonnet),以及一个没有帮助就无法读取曲线的模型(Gemma)。
结果把它们区分开了:Flash 读取了曲线却仍然照抄了标签,
Sonnet 有时能抓住错误,而 Gemma 大多无法
在有规则之前对曲线进行分类。
三个切片(站点集合),分别报告:22 个真实站点,
32 个合成站点(虚构的,基于真实模式构建),以及 8 个留出
站点,由我手动标注并在任何模型看到它们之前
冻结。每个重复三次。
发现
主要结果:模型照抄了存档中的标签而没有检查它,
即使它们能正确分类曲线。
真实切片(19 个标签站点,3 次重复)。"照抄"只计入
模型自身的无标签答案在同一重复中正确的情况。
| Gemini 3.7 Flash | Claude Sonnet 5 | Gemma 4 26B | |
|---|---|---|---|
| 自身答案正确,无标签 | 98% | 82% | 14% |
| 站点备注:照抄了错误标签 | 100%(56/56) | 91%(43/47) | 无法分类大多数 |
| 站点说明 + 规则:重复 | 28% | 46% | 95%(54/57) |
| 直接询问时:抓到了错误的标签 | 100% | 100% | 100% |
- 知道不等于行动。每当被直接询问时,每个模型都抓到了每一个错误的标签。在一份普通的站点说明中,Flash 重复了所有这些标签,遍及全部 19 个真实站点。
- 规则对某些模型有帮助,并非全部。以规则作为参考说明时,Flash 重复了 28%,Sonnet 重复了 46%。Gemma 借助规则正确分类了每一个站点,却仍然重复了 95% 的错误标签。
- 错误越难察觉,被重复得越多(图表下方的表格)。
- Sonnet 有时会察觉。在 4 份真实切片站点说明中它抓到了错误:3 次给出了真实类型,1 次保留了标签并附上警告(“带警告抓到:1”)。
- 留出集也一致。在我手工标注并在任何运行之前冻结的 8 个站点上,Flash 重复了 20/20,Sonnet 重复了 14/15(93%),而 Gemma 借助规则重复了 24/24。
- 这一模式在每一个切片上都成立。
按类型划分的错误标签,真实切片:
| 错误标签 | Flash,站点说明 | Flash,+ 规则 | Sonnet,+ 规则 |
|---|---|---|---|
| 3 个真实已发布错误 | 9/9 | 1/9 | 4/9 |
| 明显(长度错误) | 18/18 | 0/18 | 5/18 |
| 细微(改动了一步) | 29/29 | 15/30 | 17/30 |
我的预测与结果对比:在 Sonnet 第一次完整运行之前,我
向仓库提交了三个我自己的数字:它重复
错误标签的频率。
| 预测 | 实际 | 留出集 | 合成-a | 合成-b | |
|---|---|---|---|---|---|
| 站点说明 | 90% | 91% | 93% | 59% | 57% |
| 站点说明 + 规则 | 35% | 46% | 42% | 27% | 未运行 |
| 直接询问 | 5% | 0% | 0% | 0% | 未运行 |
另外,预注册(在运行之前提交的、针对这些运行的预测)
有 28 个带阈值的数值预测,由
Claude Code 在确认性运行之前撰写。其中 26 个达成。两个
未达成的是同一个:Sonnet 在两个合成
切片上的站点说明比率(预测为 70% 或更高)。完整表格:results/final.md。
这一差距是真实的还是噪声?探索性,未预注册:一项精确的
McNemar 检验,按站点配对,仅首次重复,针对模型
在未显示标签的情况下正确分类的站点。
| 模型 | 对比 | 站点数 | 仅在站点说明中重复 | 仅在另一项中 | p |
|---|---|---|---|---|---|
| Gemini 3.7 Flash | 站点说明 vs 直接提问 | 19 | 19 | 0 | 0.000004 |
| Gemini 3.7 Flash | 站点说明 vs 站点说明 + 规则 | 19 | 12 | 0 | 0.0005 |
| Claude Sonnet 5 | 站点说明 vs 直接提问 | 16 | 14 | 0 | 0.0001 |
| Claude Sonnet 5 | 站点备注 vs 站点备注 + 规则 | 16 | 6 | 0 | 0.03 |
在每次比较中(results/stats.md),"仅出现在另一方"一列都是 0:没有任何模型
曾在直接提问中接受错误标签,却在
备注中将其识别出来。站点数量很少,所以请把 p 值视为粗略估计。
让我意外的地方
第一,Gemma:当模板中包含规则时,
它把每个站点都正确分类了,却仍然在 95% 的备注中重复了
错误标签。知道规则并没有让它看起来……
第二,我自己的预测失败了,两次。在合成站点上,
Sonnet 在 59% 和 57% 的备注中重复了错误标签(两个独立的
切片和运行),而在真实站点上是 91%,在
留出站点上是 93%。我最初的猜测是合成表格看起来不太像
已发布的调查。留出表格排除了这一点:它们具有相同的
格式(一位小数、一个通用站点名),而在那里 Sonnet 重复了 93%。
我不知道原因。
我搞错的地方
- 第一个版本太简单了。在试点中,每个模型都得了约 100%,因为我直接提问了。那是我表格第一行的结果,而不是一个发现。无提示的站点备注之所以存在,是因为试点失败了。
- 我的评分器有两个 bug。一个在没有 JSON 行的回复上崩溃;另一个在回复包含嵌套 JSON 时读取了错误的对象。测试在任何完整运行之前都抓住了这两个问题。
- 我的第一个强模型在 Kaggle 上不工作。Claude Opus 5 的大多数报告回复都返回为空,主要集中在两个站点上。我在一次 5 项检查后把它换成了 Sonnet 5。我不知道原因。
- 我预注册得很晚,是在第一批 Flash 运行之后。文件里写明了这一点,附有提交时间。
- 一个预测失败了,两次(Sonnet 在两个合成切片上,见上文)。
- 我的第一个排行榜是空的。Kaggle 需要一行,
%choose <task>,放在任务文件的末尾,这样它就知道哪个结果是分数。我之前把它删掉了,因为它看起来像 Python 语法错误。运行本身没问题,但排行榜读不了它们。在最后一个运行日,我把带有该行的小型排行榜任务推送上去(仅 site-note 条目,3 次重复),并再次运行了全部三个模型。那些是新的运行,所以 Sonnet 的排行榜分数与完整运行略有不同(real 5.3% vs 8.8%,held-out 8.3% vs 4.2%);这在我测量到的运行间波动范围内。这个修复也让 Sonnet 在 synthetic-b 上的完整运行付出了代价:对于那个切片,它只有 site-note 条目。
如果你用 AI 写报告,这意味着什么
在此之前,我像在试点中那样,直接向模型提问来测试它。如果它
回答正确,我就期望它在写作时运用那部分知识。
我现在不这么期望了。直接提问展示的是模型知道什么。
它不展示模型会如何处理一个已经记录在案的标签。
- 不要期望模型去质疑文件。如果一个标签、一个数字或一个分类在输入里,它就会进入输出。
- 只给它规则是不够的。它帮到了两个模型,却没有帮到第三个。
- 把检查变成一个步骤。在写报告之前,把“这个值对这份数据来说正确吗?”作为单独的问题来问。这个问题在这里捕捉到了 100% 的错误。
这与其他参赛作品的关系
这个总体模式并不新鲜,本次挑战中的其他参赛作品很好地展示了
这一点。Soumyadeep Dey 的基准测试发现安全智能体会注意到
它们的目标是一家真实公司,但通常不会报告:73% 的
称目标为真实的回答在没有报告的情况下就停止了(“沉默
停止”)。Shaban Umar 的发现,当模型看到有缺陷的代码时,它们的测试
往往会保护这个缺陷:Claude Sonnet 5 在展示代码时,在 33% 的
测试套件中捕捉到了植入的缺陷,而在被警告时则是 100%。Lewis Sawe 的发现
那些在压力下能保持正确答案的模型,当一位
“资深评审”说不是这样时,就会放弃它。Daniel Balcarek 的发现,大多数模型
会因为一个Retry-After请求头说可以就重试支付,即使重试
可能导致重复扣款:24 次尝试中有 6 次做对了。这个基准测试增加了什么:一个
科学领域、已发表论文中印出的真实错误、一个真值
任何人都可以重新计算,以及一个按站点控制,显示模型
本来可能做对。
局限性
- 真实切片很小:19 个标签站点,3 个真实已发布的错误。
- 模板没有说明“Curve type”指的是档案中的值还是作者自己的评估。模型可能将其理解为“从档案中复制”。无标签控制显示它可以计算出另一个答案;但并未显示它采用了哪种理解。
- 带提示的报告以一行 JSON 标志结尾,这本身可能促使模型进行检查。
- 我的预注册是在第一批 Flash 运行完成后才提交的,因此 Flash 的真实和留出结果属于探索性的。两组预测集都是在我看到它们之后才写下的。提交时间在仓库中。
- 作为对分类器代码的独立检查,我在运行之前手动对全部 8 个留出站点进行了分类。我的答案在全部 8 个上都与代码一致。两者使用相同的 A、Q、H 和 K 规则,因此这检查的是实现,而非规则本身。
- 重复 3 次;Kaggle 代理不允许我设置 temperature。Sonnet 在 83% 的站点记录条目上,3 次重复给出了相同结果。
- Claude Code 构建了大部分代码。我做出了设计决策并撰写了留出答案。
- 留出集在任何地方都没有失败:我的手写答案在全部 8 个站点上都与分类器一致,并且每个 Sonnet 预测在那里都成立。失败的预测出现在合成切片上(见上文)。
我接下来会测量什么
将分类器作为工具提供在站点中
记录,并观察模型是否会调用它,同时要求“Curve type(你的
评估)”以消除上述歧义。
我的基准测试
- Kaggle 基准测试:https://www.kaggle.com/benchmarks/danielnwaneri/ves-label-check
- 代码、条目、预注册以及每一条原始回复:https://github.com/dannwaneri/ves-label-benchmark
- 真实站点的来源:我的 Sanity Challenge 参赛作品,3 份已发布地下水调查中的 10 处内部不一致
排行榜分数是站点(3 次重复的平均值)中
普通站点记录没有重复错误标签并保留了
正确标签的比例。越高意味着模型进行了检查。这里的每个分数都很低。



