Claude Code などの LLM エージェントを業務で使う際、最大のリスクは**ハルシネーション(幻覚)**です。プロンプトの改善ばかりが注目されがちですが、本当に必要なのは「仕組みで縛る」アプローチです。
きっかけとなった事故
ある開発者が実際に遭遇した事故が、この議論のきっかけです:
whichコマンドの結果だけで「未インストール」と診断されたが、コードは PATH 外のディレクトリを直接参照していた。ログを1行も読まずに断言。
LLM エージェントは自信に満ちた口調で誤った結論を出すことがあり、人間がそれを鵜呑みにしてしまうリスクがあります。
Anti-Hallucination Protocol の4つの柱
提唱されている Anti-Hallucination Protocol は、以下の4つのルールで構成されます:
1. 事実主張にはツール実行による検証を義務化
LLM が「〜がインストールされていない」「〜が原因です」と主張する場合、必ず対応するコマンドやツールを実行して裏付けを取ることを求めます。推測だけで結論を出すことを許容しません。
2. 禁止パターンの明示
以下の4つのパターンを明示的に禁止します:
| パターン | 説明 |
|---|---|
| 推測診断 | 十分な証拠なしに原因を断定する |
| 確認なし否定 | 実際に確認せず「存在しない」「動かない」と主張する |
| 記憶による主張 | 過去の学習データだけに基づく事実主張 |
| 自信に満ちた誤り | 高い確信度で不正確な情報を提供する |
3. 違反時のインシデント記録と伝播
ハルシネーションが検出された場合、インシデントとして記録し、全プロジェクト横断で伝播させます。これにより同じ失敗パターンを繰り返さない仕組みを構築します。
4. プロジェクト設定への組み込み
CLAUDE.md や類似の設定ファイルにルールを記述し、プロジェクト単位で一貫したガードレールを維持します。
2026年のハルシネーション対策の現状
2026年3月時点で、各 LLM のハルシネーション率は改善が進んでいます。LLM Hallucination Index 2026 によると、Claude Sonnet 4.6 は BS 検出成功率 91.0%、誤検出率 3.0% とトップクラスの精度を示しています。
しかし、モデル性能の向上だけでは不十分です。特に以下の場面ではハルシネーションが発生しやすいことが報告されています:
- コンテキスト圧縮後: 長い会話でコンテキストが圧縮されると、計画と実装の乖離が起きやすい
- Plan Mode での実装フェーズ: 計画作成後の実装で、計画にない機能を追加してしまう
実践的な対策
CLAUDE.md への記述例
| |
CLEO のようなツールの活用
CLEO は Claude Code 向けのタスク管理ツールで、4層の Anti-Hallucination 保護と SQLite による不変の監査証跡を提供します。
批判と議論 — 「モデルに自己検証させる」ことの限界
Anti-Hallucination Protocol に対しては、本質的な批判が存在します。
批判: モデルの確信度問題
ハルシネーションはモデルの確信度の問題なので、モデル自身に確信度を評価させるループは原理的に機能しない。環境診断用の必要証拠セット(PATH確認・実行バイナリの絶対パス・コード中の参照・ログ)を外部仕様として定義し、揃わない回答を拒否する対策が有効だ。
この指摘は核心を突いています。モデルが「自分は正しい」と高い確信度で誤った出力をするのがハルシネーションの本質であり、そのモデルに「自信があるか確認して」と問いかけても意味がありません。
反論: 「ツール実行で外部検証している」
これに対し、Protocol の提唱者は次のように反論しています:
モデルに「自信ある?」と聞いても無意味なので、主張の種類ごとに必須の検証行動(ファイル存在確認、ログ grep 等)を CLAUDE.md で定義し、証拠なしの主張を禁止している。モデルの内省ではなく、ツール実行という外部検証を強制する仕組みだ。
反論の限界 — CLAUDE.md は「お願い」であり「強制」ではない
この反論は方向性として正しいものの、3つの構造的な弱点を抱えています。
1. ルール適用の判断がモデル内部にある
「この主張は環境診断だから証拠セットが必要」と判定するのはモデル自身です。主張の種類の分類を間違える — つまりハルシネーションする — 可能性があります。
2. 「証拠が揃った」の判断もモデル内部にある
which を実行して「確認しました」と言うのは一見すると外部検証ですが、「which だけで十分」と判断したのはモデルです。元の事故がまさにこのパターンでした。
3. CLAUDE.md はプロンプトの一部に過ぎない
ファイルとして外部に存在していても、LLM にとっては system prompt と同じコンテキストです。「外部仕様」のように見えて、実行時にはモデルの内部処理に組み込まれます。
本当の「外部検証」とは
批判者が指摘する外部仕様とは、モデルの判断を介さずに機械的に検証する仕組みのことです:
| アプローチ | 仕組み | モデルの関与 |
|---|---|---|
| CI/CD パイプライン | 特定のコマンド群の実行結果をモデル外のスクリプトが検証 | なし |
| pre-commit hook | 「環境診断を含むコミットには which, readlink, grep log の実行履歴が必要」と機械的にチェック | なし |
| MCP サーバー側フィルタ | 証拠不足の応答を返さないようサーバー側でフィルタリング | なし |
| CLAUDE.md ルール | モデルがルールを読んで自主的に従う | 全面的に依存 |
CLAUDE.md でのルール定義は「モデルへのお願い」であり、「外部からの強制」ではありません。これが本質的な違いです。
議論の帰結 — 「判定者をモデルの外に出せるか」
最終的に、この議論は以下の結論に収束しました:
構造としては「X を主張する前に Y を実行せよ」という前提条件命題であり、ベクトルは一致している。ただし「証拠なしの主張を禁止」という前提条件の充足判定がモデル内部にある限り、本質的な問題は解決しない。判定者をモデルの外に出せるかが、プロンプトと仕組みの分岐点だ。
この整理が示す重要な点は、Anti-Hallucination Protocol の方向性(ツール実行の義務化)自体は正しいということです。問題は「Y を実行したか」ではなく、「Y が十分に実行されたか」を誰が判定するかにあります。
構造化出力による外部検証 — 具体的な解決策
判定者をモデルの外に出す方法として、モデルの出力を構造化し、evidence 性をシステム側で検証するアプローチがあります。
設計例: 構造化された証拠付き応答
モデルに対して、主張と証拠を分離した構造化出力を強制します:
| |
外部システムが evidence 配列を検査し、claim_type に対して必要な証拠が揃っていなければ(null が含まれていれば)回答を拒否します。こうすることで、充足判定がモデルの外に出ます。
検証レイヤーの比較
| レイヤー | 判定者 | 実効性 |
|---|---|---|
| プロンプト(CLAUDE.md) | モデル | 低 — 従うかどうかもモデル次第 |
| 構造化出力 + 外部検証 | 外部システム | 中 — 出力形式は強制できるが、evidence の中身の正確性はモデル依存 |
| ツール実行ログの外部監査 | 外部システム | 高 — モデルが実際に何を実行したかをランタイムが記録・検証 |
注目すべきは、構造化出力方式でも完全ではないという点です。モデルが evidence の中身を捏造する可能性は残ります。最も実効性が高いのは、エージェントランタイム側がツール実行ログを独立に記録し、モデルの主張と突き合わせる方式です。
Claude Code における実現可能性
Claude Code はすべてのツール実行をログとして保持しています。これを活用すれば:
- モデルが環境診断の主張を出力する
- ランタイムが直近のツール実行ログを参照する
- 必要な証拠コマンド(
which,readlink,grep)の実行履歴がなければ、応答をブロックまたは警告する
この仕組みは hooks 機能や MCP サーバーとして実装可能であり、CLAUDE.md の「お願い」よりもはるかに強い強制力を持ちます。
まとめ
「仕組みで縛れ」の本質は、判定者をモデルの外に出すこと。
Anti-Hallucination Protocol をめぐる議論から見えてきたのは、ハルシネーション対策の3つの段階です:
| 段階 | アプローチ | 判定者 | 限界 |
|---|---|---|---|
| 第1段階 | CLAUDE.md でルール定義 | モデル | モデルがルールを無視・誤解する可能性 |
| 第2段階 | 構造化出力 + 外部検証 | 外部システム | evidence の中身の正確性はモデル依存 |
| 第3段階 | ツール実行ログの外部監査 | 外部システム | モデルの関与なしに検証可能 |
現時点で多くの開発者が実践しているのは第1段階です。これは「ないよりはるかに良い」ものの、原理的な限界があります。
目指すべきは第3段階 — モデルが何を実行したかをモデルの外側で記録・検証し、証拠不足の主張を機械的に拒否する仕組みです。Claude Code の hooks 機能や MCP サーバーの活用により、この実現は技術的に射程圏内にあります。
「AI を信用するな。仕組みで縛れ。」— この原則を貫くなら、仕組みの判定者もまた、AI であってはなりません。