30 次都答 42:一个随机数验出你的 API 有没有被偷换模型

cover

哈喽,我是飞飞。

先说个有点荒诞的事。有人拿一个大模型做实验,反复问它同一句话:从 1 到 100,随便报一个数。问了 30 次。结果它 30 次全报了同一个数,42。

42 是什么?《银河系漫游指南》里那个梗,「生命、宇宙以及一切的终极答案」。你以为它在掷骰子,其实它在背课文。

前阵子我写过 Simon 那个套话检测器,那查的是 AI 写作的痕迹,内容层面的事。今天这篇不一样,查的是模型身份:你花钱调的那个 API,供应商到底给没给你上你以为的那个模型。这跟我最近老聊的模型选型也是两码事,那是挑哪个模型干活,这篇是下游一环,你挑定了,它到底给没给你上。这是供应链和账单层面的事,往下拆你会有点后背发凉。

30 次全答 42

这个实验来自布拉格经济大学一个叫 Tomáš Brückner 的研究者,7 月刚挂到 arXiv 上,论文名字很直白,叫《One Token Is Enough》,一个 token 就够了。

他干了件笨活。找来 165 个模型,每个都反复问「1 到 100 报个随机数」,一共发了大概 32.6 万次请求。全程花了多少钱?不到 35 美元。

结果每家模型的答案分布都长得不一样,而且各有各的偏执。Qwen3-Max 问 30 次全答 42。Claude Sonnet 5 死磕 47。GPT-4o 松一点,在 42、37、57 之间打转。Llama 3.3 偏爱 53。

你把这些分布画成图,就是一张张脸。同一个问题问一百来次,看它爱报哪几个数、各占多大比例,基本就能认出这是谁。Brückner 给它起了个名,行为指纹。

模型都爱偏心

这里有个怪事:随机数,怎么还会有偏好?

其实先别怪模型。人自己也报不出随机数。有个叫 Veritasium 的科普账号做过一次 20 万人的调查,让大家从 1 到 100 随便想一个「随机」的数,结果 37 被选得最多。人偏爱质数,偏爱以 7 结尾的数,本能地躲开整十和 11、22 这种叠字,觉得那样看着不够随机。

模型是拿海量人类文本喂出来的,人这套偏心它照单全收,还放得更狠。有人实测过,GPT-4o 在 1 到 10 里选随机数,问 100 次有 92 次报 7;单看那一步,选中 7 的概率高到 96.4%。

所以当你觉得它在随机的时候,它其实在复述人类语料里那点老套的偏好。

它在背课文

再往底下走一层,就明白指纹是怎么来的了。

大模型说话是一个 token 一个 token 往外蹦的,每一步都在算下一个最该出什么。碰到报个随机数这种开放问题,理论上 1 到 100 该均匀摊开,每个数概率差不多。可训练把这条曲线削尖了,几个高频答案吃掉了绝大部分概率,剩下的九十几个数几乎没份。

Brückner 量过这个尖锐程度。理想的均匀分布,信息熵应该有 6.6 bit;而这些模型实测下来,中位数只有 1.0 bit。这个数字翻成人话就是:它的随机里几乎没有随机,答案早被那几个高频选项锁死了。

至于它为什么偏偏死磕 47,一种解释是训练里的偏好被反复强化,把分布压成了尖峰。但这更多是合理推断,别当成铁律。真正确定的是那个结果:分布塌了,塌出来的形状每家不一样,于是成了指纹。

指纹能验身份

到这儿,事情就有意思了。

既然每个模型都有独一份的指纹,那我反过来问:我手上这个 API,报出来的分布跟它声称的模型对得上吗?对不上,只能说明一件事,供应商给我上的,压根是另一个模型。

这正是我看到这篇论文后背发凉的地方。我是重度的多模型用户,天天从聚合入口调各家模型,OpenRouter 就是我常走的一个口子。巧的是,Brückner 那 32.6 万次请求,跑的也是 OpenRouter。我最没底的一件事就是:这一层路由,到底把我的请求塞给了谁。

聚合入口这东西,方便是真方便,一个 key 打通十几家。可它也意味着,我根本看不见最上游那一跳。我下单要的是某个旗舰,中间过了几手转发,最后落到哪台机器、加载的是全精度还是压缩量化过的版本,我基本两眼一抹黑。

这担心并非空穴来风。Brückner 顺手验了 31 个声称在跑 Llama 的商业接口,有 11 个的分布跟官方权重对不上,也就是挂着 Llama 的牌子,跑的是别的东西。

更硬的证据来自 CISPA 的一篇审计论文,名字够直白,《Real Money, Fake Models》,真金白银,假模型。他们查那些影子接口,45.83% 没能通过身份验证,性能落差最高到 47.21%。近一半在造假,你付了旗舰的钱,拿到的可能是个缩水货。

动机一点都不难猜。你按旗舰价付费,它按小模型的成本给你跑,中间那道差价就是它的利润。我天天手动给不同的活派模型,脏活累活丢便宜的,关键判断才舍得上旗舰,对这本账太熟:便宜模型跟旗舰之间的成本差常常是好几倍,甚至十几倍。这么大一个价差摆在那儿,只要中间没人盯着,总有人会动心思,把你要的旗舰悄悄换成够用就行的小模型。

你自己也能验

好在这套方法的门槛,低到普通开发者也够得着。

你不需要模型方配合,也拿不到内部的概率数据,可黑盒外面就能干。挑一个你在用的模型,查一下它公开的指纹偏爱哪几个数,然后用一模一样的 prompt 问它个一百来次,把答案分布拉出来比一比。对得上就踏实,对不上就该警觉了。整个成本,也就是 Brückner 那种不到 35 美元的量级,缩到单个模型更是几杯咖啡的钱。

这法子谈不上百分百准,Brückner 报的错误率在 10.6% 上下,但作为一道随手能拉的自查警报,够用了。

其实我一直有个土办法,验账单。标价便宜从来不等于账单便宜。就说 Sonnet 5 换新 tokenizer 那回,名义单价看着是降了,我把最常跑的两三个 skill 各拉一批真实的活出来对,盯着月底实扣,才发现省下的那点又被 tokenizer 悄悄削回去大半。打那以后,谁挂出来的单价我都不信,只认自己跑出来的账。这回不过是把同一套本能,从验账单挪到验身份上:别信它自称是谁,让它自己报几十次数,露出马脚。

给你一个今天就能用的最小动作:下次你怀疑某个 API 被偷偷降智了,别光凭手感骂娘,用固定的 prompt 多问它几次那个它该偏爱的数,看分布还对不对。手感会骗人,分布不会。

说到底,这套指纹法真正的价值,不在它多精巧,在它把「你付的钱有没有买到你以为的那个模型」这件一直只能靠信任的事,头一回变成了你自己一百来次请求就能验的事。信任很贵,但现在你手里有了一把便宜的尺子。

你有没有怀疑过,自己充值买的 API 或者会员,某段时间被人偷偷换成了更便宜的模型?如果真要较个真,你会怎么验?评论区聊聊。