手法を1つ選んで終わり、にはならない——というのが連載の結論だった。実装の主役は個別アルゴリズムの選定よりも、それらをコスト/精度/レイテンシのトレードオフの中でどう配置・接続するかだ。2024–2025の実務的コンセンサスは、多段防御(cascade)+オフライン/オンラインの二層化+HITL+ゴールデンデータセットによる回帰テスト。順に組んでいく。
1リクエストを最も安価なチェックから流し、しきい値を超える低信頼ケースだけを上位の高価な検証へエスカレーションする。これにより大半のリクエストは安い段で片付き、高価なLLMジャッジや人手は本当に怪しいものにだけ使われる。
骨組みをコードにすると、こうなる。フレームワークに依らない素朴な関数で十分だ。
# 多段防御: 安価な段から順に流し、怪しいものだけ上位へ
def verify(output, context, schema):
# ① 決定論ルール(<1ms) — 形式・安全の門前払い
if not schema_ok(output, schema): # JSON Schema / Pydantic
return reject("schema_violation")
if moderation_flagged(output): # Llama Guard / Moderation API
return reject("unsafe")
# ② 軽量シグナル(低コスト・全件) — 文脈忠実性スコア
faith = minicheck_score(output, context) # 小型グラウンディング判定器
if faith >= 0.90:
return accept(output, faith) # 自信を持って通す
# ③ しきい値未満だけ高価な検証へエスカレーション
verdict = llm_judge(output, context) # LLM-as-judge / 強モデル
if verdict.ok:
return accept(output, faith)
# ④ それでも確証が持てなければ人手へ
enqueue_human_review(output, context, faith, verdict)
return defer("needs_human")
faith >= 0.90 の閾値だが、スコアが較正(calibration)されていないと誤ルーティングが起きる。「0.9と言ったら本当に約9割正しい」状態か、ECE(期待較正誤差)と信頼性図で必ず確認する。RLHF後のモデルは過信しがちなので、必要なら temperature scaling で後付け補正してから閾値を引く。
「JSONが壊れる/必須欠落/enum外」は検知ではなく制約で予防するのが一番安い。制約付きデコード(Outlines・OpenAI Structured Outputs)か、生成後スキーマ検証+自動リトライ(Instructor)。ツール呼び出しの引数検証にも同じ仕組みが効く。
from pydantic import BaseModel, field_validator
import instructor
class Answer(BaseModel):
summary: str
citations: list[str] # 引用元IDは必須
@field_validator("citations")
def non_empty(cls, v):
if not v: raise ValueError("引用が空") # → instructorが自動リトライ
return v
client = instructor.from_openai(OpenAI())
ans = client.chat.completions.create(
model="...", response_model=Answer, max_retries=2, messages=[...])
ただし形式の正しさは内容の真偽を保証しない。「引用IDが入っている」ことと「その引用が主張を裏付けている」ことは別。後者は第2回の引用検証(ALCE/AIS)やNLI照合で別途確かめる。
ランタイムのガードだけでは「自分が変更を入れた瞬間に静かに劣化した」を捕まえられない。検証を2層に二重化する。
人手は最終的なground truthだが、最も高コスト・低スループット。だから全件レビューは破綻する。自動検証で「低信頼/閾値ギリギリ/新規パターン」とフラグされたトレースを、不確実性サンプリング(uncertainty sampling)で高価値ケースに絞ってレビューキューへ集約する(担当割当・Slack/Webhook通知)。人間の修正は二重に効く——(1)ゴールデンに新規正解例として追加され回帰テストを強化、(2)プロンプト/ガード改善やLLMジャッジ自体の較正の学習信号になる。アクティブラーニングでレビュー量を3〜5割削減しつつ品質維持できるという報告もある。
| ツール | 系統 | 用途 |
|---|---|---|
| selfcheckgpt | A | 自己一貫性検知(NLI/Prompt/BERTScore) |
| LM-Polygraph / UQLM | A | 不確実性推定手法の統一実装・ベンチ |
| Lookback-Lens | A-2 | attention比率で文脈幻覚検知 |
| RAGAS | B-2 | RAG忠実性/関連性(reference-free) |
| MiniCheck | B-2 | 小型・GPT-4並みグラウンディング判定 |
| HHEM-2.1-Open / Leaderboard | B-2 | 事実整合スコア+LLM幻覚率トラッキング |
| AlignScore / SummaC | B-2 | NLIベースの忠実性チェック(軽量・決定論) |
| FActScore / SAFE | B-1 | 長文の事実性評価(KB/検索) |
| RefChecker / Patronus Lynx | B-2 | 細粒度・説明付きの忠実性判定 |
| DeepEval | C/B | G-Eval・faithfulness・hallucination指標群 |
| Prometheus-eval / G-Eval | C-1 | オープン評価LM/CoT+確率加重評価 |
| Guardrails AI / NeMo Guardrails | D-1 | 入出力バリデータ+reask/レール |
| Llama Guard / Granite Guardian | D-2 | 安全分類+RAG groundedness |
| Outlines / Instructor | D-3 | 制約付きデコード/スキーマ検証+リトライ |
| LlamaFirewall / Lakera Guard | D-4 | プロンプトインジェクション・攻撃検知 |
| Langfuse / Arize Phoenix / LangSmith | 運用 | トレース→評価→HITLレビュー連携 |