
验证 LLM API 提供的真实模型:指纹识别指南
大语言模型无法均匀随机地生成数字,这个缺陷构成了稳定的行为指纹。你可以用这个指纹来验证 API 端点是否真的提供它声称的模型。
要求一个大语言模型从 1 到 100 中选出一个随机数,做够多次后会发生一件奇怪的事:答案根本不随机。一个模型总是倾向于选择 42 和 73。另一个偏好 47 和 57。这个模式稳定、可重现,而且每个模型都不同。
2026 年 7 月的一篇论文把这个怪癖变成了验证方法。《One Token Is Enough: Fingerprinting and Verifying Large Language Models from Single-Token Output Distributions》证明了这些答案分布形成一个可靠的行为指纹,足以从外部检查 API 端点是否提供它声称的那个模型[1]。不需要权重,不需要 logits,不需要内部访问权限。只需要几百个单词答案。
本指南解释了为什么 model 字段是一个声明而非保证、单令牌指纹识别的工作原理、数字意味着什么,以及这个方法的边界在哪。
快速总结
- API 响应中的
model字段在协议层面上无法验证。 没有任何东西能证明你对旗舰模型的请求真的被它处理[1]。 - 大语言模型无法产生均匀的随机性。 根据论文的探测集,中位数答案分布只携带大约 1.0 比特的熵,而从 1 到 100 均匀随机选择应该有 6.64 比特[1]。
- 这个失败是一致的,所以它用作签名。同一模型,同样的偏斜,每次都一样。
- 尺度有明显的日光差距:同一模型对比自己的 JSD 接近 0.14,跨两家提供商接近 0.23,两个真正不同的模型接近 0.46[1]。
- 准确度很强,但非完美。 等错误率在 8 个探测单元时为 10.6%,在完整 40 个时为 7.3%,AUC 为 0.971[1]。
- 不匹配是证据,不是证明。 量化、无声版本更新或隐藏系统提示都可以改变分布,不涉及欺骗。
你看不见 API 后面是什么
当你调用聊天完成端点时,你发送文本并得到文本。响应中的 model 字段说的是服务器选择放在那里的任何内容。协议中没有任何东西能证明请求由其命名的模型处理,而非由价格便宜十倍的东西处理[1]。
这个差距变得更重要,因为市场上越来越多的部分坐在中介后面:聚合商通过一个端点转售数百个模型、地区经销商以低于官方定价的价格提供旗舰访问权、以及第三方主机使用你永远看不到的量化和服务堆栈来运行开源权重模型[1]。
大多数这些业务都是合法的。欺骗的动机仍然很明显,一份针对 17 个影子 API 运营商的独立审计发现有几个端点没有通过针对所宣传模型的验证[2]。
这也不仅仅是关于欺诈。提供商可以量化一个模型来削减服务成本、推出无声版本更新或跨混合后端路由流量。如果你的产品质量取决于特定模型,"我实际获得的是什么?"应该可以通过证据而非信任来回答。
为什么随机数会泄露秘密
这个方法基于一个文献充分的弱点。大语言模型不计算,它们预测,所以当被要求一个随机数时,它们重现的是训练数据和偏好调优的偏见[1]。

