LLM(大規模言語モデル)を業務に導入する際、最も警戒すべき問題が「ハルシネーション」、すなわち事実と異なる内容を自然な文体で生成してしまう現象でございます。本記事では、実装側で効果のあるハルシネーション対策5つを、具体的な手法と効果ランキング付きで整理いたします。
この記事でわかること
- ハルシネーションが発生する仕組み
- 業務システムで実用的な対策5つ
- 各対策の効果と実装難易度の比較
- 運用での継続的な監視方法
目次
- ハルシネーションとは何か
- 対策1: RAG(検索拡張生成)の導入
- 対策2: 出典明示の強制
- 対策3: 温度パラメータの調整
- 対策4: 「分からない」と言わせるプロンプト設計
- 対策5: 出力結果の機械的検証
- 運用での継続監視
- まとめと優先順位
ハルシネーションとは何か
ハルシネーション(hallucination)とは、LLM が「実際には存在しない事実」「不正確な情報」を、あたかも本当のことのように自信を持って出力する現象です。たとえば次のような形で現れます。
- 実在しない論文や書籍を引用する
- 実在しない法律条文を引用する
- 会社の商品仕様について誤った数値を回答する
- 実在しない URL を提示する
LLM は「次に来る言葉の確率」を計算するモデルであり、本質的に「事実を知っている」わけではありません。学習データに含まれていない情報、または曖昧な情報について、もっともらしい言葉を組み立ててしまうのがハルシネーションの根本原因です。
対策1: RAG(検索拡張生成)の導入
効果: ★★★★★ | 実装難易度: 中
業務システムでのハルシネーション対策として、最も効果が高いのが RAG(Retrieval-Augmented Generation)の導入です。質問を受けたら、信頼できる社内データベースから関連情報を取得し、それを参考資料として LLM に投入して回答を生成する構成です。
LLM は「自由に思い出す」のではなく「与えられた資料を読んで答える」状態になるため、ハルシネーションが大幅に減少します。実装の詳細は「Claude Code で社内ナレッジ検索ツールを最短構築する手順」をご参照ください。
# プロンプト例
system = f"""以下の社内資料を参考に、質問に答えてください。
【参考資料】
{retrieved_documents}
【ルール】
- 上記資料に書かれていることのみを根拠に回答してください。
- 資料にない情報については「該当する記述が見つかりませんでした」と答えてください。
"""
対策2: 出典明示の強制
効果: ★★★★☆ | 実装難易度: 低
「回答する際、必ず参考にした情報の出典を明示すること」とプロンプトで指示することで、LLM は根拠のない作話を抑制する傾向を示します。
system = """質問に答える際は、必ず以下の形式で出典を明示してください:
【回答】
(回答本文)
【出典】
- 文書名/URL: 該当箇所
- 文書名/URL: 該当箇所
出典が示せない情報は、回答に含めないでください。"""
RAG と組み合わせると効果が増幅します。出典が表示されることでユーザー側も「この情報は本当に正しいか」を二次確認しやすい状態になり、ハルシネーションが実害化するリスクが大きく下がります。
対策3: 温度パラメータの調整
効果: ★★★☆☆ | 実装難易度: 最低
LLM の出力には「温度(temperature)」というパラメータがあり、0〜1(Anthropic は 0〜1)の範囲で「決定論的 vs 創造的」を調整できます。
- temperature=0.0: 同じ入力には常に同じ出力(決定論的、最も保守的)
- temperature=0.3: 軽い揺らぎあり、業務用途で推奨
- temperature=0.7: 創造的、コピー生成向き
- temperature=1.0: 最大の揺らぎ、ブレインストーミング向き
業務システムでの事実回答用途では、temperature=0.0 〜 0.3 に設定することで、創造的な作話を抑制できます。
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2000,
temperature=0.0, # 最も保守的な出力
messages=[...]
)
対策4: 「分からない」と言わせるプロンプト設計
効果: ★★★★☆ | 実装難易度: 最低
LLM は「分かりません」と言うのが苦手な傾向があります。学習データの大半が「質問に答える」内容で構成されているためで、知らないことでも何かしら答えてしまいがちです。これに対しては、プロンプトで明示的に許可するのが効果的です。
system = """あなたは正確性を最優先する AI アシスタントです。
次のいずれかに該当する場合、必ず「分かりません」と回答してください:
1. 質問の意図が不明確な場合
2. 確実な根拠がない情報の場合
3. 質問が複数の解釈を持つ場合
「分からない」と答えることは恥ずかしいことではなく、
むしろユーザーに対する誠実な対応です。
推測や憶測で答えるよりも、必ず「分かりません」を選択してください。"""
この一言を入れるだけで、LLM が「無理に答えようとする」挙動が大きく抑制されます。実装難易度はゼロに近く、効果も大きい、コスト対効果の高い対策でございます。
対策5: 出力結果の機械的検証
効果: ★★★★☆ | 実装難易度: 高
LLM の出力に「事実検証可能な要素」が含まれる場合、機械的にチェックすることでハルシネーションを検出できます。
URL の存在チェック
import requests
def verify_urls_in_response(response_text):
import re
urls = re.findall(r'https?://[^\s\)]+', response_text)
invalid = []
for url in urls:
try:
r = requests.head(url, timeout=5, allow_redirects=True)
if r.status_code >= 400:
invalid.append(url)
except Exception:
invalid.append(url)
return invalid
数値の整合性チェック
商品仕様・料金など、社内データベースから検証可能な数値は、回答後にデータベースと突合する機能を組み込めます。不一致があれば警告を表示するか、再生成を促す動作にします。
引用文の検索照合
RAG 構成で参考資料を渡している場合、回答に含まれる引用が実際に参考資料中に存在するかをチェックする処理も実装可能です。
運用での継続監視
ユーザーフィードバックの収集
各回答に対して「役立った/役立たなかった」のフィードバックボタンを設置し、低評価の回答を週次でレビューします。ハルシネーション発生パターンを把握する基礎データになります。
サンプリングレビュー
毎日 N% の回答をランダムサンプリングし、人間が事実確認を行うレビュー体制を組み込みます。運用初期は10〜30%、安定後は1〜5%程度のサンプリング率が目安です。
モデル変更時の再評価
Claude モデルのバージョンアップや、SDKの更新後は、ハルシネーション率が変動する可能性があります。月次で同じ評価セットを通してハルシネーション率を測定する習慣をつけてください。
まとめと優先順位
業務システムでのハルシネーション対策は、複数の手法を組み合わせて多層防御することが重要でございます。優先度を再整理しますと:
| 優先度 | 対策 | 効果 | 実装難易度 |
|---|---|---|---|
| 1 | 「分からない」を許可するプロンプト | ★★★★ | 最低 |
| 2 | 温度パラメータを 0.0〜0.3 に | ★★★ | 最低 |
| 3 | 出典明示を強制 | ★★★★ | 低 |
| 4 | RAG の導入 | ★★★★★ | 中 |
| 5 | 機械的検証 | ★★★★ | 高 |
すぐに着手できる「1〜3」だけでも、ハルシネーションの実害は大幅に減らせます。本格的な業務システムでは RAG の導入が王道で、機械的検証は重要度の高い情報(料金・法律・医療情報など)に対して追加実装するのが現実的でございます。
LLM の業務導入時には「100%の正確性は約束しない」前提で、人間の確認フローと組み合わせるのが必須でございます。完全自動化を目指すのではなく、AI の出力を「下書き」として、最終判断は人間が行う構成が、品質と効率のバランスが取れる現実解と考えております。