ハルシネーションを抑える 7 つの手法#
LLM のハルシネーション(事実に基づかない生成)を完全に防ぐことはできないが、運用上許容できるレベルまで抑えることは可能。7 つの手法を効果順に紹介。
効果の優先度#
flowchart TD
H[ハルシネーション対策] --> L1[効果 特大]
H --> L2[効果 大]
H --> L3[効果 中]
H --> L4[効果 小]
L1 --> R[RAG で文脈を足す]
L1 --> T[ツール利用で事実確認]
L2 --> J[JSON Mode 構造化]
L2 --> C[Citations を要求]
L3 --> F[Few-shot で望ましい振る舞い]
L3 --> V[検証者 LLM で事後チェック]
L4 --> TE[Temperature を下げる]
1. RAG で文脈を足す(効果: 特大)#
LLM の学習データ外の事実は、コンテキストに含めない限り正しく答えられない。関連する文書を検索して LLM に渡す(RAG)。
- 社内ドキュメント、製品情報、最新データ等、全て RAG で渡す
- チャンク設計が重要(Techniques「RAG のチャンクサイズを選ぶ基準」参照)
2. ツール利用で事実確認(効果: 特大)#
生成の途中で、LLM にツールを呼び出して事実を確認させる。
- DB クエリで実データを取得
- 検索 API で最新情報を取得
- 計算を LLM に任せず、電卓ツールを呼ぶ
flowchart LR
Q[質問] --> L[LLM]
L -->|ツール呼び出し| T[DB / API / 計算]
T -->|結果| L
L --> A[回答<br/>事実に基づく]
3. JSON Mode で構造化(効果: 大)#
文章で返させると装飾的な嘘が混ざりやすい。JSON で厳密に項目を埋めさせるほうが、嘘の余地が減る。
# 悪い: 自由記述
「担当者は山田さんで、たぶん 3 月頃に対応したと思います」
# 良い: JSON
{"person": "unknown", "date": "unknown", "notes": "情報不足"}
不明を "unknown" として明示させる設計にする。
4. Citations を要求する(効果: 大)#
回答に出典・引用を必ず付けさせる。出典が出せないなら「情報なし」と答えさせる。
あなたの回答には、参照した文書の ID と該当箇所を必ず添えてください。
参照元がない情報は回答に含めないでください。
5. Few-shot で望ましい振る舞いを示す(効果: 中)#
「情報がないときはこう答える」という例を few-shot で示す。
例 3:
入力: 今月の売上は?
出典: (売上データなし)
出力: {"answer": null, "reason": "売上データが参照できません"}
6. 検証者 LLM で事後チェック(効果: 中)#
生成された回答を、別の LLM が「事実に基づいているか」チェックする。整合性の低い回答を再生成させる。
- コスト増につながる
- クリティカルな用途に限定
7. Temperature を下げる(効果: 小)#
Temperature=0 にすると決定的に近い振る舞いになる。ハルシネーションの頻度はやや下がる。ただし根本対策にはならない。創造性が必要な用途では下げない。
層の組み合わせ#
flowchart TD
I[ユーザー入力] --> R[RAG で文脈取得]
R --> L[LLM 生成 + Citations]
L --> V[検証者 LLM]
V -->|OK| O[ユーザーへ提示]
V -->|NG| RG[再生成 or フォールバック]
単一の対策ではなく、複数層で守る。用途に応じて層を足し引きする。
防げないハルシネーションへの備え#
完璧な対策は不可能。残ったハルシネーションを想定して設計する。
- UI で警告を出す: 「AI の生成結果です。重要な判断には確認をお願いします」
- 重要なアクションは人間承認を必須に: メール送信、決済、データ削除等
- 監視: 出力をサンプリングして定期的に人間がチェック
- ユーザーからのフィードバック経路: 誤情報を報告できる仕組み
まとめ#
ハルシネーションは消せない前提で、RAG + ツール利用 + 構造化の 3 点を軸に対策を組む。完璧を目指さず、運用で補う設計にする。
関連#
- RAG のチャンクサイズを選ぶ基準(Techniques)
- LLM の非決定性を前提に設計する(Concepts)
- Eval-Driven Development(Concepts)