三个集群占主导:
- 42 被大量过度代表,《银河系漫游指南》的答案在数十年的互联网文本中回响。
- 7 作为人类会伸手去的幸运选择,承载着几个世纪的文化分量。
- 37, 47, 73 和其他两位数素数感觉对人类来说是随机的,所以它们主导了模型学习的人类生成的"随机"例子。
论文量化了崩溃:中位数答案分布大约携带 1.0 比特的熵,而从 1 到 100 公平选择会携带 6.64 比特[1]。一个百面骰子变成了略微加权的硬币。
关键的动作是失败是一致的。同一模型每次都产生同样的偏斜分布,不同的模型,包括同一系列中的兄弟版本,产生可衡量的不同分布。一个错误变成了一个签名。
协议,四个步骤
1. 探测。 用一系列单词问题询问端点:从 1 到 100 中选择一个随机数,名字一个随机颜色,抛一枚硬币。论文在 4 种语言中使用 10 个任务来完成 40 个探测单元,每个以温度 1.0 采样 30 次,带 max_tokens=16 且推理禁用[1]。
2. 指纹。 对于每个探测单元,将答案统计成经验分布。这些分布的集合是端点的行为指纹。
3. 比较。 使用以 2 为基数的詹森-香农散度衡量该指纹与声称模型的可信参考之间的距离,所以尺度从 0(相同)到 1(不相交)。
4. 决定。 小距离意味着与声明一致。大距离意味着端点在行为上是一个不同的生物。
两个属性使这很难欺骗。它不需要特殊访问权限,因为任何回答聊天完成都可以被指纹化。而且没有魔法字符串可过滤,因为每个探测都是从释义池中抽取的普通无害问题,所以不诚实的中间盒无法特殊情况该测试而不破坏正常流量[1]。
解读距离数字
散度值没有参考点是没有意义的,这是这个方法变得实用的地方。

