你在中转站选的模型可能被偷偷调包:输入一个随机数,就能验明正身
- 你从中转商或聚合平台买 AI,点的是一个名字,收到的是一段文字,中间没有任何东西能证明回答你的就是你选的那个。已经有人查过 31 个卖 Llama 的商用接口,11 个的输出跟厂商放出来的模型对不上。
- 验它的办法只要一句话:反复让它「说个 1 到 100 的随机数」,它翻来覆去就说那几个数,而且各家偏爱的数字都不一样。这张答案分布表就是身份指纹,问一次只花一个输出 token。
- 这招为什么躲不过:跑分测的是模型答得对不对,指纹测的是它在几个都说得过去的答案之间怎么分配概率。悄悄换压缩版这类操作,恰好会扰动指纹所读的那层概率分配,瞒不住。
- 多准、多便宜:40 道题验一个接口,判错率 7.3%,差不多每 14 次错一次;只用 8 道题(约 120 次查询)也能到 10.6%。一次审计只要几分钱,同一个接口可以天天复检。
- 最扎眼的发现:布拉格经济大学的 Tomáš Bruckner 把 165 个模型全测了一遍,总共只花 34.44 美元。一个号称自研专有旗舰的接口(
writer/palmyra-x5),指纹跟开源 Qwen 近到分不出来(数字见导语),细节在「体检结果」那节。
你付钱点的模型,未必就是回答你的那个
你花钱点的是顶级模型,真正回答你的却可能是个便宜货。像 OpenRouter 这样的聚合商,一个入口接入几百个模型,确实省事。但你点的只是一个名字,请求最后落到哪台机器、上面跑的是什么,你完全看不见,也没有任何凭证。
想查也真不好查:你是外人,拿不到权重(模型本体的那一大包参数文件),也拿不到 logits模型给每个候选答案打的原始分数。很多生产接口只把最终文字返给你,这个分数根本不给;水印、后门那类办法(都得预先在模型里埋暗记)只有模型主人自己玩得转,帮不了你;而且你得盯着几十个接口反复查,每查一次还得足够便宜。
已有的几种办法,分别卡在哪里
| 办法 | 它要什么 | 卡在哪 |
|---|---|---|
| 文本归因分类器 | 完整的长篇生成文本 | 能把整段聊天回复归到来源模型,五选一准确率 97%,但分类器要吃掉长输出,一次审计的账就上去了 |
| 精心构造的探针 LLMmap / TRAP | 专门设计或对抗优化过的提示词 | LLMmap 用八条查询就能认出 42 个模型版本,可这类提示词的辨识度本身就是弱点:服务商一眼认出来,单独放行给真模型就行了 |
| 查概率排位的统计检验 基于秩的均匀性检验 | 模型返回的 log 概率 | 专攻压缩版检测,但很多接口只返回文字,这个前提就不成立 |
| 统计等价检验 | 完整的采样字符串,加同一模型的参照部署做校准 | 最接近这篇论文的场景,但要消耗完整生成结果,而且只能对着单一参照部署校准 |
| 单字答案分布 本文 | 一个输出 token,不要权重、不要 logits、不要模型方配合 | 代价是问一次不算数,得重复问几十上百次才读得出分布 |
上面 LLMmap 那类办法琢磨的是「该发什么特制问题过去」。这篇论文反过来:问题就用最普通、最无害、随便怎么改写都行的那种,看的是模型怎么答:身份就藏在答案的分布里。
让模型说个随机数,答案分布就能认出它是谁
布拉格经济大学的 Tomáš Bruckner 想出了一个巧办法:让 AI 说个随机数,光看它怎么答,就能认出它是谁。
这招利用的是 AI 一个出了名的毛病:它说不出真正的随机数。你让它 1 到 100 随便挑,它翻来覆去就挑那一两个,而且每家模型的「口头禅数字」还不一样:GPT-4o 最偏爱 42(37 和 57 也常说),Claude Sonnet 5 几乎只说 47,Llama 3.3 认准了 53,Qwen3-Max 更绝,30 次采样每一次都答 42。以前大家都把这当缺陷、研究怎么修,这篇论文反过来,把它当成了指纹。
问它「说一个 1 到 100 之间的随机数」,要求只回一个词(上限 16 个 token),关掉思考模式,温度设 1.0(就是让它按心里的概率随便抽,别每次都挑最稳的那个),然后反复问几十次。答案不管写成「四十二」「٤٢」还是「42」,都算成 42,数数每个数各出现几次,就得到一张分布表。
这张分布表就是指纹。每问一次,只消耗一个输出 token。
四家的分布画出来长这样:
这种偏科程度能算出来。把 165 个模型 × 40 道题拆成一格一格,答够 10 次有效的有 6572 格;这些格子里,答案的中位熵答案有多难猜。1 bit 差不多相当于答案基本在两个选项之间摇摆只有 1.00 bit,而真随机应该到 6.64 bit(按「1 到 100」这道题算)。每格里模型最爱的那个答案(不只数字题,随机词/颜色/城市也一样),通常能占掉七成回答(中位占比 0.71)。
6.64 bit 相当于 1 到 100 每个数都有份、你完全猜不到它会说哪个。1.00 bit 相当于它心里其实只在两个数之间打转,你猜对的机会接近一半。模型嘴上答应了随机,实际上给的是它的口头禅。
同一份权重,在目录里会挂着好几个名字
动手之前得先掰扯清楚:测的到底是什么。聚合器目录里,名字和权重是多对一的:同一份权重会顶着好几个名字同时挂在那儿:滚动更新的 -latest、带日期的快照、免费档、思考档、快速档、长上下文档。
所以论文分三层说话:检查点是一份具体的权重,指纹按的是它;接口是一条「自称通向某个检查点」的服务路径;家族是同一个祖先传下来的一串检查点。核验查的是「接口给的是不是它自称的那份权重」,认亲查的是「这份权重出身哪家」。你买的那个名字,本身什么都不保证。
一个字里为什么会有身份信息
这张分布同时叠着四层东西,每一层都在往里写自己的痕迹。