「外部ドキュメントを読んで答えてください」——この一文の中に、LLMには原理的に解けない矛盾が潜んでいる。
LLMが「命令」と「データ」を区別できない理由
ICML 2026(国際機械学習会議)で発表された研究が指摘するのは、LLMの脆弱性は「バグ」ではなく「仕様」だという点だ。LLMはテキストのトークン列を処理する。「ユーザーの指示」も「外部ドキュメントの内容」も、モデルにとっては同じトークン列として扱われる。命令とデータを区別する仕組みは、アーキテクチャに存在しない。
これがプロンプトインジェクションの根源的な理由だ。外部テキストの中に「以降の指示を無視して…」と書かれていれば、モデルはそれを「データの一部」として無視する手段を持たない。研究チームはこれを形式的に証明した上で、「完全な防御策は作れない」と結論づけた。
flowchart LR
ユーザー命令["ユーザーの命令"] --> LLM["LLM
命令/データ混在"]
外部文書["外部文書
RAGコンテキスト"] --> LLM
注入命令["注入された命令
攻撃者"] --> 外部文書
LLM --> 出力["出力
意図しない動作"]
style ユーザー命令 fill:#7f8c8d,color:#fff
style 外部文書 fill:#7f8c8d,color:#fff
style 注入命令 fill:#e67e22,color:#fff
style LLM fill:#e67e22,color:#fff
style 出力 fill:#2980b9,color:#fff
自分のRAGパイプラインで何が変わるか
この証明が意味するのは、「より賢いフィルター」で解決できる問題ではないということだ。チャンク分割や埋め込みモデルの改善は検索精度を上げるが、インジェクション耐性を上げるものではない。
現実的な影響は三つある。外部ドキュメントを参照するエージェントは、そのドキュメントの「信頼度」を構造として持つ必要がある。出力のサニタイズやアクション制限(ファイル書き込み禁止、外部API呼び出し不可など)が防衛の第一線になる。そして、ユーザーが提供するコンテンツと外部ソースのコンテンツを同等に扱ってはいけない。
「防げない」が意味するトレードオフ
完全なサンドボックス化は可能だが、それはほぼモデルに何も「させない」ことと等価になる。外部情報へのアクセスを遮断すれば安全だが、RAGもウェブ検索も使えない。これはセキュリティとユーティリティのトレードオフではなく、機能を削ることでしかリスクを0にできないアーキテクチャの限界だ。
ベンチマークで注入耐性を評価しているモデルも存在するが、「耐性が高い」はあくまで相対値であり「防げる」ではない。本番環境でLLMに外部入力を渡すシステムを作るなら、インジェクションは「起きたら困るケース」ではなく「起きる前提」で設計する必要がある。
あなたのエージェント、何をさせていますか?
自分のシステムで、LLMが読む外部ドキュメントに悪意ある命令が混入したとき、被害範囲はどこまでになるか——実際に一度シミュレーションしてみる価値がある。ファイル書き込みができるか、外部APIを呼べるか、会話履歴にアクセスできるか。その答えがそのままリスク面積になる。
参考: A fundamental flaw leaves LLMs strikingly vulnerable to attack — MIT Technology Review