| 比较 | 典型 JSD |
|---|---|
| 相同模型对比自己 | ~0.14 |
| 相同模型,两个不同提供商 | ~0.23 |
| 两个真正不同的模型 | ~0.46 |
"相同"和"不同"之间有真实的日光差距[1]。注意中间行暗示的:即使一个不同主机诚实部署相同模型,也会可衡量地漂移,因为量化、服务堆栈和隐藏系统提示都留下痕迹。
准确度随探测计数扩展。在 8 个探测单元时等错误率为 10.6%;在完整 40 个时下降到 7.3%,AUC 为 0.971[1]。
论文在野外发现了什么
palmyra-x5 案例。 论文最引人注目的结果涉及一个作为专有旗舰产品提供的模型,其指纹与开源权重 235B 模型的 JSD 为 0.141,与你比较模型对比自己得到的 ~0.140 在统计上无法区分。在行为上,论文得出结论,端点提供的东西在功能上与开源模型相同[1]。
相同模型,不同提供商,有时可疑地不同。 34 对跨不同提供商提供的相同模型中,10 对超越了骗子分布的第 5 百分位[1]。一些官方模型第三方部署漂移足以看起来像不同的模型。即使没有人谎报名字,验证也不是偏执狂。
研究工件是开放的:指纹数据集在 Zenodo 下以 CC-BY-4.0 发布,重现代码在 MIT 下[3][4]。
自己运行检查
协议足够简单,可以直接实现。它的形状:
import collections, math
from openai import OpenAI
client = OpenAI(api_key="...", base_url="https://your-endpoint/v1")
def probe(model, prompt, n=25):
counts = collections.Counter()
for _ in range(n):
r = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=1.0,
max_tokens=16,
)
counts[r.choices[0].message.content.strip()] += 1
total = sum(counts.values())
return {k: v / total for k, v in counts.items()}
def jsd(p, q):
keys = set(p) | set(q)
m = {k: 0.5 * (p.get(k, 0) + q.get(k, 0)) for k in keys}
def kl(a):
return sum(a[k] * math.log2(a[k] / m[k]) for k in a if a[k] > 0)
return 0.5 * kl(p) + 0.5 * kl(q)关于正确做这件事的四个实际注意事项。
保持采样条件固定。 温度 1.0、小的 max_tokens、推理禁用。在不同设置下收集的指纹不可与论文收集的进行比较。
使用多个探测。 单个问题是嘈杂的。从 8 个探测单元到 40 个的错误率大约翻倍。
对比从相同方式收集的参考。 最干净的参考是同一模型的官方端点,在同一会话中用相同设置指纹化,而非数月前收集的已发布表格。
也看辅助信号。 与自身分裂半部分不一致的指纹建议多后端路由。计费数百完成令牌的单词答案建议填充。膨胀的提示令牌计数建议一个大型隐藏系统提示。
8 个探测单元 25 个样本的标准检查大约是 200 个微小请求,在小模型上花费几分之一美分。
结果意味着什么和不意味着什么
对这个方法支持的声明要精确。
不匹配是证据,不是证明。 该方法有一个固有的错误率,在 8 个探测单元时大约 10.6% EER。激进的量化、无声模型更新、过时参考或服务端系统提示都可以改变分布而没有欺骗意图。将红色结果视为用更多探测重新运行、测试第二参考并提出问题的理由[1]。
匹配很强但不是绝对的。 原则上一个复杂的骗子可以模仿另一个模型的分布,尽管在数十个释义多语言探测中这样做同时正确提供正常流量比听起来更难。
推理模型需要小心。 指纹在禁用推理的情况下收集。端点无法禁用它的地方,信心下降。
距离是端点在某个时间点的一个属性,不是对业务的判决。
常见问题
LLM 指纹识别是什么?
衡量模型对一系列单词问题的答案分布,然后对比该分布与端点声称的模型的参考[1]。
为什么大语言模型无法产生随机数?
它们预测而非计算,所以随机数的请求返回的是训练数据和偏好调优的偏见。文化符号值如 42 和 7 占主导,分布崩溃到大约 1.0 比特的熵,对比均匀理想的 6.64[1]。
多大的差异算不匹配?
使用论文的基线而非固定阈值:相同模型对比自己大约 0.14,跨提供商的相同模型大约 0.23,真正不同的模型大约 0.46[1]。
检查需要多少请求?
论文的完整协议是 40 个探测单元采样每个 30 次。更轻的 8 单元检查在 25 个样本处大约 200 个请求,并将等错误率从 7.3% 提高到 10.6%[1]。
提供商能检测并击败测试吗?
不容易。探测是从释义池中抽取的普通无害问题,所以特殊情况而不破坏正常流量很困难[1]。
失败检查意味着提供商在作弊吗?
不。量化、无声版本更新、隐藏系统提示和过时参考都在没有欺骗的情况下产生漂移。距离是一个统计观察,值得更仔细检查。
数据集可用吗?
是。指纹数据集在 Zenodo 下以 CC-BY-4.0 发布,重现代码在 MIT 下[3][4]。
将 model 字段视为声明
这里有用的转变是小且具体的。API 响应中的 model 字段是一个声明,现在有一个便宜、开放、统计依据充分的方式来从外部检查该声明,建立在不过是大语言模型无法救了自己的命来说一个随机数的事实之上。
如果你通过任何中介购买容量,这个的正确位置是在正常运行时间监控旁边:一个针对你自己收集的参考的定期检查,辅助信号随头部距离一起观看。而读取红色结果的正确方式是作为对话的开始,不是一个的结束。验证 LLM API 是收集关于端点在某个时间点的证据,正因为替代方案是假设,所以值得做。
参考文献
- Bruckner, Tomáš. One Token Is Enough: Fingerprinting and Verifying Large Language Models from Single-Token Output Distributions. arXiv, July 2026. arxiv.org/abs/2607.10252
- CISPA researchers. Real Money, Fake Models — an audit of shadow LLM API operators. arXiv. arxiv.org/abs/2603.01919
- LLM fingerprint dataset (models × tasks × languages). Zenodo, CC-BY-4.0. zenodo.org
- Reproduction code for One Token Is Enough. Zenodo, MIT License. zenodo.org
扩展阅读
- reAPI. How to use Claude Opus 5. reapi.ai/blog/how-to-use-claude-opus-5
- reAPI. How to use GPT-5.6. reapi.ai/blog/how-to-use-gpt-5-6
更多文章

MiniMax H3 对战 Seedance 2.5:哪个 AI 视频模型更强?
比较 MiniMax H3 与 Seedance 2.5 的时长、2K 输出、原生音频、多模态参考、视频编辑、价格、API 接入与适用场景。


真人 AI 视频生成器:哪些做法真的可行
用真人素材制作 AI 视频:如何准备合规参考图、挑选支持原生对白的模型,并逐项核对输入限制、审核结果与实际生成成本。


Venice.ai 替代方案 2026:5 个平替横向对比
2026 年在找 Venice.ai 替代方案?对比 OpenRouter、Together AI、DeepInfra、本地 Ollama 与 reAPI 的模型、隐私、价格和 API 设计。
