はじめに: 「事実だけど嘘に見える」あらすじの罠
Netflixのように数千タイトル×シーズンごとのエピソード×多言語のシノプシスを人手でファクトチェックするのは現実的ではありません。そこで彼らはLLMベースのfactualityサービスを運用していますが、従来方式は推論モデルに100k+トークンのコンテキストを丸ごと投入し、5回繰り返し呼び出すホリスティック方式でした。
問題は2点です。
- コストの爆発 — 判定1件あたり5回の長文コンテキスト推論呼び出し。
- 根拠(rationale)の不一致 — モデルが的外れな理由でFAILを出したり(例: 「wonderful magic」という表現がないから失敗)、逆に微妙な誤りを「大した問題ではない」と見逃したり。
ここで重要なのはファクトチェックのスペクトラムです。Netflixは誤りを4段階に分類しています。
- A: 完全に事実(通過)
- B: 完全に虚偽(不合格)
- C: 全文は真だが誤解を招く(例: レディ・ウィッスルダウン中心の物語として記述)
- D: 文は真だがニュアンスがミスリード(例: 出会った瞬間から情熱的なロマンスとして記述)
CとDが本当に難しいケースです。単純な文字列マッチングやキーワード検査では絶対に捉えられません。本記事は、そのC/Dを捉えつつコストまで削減したアーキテクチャの解説です。

核心アイデア: ホリスティック → カスケード3段構成
Netflixが導入した改善点は大きく3つです。
1) Confidence Gating(信頼度ゲーティング)
モデルにverdictと一緒にconfidenceを出力させ、高信頼ケースは1回の呼び出しで完了させます。低信頼ケースのみ追加検証へescalate。空港の保安検査場の比喩がしっくりきます — 大半はそのまま通過、アラームが鳴ったバッグだけ精密検査。
2) Specialized Judges(専門化された審判2名)
同じプロンプトで5回回すのはサンプリングノイズを減らすだけで、体系的な推論エラーは捉えられません。 そこで役割を分離します。
- Literal Judge: 文が文字通り真か?
- Implicature Judge: 未視聴者に誤った像を与えるか?
# 2名の審判を並列呼び出しする擬似コード(実務適用例)
from dataclasses import dataclass
@dataclass
class Verdict:
label: str # "PASS" or "FAIL"
confidence: float # 0.0 ~ 1.0
rationale: str
concessions: list # モデル自身が認めた「曖昧な点」
async def cascade_check(synopsis: str, source_material: str) -> Verdict:
# Stage 1: 2名の審判を並列呼び出し
literal, implicature = await asyncio.gather(
literal_judge(synopsis, source_material),
implicature_judge(synopsis, source_material),
)
# Confidence Gating: 両方とも高信頼なら即終了
if literal.confidence > 0.8 and implicature.confidence > 0.8:
return merge_verdicts(literal, implicature)
# Stage 2: 低信頼 + concessionがあればルーターへ
concessions = literal.concessions + implicature.concessions
if concessions:
atomic_claims = await router.reframe(concessions)
for claim in atomic_claims:
# 外部事実ならweb judge、原文再確認ならsource recheck
result = await route_and_recheck(claim, source_material)
if result.contradicted:
return Verdict("FAIL", 0.9, result.reason, [])
return merge_verdicts(literal, implicature)
3) Router + Stage-2 Recheck(原子的再検証)
審判たちが自ら残した**concession(譲歩・疑念・仮定)を集約し、ルーターが原子的命題(atomic claim)**へ再構成します。そして各命題に必要な証拠種別を指定してStage-2審判へルーティングします。例えば:
- 外部引用/批評が必要な命題 → Web Judge
- 原文素材の再確認が必要な命題 → Source Recheck
これにより「モデルが曖昧に流した点」をピンポイントで再検証できます。Stage-2は2方向に原判定を覆せます。
- FAIL → PASS: 全てのconcessionが2次検証で支持される
- PASS → FAIL: concessionの1つでも反駁される
![]()
注意点と実務の落とし穴
⚠️ 注意1: 「小さいモデルに乗り換える」は答えになりません
Netflixのablation結果によると、単に小さいモデルを使うと厳しすぎ、reasoning effortを上げると緩すぎになります。つまり「簡単なチューニング」ではホリスティックベースラインの根本問題を解決できません。構造を変える必要があります。
⚠️ 注意2: P50レイテンシは増加します
カスケードは低信頼ケースに対してStage-2まで走らせるため、中央値レイテンシが上がります。 Netflixは「判定に許容できる範囲」と判断しましたが、リアルタイム性が重要なサービス(例: チャットフィルタリング)にはそのまま移植しにくいです。必ず非同期バッチ処理やキャッシュレイヤーを併せて設計してください。
⚠️ 注意3: エピソード単位タスクには「全体あらすじ」コンテキストが必須
エピソードシノプシスだけを渡すと、モデルは過度にFAILを出します。そのディテールが全体ストーリーラインに合うか判断するコンテキストがないためです。Netflixはシーズン全体のあらすじをプロンプトに追加してこの問題を解決しました。
📊 成果比較
| 指標 | 従来ホリスティック | カスケード |
|---|---|---|
| コスト(show-level) | 100% | -52.4% |
| コスト(episode + summary) | 100% | -15% |
| Recall-FAIL | 0.77 | 0.86 |
| 人間rationale一致度 | ~69% | ~82% |
| P50レイテンシ | 基準 | 増加(許容範囲) |
ポイントは精度とコストを同時に改善した点です。通常はトレードオフですが、このアーキテクチャはルーティングで必要な箇所にだけコストを割くため、両方成立しています。

まとめ: 自社サービスへの適用方法
日本の開発エコシステムでの適用文脈
このアーキテクチャはNetflixのようなハイパースケールでなくても十分有効です。特にコンテンツ審査・モデレーション・RAG回答検証を行う日本のチームならすぐ参考になります。例えばEC商品説明の事実検証、CSチャットボット回答のhallucination検証、ニュース要約検証などに同じパターンが使えます。
日本のSI案件では「LLMを1回呼んで判定」で終わらせるケースが多いですが、ここから一歩進んでconfidence + concession + routerの3点セットを入れるだけで品質が大きく変わります。ただしコスト計算は事前に必ず行ってください。 低信頼ケースの比率が高いと、カスケードがむしろホリスティックより高コストになり得ます。
次のステップ学習方向
- LLM-as-a-Judgeパターン — 本記事でも一致度測定に使われています。判定システムを作るなら必須の前提学習。
- Constitutional AI / Self-Critique — モデル自身に推論の弱い箇所を発見させるプロンプトエンジニアリング技法。
- Routingパターン(Mixture-of-Experts的) — タスクごとに適切なモデル/ツールへ配分するアーキテクチャ。コスト最適化の核心です。
併せて読みたい記事
- エッジAI時代の新基準、NVIDIA IGX Thorが投げかける問い — オンデバイス推論コストの観点で比較すると面白いです。
- ピクセルパーフェクトはもう終わり、現代Web開発の新しい「完璧さ」 — 「完璧さ」の定義を考え直させる記事。本記事の「技術的には真だが誤解を招く」という概念とも通じます。
原文アーキテクチャと実験結果はNetflix Tech Blogの根拠資料で直接確認できます。遠回りせずすぐ適用してみてください。