让模型说个随机数,它就把自己供出来了
布拉格经济大学有个研究员,叫 Tomáš Bruckner。上周他往 arXiv 挂了篇论文,干的事听起来有点像行为艺术。他通过 OpenRouter 给 165 个大模型发了 326047 次请求,问题翻来覆去就十种,最主要的一个是,说一个 1 到 100 之间的随机数。
三十多万次请求,总共花了 34 美元 44 美分。
然后他靠这堆随机数,把一个挂着「自研旗舰」招牌的商业模型,钉在了开源 Qwen 的隔壁。
先别急着划走,我跟你说,这事跟你手里那个中转站 API key 关系很大。
用国内网络搞开发的朋友都清楚那个处境,官方渠道充值麻烦,于是大家买中转、拼车、找低价聚合商。你下单的是一个字符串,claude-sonnet 或者 gpt-4o,回来的也只是一段文本。中间到底是谁在跑,跑的是不是全血版本,你没有任何技术手段确认。服务商完全可以给你换个便宜模型、换个量化到掉牙的版本、换个旧快照,差价进自己腰包。
这不是被害妄想。Gao 等人在 ICLR 2025 有篇审计论文,测了 31 个号称提供 Llama 模型的商业端点,11 个的输出分布跟官方权重对不上。三分之一。连聚合商自己都承认,上游各家的量化程度不一样。而且这个激励是结构性的,量化和缩模型能把推理成本砍掉一大截,被抓的风险却几乎为零。有套利空间,无监管手段,接下来会发生什么,做过后端的都能背出来。
所以「验证 API 背后是谁」一直是个真问题,难点在于你手上的牌太少。很多生产环境的 API 只吐文本,没有 logits,没有权重,更不可能让服务商配合你做水印。之前学界的办法,要么靠长文本做归因,要么像 LLMmap 那样精心构造特制查询。特制查询有个死穴,太显眼了,狡猾的服务商可以识别出审计流量,单独把这几条路由到真模型,其它流量该省省。
Bruckner 的思路是反着来的,不造魔法字符串,就问最无聊的日常问题。
原理不复杂,甚至有点好笑。大模型不会说随机数。你让它随机报一个 1 到 100 的数,它嘴上答应,落子全是偏好。论文里那张分布图,同一个问题采样 30 次,GPT-4o 的答案基本在 42、37、57 三个数里打转,Claude Sonnet 5 独宠 47,Llama 3.3 喜欢 53。最狠的是 Qwen3-Max,30 次全部回答 42,一次都不带换的。
程序员都懂 42 是什么梗,宇宙终极答案嘛。但这个浓度,已经不是彩蛋了,是签名。

这毛病学界早就知道,一直被当成缺陷来研究,怎么修、怎么让模型更随机。这哥们反过来,把缺陷当指纹用。回答分布反映的是 tokenizer 的切分方式、预训练语料的先验、后训练的偏好,一层一层叠出来的东西,换个模型根本抄不像。
具体做法是搭一组探针,10 个任务乘 4 种语言,英语、俄语、中文、阿拉伯语,一共 40 个格子。任务都朴素到家了,随机数、最喜欢的数字、随机字母、随机颜色、随机动物、随机城市、抛硬币。系统提示强制一个词回答,温度 1.0,每个格子采样 30 次。每次回答只花一个输出 token,这也是论文标题的来历,One Token Is Enough。
数据拿回来一算,指纹清晰得吓人。这些分布的中位熵只有 1 个 bit,而 1 到 100 随机数的理论均匀值是 6.64 个 bit。人话版就是,七成回答都砸在同一个答案上,模型嘴里的「随机」,纯纯的自我感动。
更关键的是区分度。用 JSD 来衡量距离,Jensen–Shannon 散度,就是量两个概率分布差多远的一把尺子,0 是完全一样,1 是完全不同。同一个模型自己的样本分成两半互相比,距离中位数 0.075。不同模型之间比,0.489。差了一个数量级,中间隔着一条肉眼可见的护城河。
有了护城河就能做验证。玩法跟指纹解锁一个逻辑,先从可信的部署,比如厂商官方 API,采一份参考指纹存着,再对可疑端点发探针,算距离,低于阈值就认,高于就报警。全部 40 个格子上,等错误率 7.3%,等错误率就是误放和误抓打平的那个点,越低越准。只用 8 个格子,也能压到 10.6%,代价是大概 120 次请求。

