Seedance 2.5 is live — 30-second cinematic video with native audio & real-person references
言語モデルのAPIが本当のモデルを実行しているか検証する方法
2026/07/27

言語モデルのAPIが本当のモデルを実行しているか検証する方法

言語モデルは完全にランダムな数を選べません。この欠陥は安定した指紋となり、APIエンドポイントが宣言したモデルを実際に実行しているか検証できます。

言語モデルに1~100の間の乱数を選ぶよう何度も求めると、奇妙なことが起きます。答えはランダムではなくなるのです。あるモデルは42と73に着地し続けます。別のモデルは47と57を好みます。パターンは安定していて、再現可能で、すべてのモデルで異なっています。

2026年7月の論文がこの quirk を検証方法に変えました。One Token Is Enough: Fingerprinting and Verifying Large Language Models from Single-Token Output Distributions は、これらの答えの分布が信頼できる行動指紋を形成し、APIエンドポイントが宣言したモデルを提供しているかどうかを外部からチェックするのに十分であることを示しています[1]。重みやロジット、内部アクセスは不要です。数百の単語の答えだけで十分です。

このガイドは、API応答の model フィールドがなぜ主張であって保証ではないのか、単一トークン指紋認証がどのように機能するか、数字が何を意味するか、そしてメソッドの限界がどこにあるかを説明します。

TL;DR

  • API応答の model フィールドはプロトコルでは検証不可能です。 リクエストがフラッグシップモデルで提供されたことを証明するものはありません[1]
  • 言語モデルは均一な乱数を生成できません。 論文のプローブセット全体で、中央値の答え分布は均一な1~100の選択から得られる6.64ビットに対して約 1.0ビットのエントロピー を持ちます[1]
  • その失敗は一貫しているため、署名として機能します。同じモデル、同じスキュー、毎回。
  • スケールには使用可能な余裕があります:同じモデルをそれ自身と比較するとJSD 0.14に近く、同じモデルを2つのプロバイダー間でみると0.23近く、2つの異なるモデルでは0.46近いです[1]
  • 精度は強いが完全ではありません。 8プローブ単位での等誤率は10.6%、フルの40で7.3%、AUCは0.971です[1]
  • 不一致は証拠であり、証明ではありません。 量子化、サイレント版更新、隠しシステムプロンプトはすべて、誰も嘘をついていなくても分布をシフトさせることができます。

APIの背後にあるものは見えません

チャット補完エンドポイントを呼ぶとき、テキストを送信してテキストを返します。レスポンスの model フィールドはサーバーが置くことを選んだものを何でも言います。プロトコルでは、リクエストがそれに名前を付けられたモデルではなく、その10分の1の価格のものによって提供されたかどうかを証明するものはありません[1]

その間隙は、市場の大部分が仲介者の背後に座るようになるにつれてより重要になります。数百のモデルを1つのエンドポイント経由で再販する集約業者、公式価格以下でフラッグシップアクセスを提供する地域の再販業者、および量子化と提供スタックの選択肢を決して見ることのないオープン重量モデルを提供する第三者ホスト[1]

これらのビジネスのほとんどは合法的です。不正行為のインセンティブはまだ明白であり、17個のシャドウAPI事業者の別個の監査は検証に合格しなかったいくつかのエンドポイントを発見しました[2]

詐欺についてだけでもありません。プロバイダーは提供コストを削減するためにモデルを量子化し、サイレント版更新をロールアウトし、または混在したバックエンド全体のトラフィックをルーティングできます。製品の品質が特定のモデルに依存している場合、「実際に何を得ているのか?」は信頼ではなく証拠で答えられるべきです。

なぜ乱数がゲームを明かすのか

メソッドはよく文書化された弱点に基づいています。言語モデルは計算ではなく予測を行うため、乱数を求められたとき、訓練データと好み調整の偏りを再現します[1]

言語モデルに1~100の間の乱数を求められたときのスキューされた答え分布を示す図。42、7、73などの文化的に重みづけされた値に重い集中と平坦な均一参照。

3つのクラスターが支配します:

  • 42 は大規模に過剰に表現されています。銀河系ヒッチハイク・ガイドの答えが数十年のインターネットテキストを通じて響いています。
  • 7 は幸運な選択として人間が手を伸ばす数字として、数世紀の文化的重みを持ちます。
  • 37、47、73 およびその他の2桁の素数は人間には ランダムに見えるため、モデルが学習した人間生成の「ランダムな」例の中で支配します。

論文は崩壊を数値化します。中央値の答え分布はおよそ 1.0ビットのエントロピー を持ち、1~100からの公正な選択は 6.64ビット を持つでしょう[1]。公正なサイコロが百個の面を持つ場合、ほとんどのモデルはわずかに重く付けされたコインのように動作します。

重要なのは失敗が 一貫している ということです。同じモデルは毎回同じスキュー分布を生成し、兄弟バージョンを含む異なるモデルは測定可能に異なるものを生成します。バグが署名になります。

4ステップのプロトコル

1. プローブ。 エンドポイントに単語の質問のバッテリーを求めます:1~100の間の乱数を選んでください、ランダムな色に名前を付けてください、コインを反転させてください。論文は4言語にわたって10のタスクを使用して40プローブ単位を使用し、温度1.0で各30回をサンプリングし、max_tokens=16 と推論は無効です[1]

