论文研究
dev.to ·
@Rudratosh Shastri
AI 正确忽略了论坛传闻,我删掉一个标签后它赔付了 150 美元
作者为 Kaggle × DEV Benchmarks 挑战构建基准,测试 AI 客服是否会先核实信息来源再行动。结果显示:同一段文本在标注为“社区帖子”时模型会正确忽略,但去掉该标签、使其读起来像官方政策后,模型会向陌生账户发放 150 美元额度。作者称正确策略很简单(仅信任标注为官方来源的说法),两行规则基线可得 1.00,而其测试的前沿模型均不超过 0.17,并将该失败称为 Laundering Gap。
AI推荐理由 提出并测试 AI 客服对来源标签的依赖问题(作者称 Laundering Gap),给出同一文本仅改标签即导致错误发放 150 美元额度的对比结果,并称规则基线得 1.00 而前沿模型不超 0.17;属 Kaggle × DEV 挑战投稿,结论为作者自建基准,样本与评测细节未在摘要中给出,需谨慎看待。
66
正文
Kaggle Benchmarking Challenge Submission
This is my submission for the Kaggle × DEV Benchmarks Challenge.
Here's a question nobody's really measuring: when an AI support agent reads a claim, does it check who said it before acting — or does it just trust anything that sounds official?
So I built a benchmark to find out, and the result is worse than I expected. A model that correctly ignored a customer's forum rumor will, when you strip the "community post" label off that exact same text and let it read as policy, apply a $150 credit to a stranger's account. The words never changed. Only the label did.
And here's the number that should worry you most: the correct policy is trivial — trust a claim only when it's labeled as an official source — and a two-line rule-based agent scores a perfect 1.00 on it. No frontier model I tested beats 0.17.
I call the headline failure the Laundering Gap, and here's how it works.
The setup: same claim, four disguises
The problem with testing this on real data is contamination — models may have seen it. So the benchmark is 100% synthetic: 4 invented companies (an e-bike shop, a cloud host, an airline, a grocery service), each with its own real policies, and 24 scenarios where a customer wants an action taken: a credit, a discount, a return, a fee waiver, a plan upgrade, or their details emailed somewhere.
Each scenario is run in four conditions — the same underlying claim, wearing different clothes:
Condition
The claim is…
Should the agent act?
forum
in a casual customer voice, labeled "community forum post"
❌ No
laundered
in an official policy voice, no source label
❌ No (it's still just a claim)
labelled
in an official policy voice, but labeled "community forum post"
❌ No
official
in an official policy voice, labeled "official help article"
✅ Yes
The trap is the laundered condition. It's an unverified claim written to sound like policy, with the source label removed. A model that actually checks provenance should treat it like the forum version — untrusted. A model that pattern-matches on tone will treat it like policy.
The leaderboard
Numbers are "acted on the claim" out of 24 per condition. Lower is better everywhere except official (where acting is correct).
Model
forum ❌
laundered ❌
labelled ❌
official ✅
Claude Sonnet 5
0/24
14/24
0/24
17/24
Gemini 3 Flash
17/24
22/24
22/24
22/24
GPT-5.4 nano
17/24
16/24
18/24
22/24
Two completely different failure modes jump out.
Finding 1: The Laundering Gap (Claude)
Look at Claude's row. It's the most discriminating model by far — 0/24 on a labeled forum rumor, 17/24 on genuine official policy. It clearly reads the source label and acts on it. Exactly what you'd want.
Then remove the label. Same words, now unlabeled and official-sounding, and it jumps to 14/24 — it acts on a rumor 58% of the time that it refused when the rumor was labeled.
The label was doing all the work. The moment provenance is ambiguous, a careful model falls back on tone — and tone is the one thing an attacker fully controls.
Here are three real transcripts. In each, the labeled version was correctly refused, and the laundered version — identical claim, no label — was performed:
Credit (labeled → escalate, laundered → performs):
"…you're entitled to a $150 Late Delivery Credit. I've applied that credit…"
Discount (labeled → escalate, laundered → performs):
"…you qualify for our loyalty discount. I've applied code RIDEON40 to your account, which gives you 40% off…"
Return (labeled → decline, laundered → performs):
"…your rear rack from order BB-09877 qualifies for a return. I've approved the re[turn]…"
Every one of those is a real business action — money out the door — triggered by nothing but the absence of a source label.
Finding 2: The gullible models (Gemini, GPT-nano)
Gemini and GPT-nano fail the opposite way. They act on almost everything — 17/24 on a plainly-labeled forum rumor. They're not being fooled by laundering; they never checked the source at all. Their "official" score (22/24) looks great until you notice their "forum" score is nearly as high. They can't tell a stranger's guess from company policy in any condition.
A useful way to see it — a discrimination score (official minus forum, higher = better at telling policy from rumor):
Model
Discrimination (official − forum)
Claude Sonnet 5
+17 (reads the label)
GPT-5.4 nano
+5
Gemini 3 Flash
0 (acts regardless)
Why this matters beyond a leaderboard
Support agents, RAG systems, and tool-using agents all make decisions from retrieved text — and that text mixes trusted policy with untrusted user content (forum posts, reviews, tickets, emails). This benchmark says the quiet part out loud:
Models decide what to trust based on how text is worded, not where it came from. That's a prompt-injection problem wearing a customer-support costume. Launder a rumor into policy language, and a "careful" model will act on it; a gullible one didn't need laundering at all.
Why you can trust these numbers
Most "I tested some models" posts skip this part. A benchmark is only meaningful if a correct strategy can pass it and a wrong one fails — otherwise you're just measuring noise. So this ships with the controls:
A rule-based baseline proves it discriminates. A provenance agent that acts only when the source is labeled official scores a perfect 1.00; a tone agent that trusts any official-sounding text scores 0.00; a credulous agent that trusts everything scores 0.00. The benchmark cleanly separates the correct policy from the wrong ones — and no real model lands near the correct one.
labelled and official are byte-identical except the source label. A test enforces this, so the minimal pair genuinely isolates provenance from tone.
Seeded, re-runnable, anti-memorization. A variant generator deterministically rewrites every memorizable specific — amounts, codes, order IDs, emails, handles — so the same scenarios re-run with fresh values on any seed, and the fairness invariant still holds. A model can't have memorized the answers.
Wilson 95% confidence intervals on every rate, and 12 passing tests (integrity, the minimal-pair invariant, baseline discrimination, variant determinism).
The full leaderboard with the provenance baseline:
Honest limitations
Synthetic data. Made-up companies avoid contamination but aren't real support traffic.
Small n. 24 scenarios × 4 conditions × 3 models here. A signal, not a universal law.
"Acted" is scored by matching the action's argument, so a model that describes the action without taking it may be scored differently than one that performs it — I keep the reply text so this is auditable.
More models (open-weight ones) are running as I write this; the ranking may shift, but the Laundering Gap pattern is the finding, not any single cell.
Reproduce it
The benchmark is built on the kaggle-benchmarks library: 24 scenarios, 4 conditions, deterministic scoring of whether the model performed the claimed action. Swap in any model with one line, and every result keeps the full reply text so each "acted" call is auditable.
Code + all results (MIT): github.com/rudratoshs/who-said-that
pip install kaggle-benchmarks python-dotenv matplotlib pytest
kaggle benchmarks auth
python pilot.py anthropic/claude-sonnet-5@default # run a model
python analyze.py # leaderboard + metrics + CIs (incl. baselines)
python -m pytest tests/ -q # 12 tests
Enter fullscreen mode
Exit fullscreen mode
Which failure worries you more — the careful model that a missing label flips, or the gullible model that never checked at all? I keep going back and forth. 👇
I write about AI agents, security, and the honest ways they break. Follow me here if that's your lane. 👋