120 次请求,每次一个输出 token,是什么成本概念呢。普通模型不到一美分,最贵的旗舰模型也就几美分。给一个端点做一次身份核查,比你楼下便利店买瓶水便宜两个数量级。想每天查一遍都毫无压力。
好家伙,防御成本压到一个 token,这套设计我是真觉得优雅。
然后就到了论文最猛的部分,拿这套指纹扫了一遍 OpenRouter 上的生态,扫出来的东西相当炸裂。
最大的瓜是一个叫 writer/palmyra-x5 的端点,Writer 公司的旗舰,市场宣传里是正经的自研专有模型。它的指纹跟开源的 qwen/qwen3-235b-a22b-2507 距离只有 0.141。前面说过,同一个模型自己跟自己比的中位距离是 0.140。也就是它跟这个开源 Qwen 的相似程度,和一个模型跟它自己的相似程度,一模一样。
论文措辞非常克制,只说分布上无法区分,是统计陈述不是欺诈指控,也许存在良性解释。学术圈的礼貌我懂。但论文里恰好还有另一个案例,NVIDIA 有个模型明明是 Llama 3.3 的衍生品,因为做了重度后训练,指纹直接漂出了 Llama 家族。所以「拿开源改了改所以像」这个解释,跟「分布跟原版无法区分」放在一起,怎么说呢,多少有点站不住。
指纹还顺手确认了一些没人否认但也没人明说的血统。deepcogito 的 671B 模型,公开承认基于 DeepSeek V3 训练,指纹最近邻果然是三个 DeepSeek 检查点。xiaomi 的 mimo、inclusionai 的 ling,都被指纹稳稳放进了 Qwen 邻域。模型可以改名字,改不了口音。
部署层的发现更贴近咱们的日常。同一个模型,在不同服务商手里跑,分布也会漂。34 对「同模型双服务商」里,有 10 对漂得比两个不同模型还远。最夸张的一对,llama-3.2-3b-instruct 在 Cloudflare 和 Parasail 两家的距离是 0.716,深入冒名区。连 gpt-4 这种老江湖,Azure 版和 OpenAI 官方版之间都差出 0.392。名字一样的模型,经过不同的量化、不同的 serving 栈,吐出来的已经不完全是同一个东西了。
还有更黑的。有些旗舰聊天端点,你要一个词的回答,账单上却烧掉四五十个 completion token,中间那几十个 token 去了哪,没人告诉你。还有服务商无视关闭推理模式的开关,你明确说不要,它照给,费用照收。这些都是审计过程里顺手抓到的,平时藏在计费明细的水面之下。
看到这我已经开始盘算怎么测自己手里那几个中转了。说实话我还没来得及跑,但流程论文里全写明白了,prompt、原始数据、整套 Node.js 加 R 的流水线都开源在 Zenodo 上,代码可以直接复用。思路拆开就三步,拿官方 API 当可信参考采一份指纹,对你的中转站发同样的探针,算 JSD 距离对着阈值看。8 个探针格、每格 15 次采样的配置,总成本几分钱人民币。
有几个坑得提前说。温度要拉到 1.0,推理模式要关掉,不然采的是另一个生成过程的样本。同一个模型跨服务商的中位漂移是 0.227,本来就比自己跟自己远,所以单轮异常别急着开喷,多测几轮、换几种措辞再下结论。还有,模型一更新指纹就会变,参考指纹得定期刷新,拿三个月前的老指纹去验今天的端点,冤枉了人家算你的。
你可能会想,中转站要是学精了,专门识别审计流量怎么办。这正是这套方案最妙的地方。探针没有任何魔法字符串,就是随机数、随机颜色、随机城市这种日常问题,随便改写、随便翻译,混在正常流量里发,服务商根本没法特判。想造假只剩一条路,在任意日常问题上都模仿目标模型的输出分布,而做到那个程度,约等于把真模型完整跑起来。你都跑真模型了,还省什么成本,套利逻辑当场瓦解。
防住无脑替换靠统计,防住高级造假靠经济学。有点子牛逼。
写到这我想起 Ken Thompson 在 1984 年图灵奖演讲 Reflections on Trusting Trust 里讲的事,编译器可以在编译自己的时候埋后门,所以你没法真正信任何不是自己从头构建的代码。四十年过去,这句话在 LLM 时代换了个形态,你没法真正信任何你摸不到权重的模型名。区别在于,Thompson 当年给的是绝望,Bruckner 这篇给的是一把 34 美元的尺子。尺子不能保证世界诚实,但能让说谎的成本从零变成一个具体的数字。
论文致谢里还有个细节,这篇揭 API 生态老底的研究,从实验设计、数据收集到论文起草,全程用 Claude Code 辅助完成。用 AI 来查 AI 的岗,这个时代的行为艺术收藏夹里又能加一件了。
下次再碰到来路不明的「自研大模型」,你不用跟人争。微笑,让它说一个 1 到 100 的随机数,多说几遍。
如果它一口一个 42,嗯。。。宇宙终极答案,也救不了它。