2. 指紋認証。 各プローブ単位について、答えを経験分布にまとめます。これらの分布の集合がエンドポイントの行動指紋です。

3. 比較。 その指紋と宣言されたモデルの信頼できる参照間の距離をJensen-Shannon発散で測定します。基数2で、スケールは0(同じ)から1(分離)まで実行されます。

4. 決定。 小さい距離は主張と一致することを意味します。大きい距離はエンドポイントが動作上別の動物であることを意味します。

この2つの特性は騙すのを難しくします。特別なアクセスは必要ありません。チャット補完に答えることができるものは何でも指紋がつけられるため、また魔法の文字列をフィルタリングするものはなく、すべてのプローブは言い換えプールから引き出された通常の無害な質問であるため、不正な中間ボックスは通常のトラフィックを破壊せずにテストを特別な場合にすることはできません[1]

距離の数字を読む

発散の値は参照ポイントなしでは何の意味もなく、ここでメソッドは実用的になります。

Jensen-Shannon発散スケール。参照ベースラインを示しています:同じモデルをそれ自身と比較する場合は0.14、同じモデルを2つのプロバイダー間で提供する場合は0.23、2つの異なるモデルの場合は0.46。

比較典型的なJSD
同じモデル、それ自身と比較~0.14
同じモデル、2つの異なるプロバイダー間~0.23
2つの本当に異なるモデル~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)

これを正しく行うことに関する4つの実践的なノート。

サンプリング条件を固定に保つ。 温度1.0、小さい max_tokens、推論は無効。異なる設定で収集された指紋は論文のそれと比較できません。

1つ以上のプローブを使用してください。 単一の質問はノイズです。エラー率はおおよそ8プローブ単位から40へ進むことで半減します。

同じ方法で収集された参照と比較してください。 最もクリーンな参照は、数か月前に収集された公開テーブルではなく、同じセッションで同一の設定の下で指紋認証された同じモデルの公式エンドポイントです。

補助信号も見てください。 その独自の分割ハーフと意見の相違がある指紋は多バックエンド ルーティングを示唆しています。数百の完了トークンを請求する単語の答えは埋め込みを示唆しています。膨張したプロンプトトークンカウントは大きな隠しシステムプロンプトを示唆しています。

8プローブ単位の25サンプルの標準チェックは約200の小さなリクエストで、小さなモデルでセント未満の費用がかかります。

結果が何を意味し、何を意味しないか

このメソッドがサポートしている主張について正確にしてください。

不一致は証拠であり、証明ではありません。 メソッドには固有のエラー率があります。8プローブ単位で約10.6%EER。積極的な量子化、サイレント モデル更新、古い参照、または提供側システムプロンプトはすべて意図なしで分布をシフトさせることができます。赤い結果を以前のプローブで再実行し、第二の参照をテストし、質問をする理由として扱ってください[1]

一致は強いが絶対ではありません。 洗練されたインポスターは原則的に別のモデルの分布をミミックできます。ただし、通常のトラフィックを正しく提供しながら、数十の言い換えられた多言語プローブ全体でそうしている場合は、思われるよりも難しいのです。

推論モデルにはケアが必要です。 指紋は推論を無効にして収集されます。エンドポイントがそれを無効にできない場合、信頼は下がります。

距離はビジネスの評決ではなく、時間のエンドポイントの特性です。

FAQ

LLM指紋認証とは何ですか?

単語の質問のバッテリーに対するモデルの答えの分布を測定し、その分布をエンドポイントが提供することを主張するモデルの参照と比較[1]

言語モデルが乱数を生成できないのはなぜですか?

それらは計算ではなく予測を行うため、ランダムのリクエストは訓練データと好み調整の偏りを返します。文化的に重みづけされた42と7のような値は、均一な理想的な6.64に対して約1.0ビットのエントロピーに分布を崩します[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]

モデルフィールドを請求として扱う

ここでの有用なシフトは小さく、特定です。API応答の model フィールドは請求であり、言語モデルが命がけで乱数を言うことができないという事実以上にエキゾチックなものの上に構築された、安くて、オープンで、統計的に根拠のある方法がこれで初めて外部からその請求をチェックすることができます。

任意の仲介業者を通じて容量を購入する場合、これが属する適切な場所は稼働時間監視の横にあります。あなた自身が収集した参照に対する定期的なチェック。補助信号はヘッドライン距離と共に見守られています。そして赤い結果を読む正しい方法は一つの会話の終わりではなく始まりとしてです。LLM APIを検証することは時間の経過で終点についての証拠を収集することです。それは厳密に代替案が仮定することであるため、価値があります。

リファレンス

  1. 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
  2. CISPA researchers. Real Money, Fake Models — an audit of shadow LLM API operators. arXiv. arxiv.org/abs/2603.01919
  3. LLM fingerprint dataset (models × tasks × languages). Zenodo, CC-BY-4.0. zenodo.org
  4. Reproduction code for One Token Is Enough. Zenodo, MIT License. zenodo.org

さらに読むために