ガードレールとは
ガードレールとは、AIシステムの入出力を検査し、有害・不適切・ポリシー違反なコンテンツをリアルタイムでブロックまたは変換する制約機構の総称だ。「入力ガードレール」と「出力ガードレール」の2層構成が基本となる。入力ガードレールはユーザーのリクエストがメインモデルに届く前に検査し、出力ガードレールはAIが生成したレスポンスをユーザーに返す前に検査する。
Anthropicはシステムプロンプトによる制約をガードレールの主要な実装手段として位置づけており、Constitutional AI(constitutional training)によってモデルレベルのガードレールも組み込まれている。OpenAIはModerationエンドポイント(POST /v1/moderations)を提供しており、ヘイトスピーチ・暴力・性的コンテンツなどのカテゴリ別に数値スコアと判定結果を返す。「Building effective agents」の中でAnthropicは、エージェントシステムにおけるガードレールの実装を推奨パターンとして明示している。
なぜ注目されているのか
エージェント化が進むにつれ、AIが外部システムを直接操作したりメールを送信したりする能力を持つようになり、誤動作や悪用のリスクが急激に高まっている。単一の会話で終わるチャットボットと異なり、エージェントシステムでは一度ガードレールが突破されると連鎖的な被害が発生しうる。AnthropicとOpenAIの両社が2025年にリリースしたエージェント関連APIでは、ガードレールの組み込みを設計上の必須要件として明示している。
「シーケンシャルガードレール」と「パラレルガードレール」という実装パターンも注目されている。シーケンシャルは主処理の前後に直列で配置するシンプルな形式だ。パラレルは主処理と並行してガードレールを走らせることでレイテンシを最小化する高度な形式で、コスト増を抑えながら安全性を確保できる。
関連する技術
ガードレールはPrompt InjectionやMemory Poisoningなどの攻撃手法への防御にも使われる。ユーザー入力を信頼しないゼロトラスト原則に基づいてすべての入力を検査することで、悪意ある指示によるエージェントの乗っ取りを防ぐことができる。特に外部データ(ウェブページ・ドキュメント)をエージェントが読み込む場合、その内容に埋め込まれた指示を無効化するためのガードレールが不可欠だ。
ドラゴンボールで例えると
ガードレールは**亀仙人の「弟子入り審査」と「技の使用制限」**を合わせた仕組みだ。
- 入力ガードレール = 亀仙人が弟子入り希望者を最初に審査する場面。「悪いことに使いたい」と言う者は即退場(ブロック)。ユーザーの入力がメインのAIに届く前に検査する
- 出力ガードレール = 「かめはめ波は悪人にのみ使うこと」という制約——技を放つ前に「この相手に使っていいか」を確認する。AIの回答がユーザーに届く前に検査する
- シーケンシャルガードレール = 弟子入り審査→修行→使用後チェックという直列の関門。シンプルだが時間がかかる
- パラレルガードレール = 悟空が戦いながら同時に「この技を使っていいか」をリアルタイムで判断する——速度を犠牲にせず安全を確保する高度な形式
- ガードレールが突破されると連鎖被害 = 魔人ブウが封印を解かれると地球全土に被害が広がるように、一度制約を突破されると被害が連鎖する
「技を覚えるより、技を正しく使う判断力を育てる」——亀仙人の哲学はガードレール設計の精神そのものだ。
実装してみる
- 01 入力ガードレール: ユーザー入力をClaudeの小型モデル(Haiku)で事前チェックし、問題ある入力をブロックする
- 02 出力ガードレール: メインモデルのレスポンスを受け取った後、別のClaudeコールで安全性を検証する
- 03 ブロック時はユーザーに明確なフィードバックを返し、ログに記録する
import anthropic
client = anthropic.Anthropic()
GUARDRAIL_SYSTEM = """
あなたは安全性フィルターです。入力が安全なら "SAFE"、
問題があれば "UNSAFE: [理由]" とだけ返してください。
"""
def check_input(user_message: str) -> bool:
result = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=64,
system=GUARDRAIL_SYSTEM,
messages=[{"role": "user", "content": user_message}],
)
return result.content[0].text.startswith("SAFE")
if not check_input(user_input):
raise ValueError("入力がポリシーに違反しています")
以下のユーザー入力が安全かどうかを判定してください。 安全なら「SAFE」、問題があれば「UNSAFE: [具体的な理由]」とだけ回答してください。 入力: [ユーザーメッセージをここに挿入]