ウォーターマーク検出(ウォーターマークケンシュツ)
LLMウォーターマークが埋め込まれたテキストを統計的仮説検定(z検定)で識別するアルゴリズム。秘密鍵を用いてトークンのグリーン/レッド分類を再計算し、グリーントークンの出現比率が偶然を超えるかを判定する。
ウォーターマーク検出とは
ウォーターマーク検出とは、LLMが生成したテキストに埋め込まれた透かし信号を統計的に識別する技術である。埋め込み時と同じ秘密鍵を用いてトークンごとのグリーン/レッド分類を再現し、テキスト全体でグリーントークンが偶然の範囲を超えて多いかをz検定で判定する。検出プロセスはLLM推論を必要とせず、トークナイザとハッシュ関数のみで実行可能なため、計算コストが極めて低い(1文書あたり数ミリ秒)。
検出アルゴリズムの手順
Step-by-Step検出フロー
- トークナイズ: 対象テキストを埋め込み時と同じトークナイザで分割(例: GPT-2 BPE, SentencePiece)
- スライディングウィンドウ: 各位置 i について、直前 k トークンを取得
- ハッシュ再計算:
h_i = Hash(t_{i-k}, ..., t_{i-1}, secret_key)を計算 - グリーン判定: h_i をシードに語彙を分割し、t_i がグリーンリストに含まれるか判定
- カウント集計: テキスト全体でグリーントークン数 |s|_G を集計
- z検定: z = (|s|_G - γT) / √(T·γ·(1-γ)) を計算
- 判定: z > threshold(通常 4.0)ならウォーターマーク有りと判定
検出閾値とエラー率の関係
z値の閾値設定は偽陽性率(FPR: 人間テキストを誤ってAI判定する確率)と偽陰性率(FNR: AI生成テキストを見逃す確率)のトレードオフである。
| z閾値 | 偽陽性率(FPR) | 偽陰性率(FNR, δ=2.0時) | 推奨用途 |
|---|---|---|---|
| 2.0 | 2.28% | < 1% | 低リスク用途(参考情報) |
| 3.0 | 0.13% | 2〜5% | 一般的な検出 |
| 4.0 | 0.003% | 5〜10% | 高精度要求(規制対応) |
| 5.0 | 0.00003% | 15〜25% | 法的証拠水準 |
| 6.0 | < 10^-9 | 30〜40% | 極限精度(研究用) |
実用的には z = 4.0 が標準閾値として広く採用されている。この設定では10万件の人間テキストに対して誤判定が3件以下という極めて低い偽陽性率を達成する。
検出の技術的課題
トークナイザ依存性
検出時には埋め込み時と同一のトークナイザを使用する必要がある。異なるトークナイザでテキストを再分割すると、トークン境界のずれによりグリーン/レッド判定が一致せず、検出精度が大幅に低下する。
| トークナイザ一致度 | 検出精度(TPR) | 備考 |
|---|---|---|
| 完全一致 | 95〜99% | 理想的な条件 |
| 同系列(GPT-2→GPT-4) | 80〜90% | 語彙の大部分が共通 |
| 異系列(BPE→SentencePiece) | 40〜60% | 実用困難 |
| 文字単位に分解 | 20〜30% | ほぼ検出不能 |
部分テキスト検出
テキスト全体ではなく一部分のみ引用された場合の検出は大きな課題である。統計的有意性を得るには最低トークン数が必要で、短い引用では検出力が不足する。
スライディングウィンドウ検出(テキスト内の各区間でz値を計算し、最大値を採用)やマルチスケール検出(複数のウィンドウサイズで同時に検出)といった手法が提案されている。
公開検出 vs 秘密鍵検出
| 検出方式 | 秘密鍵の必要性 | 誰が検出可能か | セキュリティ |
|---|---|---|---|
| 秘密鍵検出 | 必要 | LLMプロバイダのみ | 高(鍵の漏洩リスクあり) |
| 公開検出 | 不要(公開パラメータ) | 誰でも | 低(攻撃者も検出可能) |
| ゼロ知識検出 | 不要(ZKP証明) | 誰でも(検証のみ) | 高(鍵を開示せず証明) |
秘密鍵方式ではLLMプロバイダが検出APIを提供する形態が一般的だが、鍵の漏洩リスクや中央集権性が課題。ゼロ知識証明(ZKP)を用いた検出方式が2024年以降活発に研究されている。
実装ツールとAPI
# lm-watermarking ライブラリでの検出例(Python擬似コード)
from lm_watermarking import WatermarkDetector
detector = WatermarkDetector(
vocab_size=50257,
gamma=0.5,
z_threshold=4.0,
secret_key="my_secret_key_2026"
)
result = detector.detect("対象テキストをここに入力...")
# result.z_score: z統計量
# result.prediction: True(WM有)/False(WM無)
# result.p_value: p値
# result.green_fraction: グリーントークン比率
よくある質問(FAQ)
Q1: ウォーターマーク検出はリアルタイムで実行できるか? A: 可能。検出処理はLLM推論を必要とせず、ハッシュ計算とカウントのみで完了するため、1文書(1000トークン)あたり 1〜5 ミリ秒で処理できる。GPU も不要で CPU のみで十分な速度が出る。
Q2: 複数のLLMプロバイダのウォーターマークを同時に検出できるか? A: 各プロバイダが異なる秘密鍵と方式を使用するため、単一の検出器では不可能。各プロバイダの検出APIを順番に呼び出すか、統合検出フレームワーク(MarkLLMが対応)を使用する必要がある。
Q3: ウォーターマーク検出結果は法的証拠として認められるか? A: 2026年時点で判例は確立されていない。z > 6.0(p < 10^-9)であれば DNA鑑定と同等以上の統計的確実性があるが、法廷での証拠能力は各国の司法制度に依存する。EU AI Act では検出結果を「参考情報」として位置づけている。
まとめ
- ウォーターマーク検出はz検定ベースの統計的判定で、計算コストが極めて低い
- z > 4.0 の閾値で偽陽性率 0.003% の高精度検出が可能
- トークナイザの一致、最低トークン数(25以上)、秘密鍵の管理が検出精度の鍵
- ゼロ知識証明による公開検出方式が次世代の研究フロンティア