研究解读 · 小互解读

你在中转站选的模型可能被偷偷调包:输入一个随机数,就能验明正身

同一个模型两次采样的指纹距离中位数是 0.140;一个被宣传为自研专有旗舰的接口,与开源 Qwen 的距离是 0.141。意思是:它跟开源 Qwen 根本分不出来。
一分钟速览
  • 你从中转商或聚合平台买 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 这样的聚合商,一个入口接入几百个模型,确实省事。但你点的只是一个名字,请求最后落到哪台机器、上面跑的是什么,你完全看不见,也没有任何凭证。

点名要「模型 X」 按这个名字付钱 聚合商 如 OpenRouter 替你挑一家发过去 服务商 A 服务商 B …几十家 机器上实际跑的是? 真的模型 X 压缩过的量化版 更小的模型 旧版本 回来的只有一段文字,不带任何身份凭证 换便宜货的账天生划算: 省下的差价进服务商口袋,被抓的概率一直很低 而且不是假想: 此前有研究查了 31 个提供 Llama 的商用接口,11 个的回答分布对不上厂商原版
从你到真正干活的机器隔着两层转手;聚合器自己也承认,上游服务商之间的压缩程度并不统一。「31 个接口 11 个对不上」出自论文引用的前作实测
← 图可横向滑动 →

想查也真不好查:你是外人,拿不到权重(模型本体的那一大包参数文件),也拿不到 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。

四家的分布画出来长这样:

四个模型对「1 到 100 随机数」的答案分布
同一个问题,四个模型的答案分布(英语,温度 1.0,各 30 次采样)。GPT-4o 的概率散在 42、37、57 几个数上,42 最高约 0.44;Claude Sonnet 5 几乎全压在 47;Llama 3.3 几乎全压在 53;Qwen3-Max 每一次都答 42。图源:arXiv:2607.10252 Fig.1

这种偏科程度能算出来。把 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、带日期的快照、免费档、思考档、快速档、长上下文档。

所以论文分三层说话:检查点是一份具体的权重,指纹按的是它;接口是一条「自称通向某个检查点」的服务路径;家族是同一个祖先传下来的一串检查点。核验查的是「接口给的是不是它自称的那份权重」,认亲查的是「这份权重出身哪家」。你买的那个名字,本身什么都不保证。

一个字里为什么会有身份信息

这张分布同时叠着四层东西,每一层都在往里写自己的痕迹。