この記事の音声は準備中です。
音声の一覧・再生リストへガードレール
この記事の目的
ガードレール(guardrails)を「モデルの外側でコードとして強制される制御」と正しく定義し、入力・出力・アクションの 3 層で何をどこまで固くするかを設計できるようになります。ルールベースと LLM ベースの検査の使い分け、そしてガードレール自体の品質管理(誤検知・見逃しの評価)まで扱います。
対象読者
- Agent の安全制御を「プロンプトの注意書き」から「実装された仕組み」に引き上げたいエンジニア
- 過剰なブロックで使いものにならない、逆に緩すぎて意味がない、の間で強度を決めかねているチーム
前提知識
- Agent の脅威モデル概観 — 何から守るのかの全体像
- Human-in-the-Loop 設計 — アクションガードの一形態である承認の設計
本文
概要: プロンプトの禁止指示はガードレールではない
「危険な操作はしないでください」とシステムプロンプトに書くことは、挙動を改善はしますが、強制ではありません。インジェクションで上書きされえますし、モデルが単に従い損ねることもあります(プロンプトインジェクション)。
本記事でガードレールと呼ぶのは、モデルの判断の外側にあり、コードとして強制される制御です。モデルが何を出力しようと、ガードが通さなければ実行されません。この「モデルを迂回できない」性質が、プロンプト指示との本質的な違いです。
詳細: 3 層のガードレール
Agent の実行フローには、制御を差し込める場所が 3 つあります。
| 層 | 位置 | 代表的なガード |
|---|---|---|
| 入力ガード | ユーザー入力・外部コンテンツがモデルに入る前 | スコープ外の依頼の遮断(この Agent の目的外の話題)、インジェクション・不正パターンの検知、レート制限、入力サイズ上限 |
| 出力ガード | モデルの応答がユーザー・下流システムに渡る前 | 機微情報(個人情報・認証情報)のフィルタ、有害・不適切内容の検査、形式検証(構造化出力)、外部 URL の無害化(データ漏えい対策) |
| アクションガード | モデルのツール呼び出し要求が実行される前 | ツール許可リスト、引数の検証(対象・範囲・形式)、上限(金額・件数・頻度)、承認ゲート(Human-in-the-Loop 設計)、実行環境の隔離(ツール権限設計とサンドボックス) |
承認ゲートが決定的に強制するのは「承認なしでは実行しない」という条件です。人の判断の正しさや、LLM の内容判定は保証しません。副作用・外部送信・非信頼入力・機微データアクセスを別々に分類します。
3 層のうちアクションガードが最重要です。入力・出力のガードは内容の判定を含むため確率的になりがちですが、アクションガードは「このツールは呼べない」「この引数は範囲外」「承認がなければ実行しない」という決定的な強制ができる場所だからです。被害はほとんどの場合アクション(副作用)から生まれます。
詳細: ルールベースと LLM ベースの使い分け
| 方式 | 性質 | 向くもの |
|---|---|---|
| ルールベース(コード・正規表現・許可リスト) | 決定的・高速・安価。判定理由が明確 | ツール許可リスト、引数の範囲検証、上限、形式検証、既知パターンの機微情報 |
| LLM ベース(検査用のモデル呼び出し) | 柔軟・文脈を読める。ただし確率的で、それ自体が騙されうる | 有害性・話題逸脱・「この応答は根拠に基づいているか」など、ルールで書けない判定 |
原則は「ルールで書けるものはルールで書く。LLM 検査は、決定的ガードの代替ではなく追加の層」です。LLM ベースの検査器も LLM である以上、インジェクションの対象になりえます。検査器が「問題なし」と騙されても被害が出ない位置(決定的ガードの内側)に置きます。
詳細: ガードレール自体の品質管理
ガードレールは付ければ終わりではなく、それ自体が誤検知(正当な操作のブロック)と見逃し(すり抜け)を持つコンポーネントです。
- 評価します — 正当なケースと攻撃・違反ケースの両方を含むテストセットで、誤検知率と見逃し率を測ります。LLM ベースの検査器は judge と同じ検証手順(LLM-as-a-Judge)を適用します
- 回帰スイートに含めます — 「ガードが機能したか」は軌跡のアサーション(軌跡(trajectory)評価)としてテストできます。プロンプト・モデルの変更でガードの発火傾向も変わります
- 発火を監視します — ガードの発火ログは、攻撃の試行・Agent の異常の早期指標です(可観測性とトレーシング)。発火率の急変はインシデントのシグナルとして扱います(インシデント対応)
設計判断: 強度はリスクに比例させる
すべてを最強にすると、誤検知と承認疲れでシステムが使われなくなります。強度の設計は次の 2 つで行います。
- 操作のリスクで傾斜をつける — 取り消せない・影響の大きい操作ほど固く(決定的ガード + 承認)、外部取得を伴う読み取りは送信経路(GET 引数・応答 URL の取得を含む)として制限し、機微データの読み取りにもアクセスログと量の上限を置く。一律の強度は「重要な警告が雑音に埋もれる」結果を招きます
- 動的に強化できるようにする — 平時は軽く、異常時(インシデント・攻撃検知時)に承認必須化・ツール無効化へ切り替えられる構成にします(インシデント対応 の縮退運転)。ガードレールとキルスイッチインシデント時にデプロイなしで Agent を止める・自律度を下げるための、事前に用意された停止手段。全停止・縮退・ツール単位の無効化など粒度を分けて設計する。は同じ仕組みの静的・動的な両面です
実務での注意点
アンチパターン
- プロンプトの禁止指示を「ガードレール実装済み」と数える → 指示は強制ではなく、迂回・無視されうる → コードで強制される層(特にアクションガード)を主防御にする
- LLM 検査器を決定的ガードの代わりに使う → 検査器自体が騙されうるため、単独では突破可能な壁にしかならない → 許可リスト・引数検証・承認の内側に「追加の層」として配置する
- ガードの発火を記録・監視しない → 攻撃の試行や誤検知の多発に気づけず、改善もできない → 発火ログを監視・アラートに接続し、定期的に誤検知率を見直す
- 全操作に一律で最強のガードを掛ける → 誤検知と承認疲れで、ユーザーが回避策を探し始める(シャドー利用) → リスクに比例した傾斜をつけ、平時は軽く・異常時に強化する
チェックリスト
- 外部取得を伴う読み取りを送信経路として扱い、機微データの読み取りにアクセスログと量の上限がある
- 入力・出力・アクションの 3 層それぞれに何のガードがあるか列挙できる
- 決定的なガード(許可リスト・引数検証・上限・承認)がアクション層にある
- LLM ベースの検査が決定的ガードの内側に配置されている(代替になっていない)
- ガードレールの誤検知率・見逃し率をテストセットで測った
- 「ガードが機能したか」が回帰スイートのアサーションになっている
- ガードの発火がログ・監視・アラートに接続されている
- ガードの強度が操作のリスクに比例している(一律でない)
- 異常時にガードを動的に強化(承認必須化・無効化)できる
関連トピック
- Agent の脅威モデル概観 — ガードで守る対象の全体像
- プロンプトインジェクション — 決定的・確率的の区別の背景
- ツール権限設計とサンドボックス — アクションガードの権限側
- Human-in-the-Loop 設計 — 承認ゲートの設計と承認疲れ
- 軌跡(trajectory)評価 — ガードの機能検証
- インシデント対応 — 動的な強化(縮退)との接続
- LLM の学習パイプライン(事前学習から選好調整まで) — 「指示はお願い」である理由(学習工程からの由来)
参考資料
- OWASP Top 10 for Large Language Model Applications — 各脅威に対する緩和策としてのガード設計の参考(アクセス日: 2026-07-05)