はじめに
こんばんは、mirukyです。
Amazon Bedrock シリーズ第5回です。
前回(#4)では、Bedrock Agentsを使ってナレッジベース検索とLambda呼び出しを自律的に判断・実行するAIエージェントを構築しました。
今回は、エンタープライズで生成AIを導入する際に欠かせないGuardrails(ガードレール) を設計・構築します。
生成AIは非常に強力ですが、そのままでは以下のようなリスクがあります。
- 有害コンテンツの生成(暴力的・差別的な回答)
- 機密情報の漏洩(個人情報や社内情報が回答に含まれる)
- ハルシネーション(事実と異なる情報をもっともらしく回答)
- プロンプト攻撃(Jailbreakやプロンプトインジェクション)
- 業務範囲外の質問への回答(投資助言、医療診断など)
Guardrailsは、これらのリスクを入力(プロンプト)と出力(回答)の両方でフィルタリングし、安全な生成AIアプリケーションを実現します。
出典:Amazon Bedrock ガードレールのコンテンツフィルターを設定する - AWS
目次
- Guardrailsの仕組み
- Guardrailの作成
- コンテンツフィルターの設定
- 拒否トピックの設定
- ワードフィルターの設定
- 機密情報フィルター(PII)の設定
- コンテキストグラウンディングの設定
- テストと動作確認
- APIからGuardrailを使用する
- 料金について
- おわりに
1. Guardrailsの仕組み
1-1. フィルタリングの全体像
1-2. Tierの選択
Guardrailsにはコンテンツフィルターの精度に影響するTierがあります。
| Tier | 対応言語 | 精度 | 備考 |
|---|---|---|---|
| Classic | 英語・フランス語・スペイン語 | 標準 | 日本語非対応 |
| Standard(推奨) | 60以上の言語(日本語含む) | 高精度 | クロスリージョン推論の有効化が必要な場合あり |
日本語で利用する場合はStandard Tierを選択してください
Classic Tierは日本語に対応していないため、日本語の有害コンテンツを正しく検知できません。
2. Guardrailの作成
2-1. 作成画面を開く
- AWSマネジメントコンソール(東京リージョン)で Amazon Bedrock を開く
- 左側ペインの 「ガードレール」 を選択
- 「ガードレールを作成」 をクリック
2-2. 基本設定
| 設定項目 | 値 |
|---|---|
| 名前 | customer-support-guardrail |
| 説明 | カスタマーサポートAI用のガードレール |
| ブロック時のメッセージ | 申し訳ございません。そのご質問にはお答えできません。別のご質問をお願いいたします。 |
| Cross-Region inference | 有効 |
| Choose guardrail profile | APAC Guardrail v1:0 |
拒否トピックを日本語対応させるには、クロスリージョン推論を有効にする必要があるため、有効とします
「次へ」 をクリックして、各フィルターの設定に進みます。
3. コンテンツフィルターの設定
3-1. フィルタリング対象カテゴリ
- 「有害カテゴリのフィルターを有効にする」トグルをオンにします
- 「プロンプト攻撃のフィルターを有効にする」トグルをオンにします
| カテゴリ | 説明 | 推奨設定(感度) |
|---|---|---|
| 憎悪(Hate) | 人種・性別・宗教等に基づく差別的表現 | 高 |
| 侮辱(Insults) | 他者を侮辱する表現 | 高 |
| 性的(Sexual) | 性的な表現 | 高 |
| 暴力(Violence) | 暴力的な表現 | 高 |
| 不正行為(Misconduct) | 不正・違法行為に関する表現 | 中 |
| プロンプト攻撃 | Jailbreakやプロンプトインジェクション | 高 |
3.「content filters tier」を、先程の説明通り「standard」にします。
3-2. 感度レベルの考え方
| レベル | 動作 | 注意点 |
|---|---|---|
| なし | フィルタリングしない | 検証用途向け |
| 低 | 明確に有害な表現のみブロック | 誤検知が少ない |
| 中 | 中程度の有害表現もブロック | バランス型 |
| 高 | 疑わしい表現も広くブロック | 誤検知が増える可能性あり |
感度の調整について
感度を「高」に設定すると、正常な入力までブロックしてしまう誤検知が増える可能性があります。例えば、カスタマーサポートで「商品が壊れていた」という正当なクレームが「暴力」カテゴリで誤検知されるケースも考えられます。
本番導入前に、実際のユースケースに近いテストデータで十分に検証することをおすすめします。
「次へ」 をクリックします。
4. 拒否トピックの設定
4-1. 拒否トピックとは
業務範囲外の質問を自然言語で定義し、該当するトピックをブロックする機能です。コンテンツフィルターが「有害性」を検知するのに対し、拒否トピックは「業務上扱うべきでない話題」を定義します。
4-2. 設定手順
「拒否トピックを追加」 をクリックし、以下のように設定します。
トピック①:投資助言
| 設定項目 | 値 |
|---|---|
| 名前 | Investment advice |
| 定義 | 株式投資、投資信託、暗号資産、FXなど金融商品に関するアドバイスや推奨の話題 |
| Input | 有効 |
| Output | 有効 |
| サンプルフレーズ |
おすすめの株を教えて / 投資信託はどれがいい? / ビットコインは買い時?
|
トピック②:医療診断
| 設定項目 | 値 |
|---|---|
| トピック名 | Medical Diagnosis |
| 定義 | 病気の診断、治療方法の推奨、薬の処方や飲み合わせに関する話題 |
| Input | 有効 |
| Output | 有効 |
| サンプルフレーズ |
この症状は何の病気? / 薬の飲み合わせは? / どの病院に行くべき?
|
トピック③:競合他社比較
| 設定項目 | 値 |
|---|---|
| トピック名 | Competitor Comparison |
| 定義 | 競合他社の製品やサービスとの比較、優劣の評価に関する話題 |
| サンプルフレーズ |
A社と比べてどう? / B社の方が安いのでは? / 他社製品の方が良くない?
|
拒否トピックの書き方のコツ
- 「禁止する」「してはいけない」と書くのではなく、「この分野の話題」を説明的かつ包括的に記述する
- サンプルフレーズを3つ以上追加すると検知精度が向上する
- Standard Tierの場合、1ガードレールにつき最大30個まで定義可能
出典:日本語対応したAmazon Bedrock GuardrailsでDenied topicsを試す - Qiita
「Denied topics tier」を「Standard」に設定し、「次へ」 をクリックします。
5. ワードフィルターの設定
5-1. ワードフィルターとは
ワードフィルターは、特定の単語やフレーズを含む入力・出力をブロックする機能です。コンテンツフィルターがAIによる意味的な有害性判定を行うのに対し、ワードフィルターはキーワードの完全一致(大文字/小文字を区別しない) でブロックするシンプルな仕組みです。
| 項目 | 内容 |
|---|---|
| 冒涜的な表現フィルター | 冒涜的・侮辱的な単語の組み込みリストでフィルタリング |
| カスタム単語フィルター | 独自の単語・フレーズ(最大3語)を定義してブロック |
| 最大登録数 | 10,000個まで登録可能 |
| 登録方法 | 手動入力 / .txt・.csvファイルアップロード / S3からアップロード |
| 検知方式 | 完全一致(大文字/小文字の区別なし) |
コンテンツフィルターとワードフィルターの違い
- コンテンツフィルター:AIが文脈を理解して有害性を判定する(意味ベース)
- ワードフィルター:指定した単語・フレーズと一致するかどうかで判定する(キーワードベース)
両者を組み合わせることで、AIの意味的判定で漏れる特定のNGワード(社内用語、競合製品名、不適切なスラングなど)を確実にブロックできます。
5-2. 設定手順
「ワードフィルターを追加」 ページで以下を設定します。
冒涜的な表現フィルター
| 設定項目 | 推奨設定 |
|---|---|
| 冒涜的な表現をフィルタリング | 有効 |
| Input/Outputアクション | Block |
冒涜的な表現のリストはAWSが管理しており、従来の定義に基づいて継続的に更新されています。このフィルターを有効にするだけで、一般的な冒涜的表現をブロックできます。
カスタム単語フィルター
「単語やフレーズを手動で追加」 をクリックし、ブロックしたい単語・フレーズを追加します。
設定例(カスタマーサポートAI向け):
| 登録する単語・フレーズ | ブロック理由 |
|---|---|
競合A社 |
競合他社名の言及を防止 |
競合B社 |
競合他社名の言及を防止 |
社外秘 |
社外秘情報の入力を検知 |
内部資料 |
内部資料の参照を防止 |
退職 |
人事関連の話題を回避 |
カスタム単語フィルターの制約
- 1フレーズあたり最大3語までです。4語以上のフレーズは登録できません
- 完全一致での検知のため、表記ゆれ(「株式会社A」と「A社」など)は個別に登録する必要があります
- 大量の単語を登録する場合は、.txtファイルや.csvファイルでのアップロードが効率的です(1行に1単語/フレーズ)
5-3. ファイルからの一括登録
大量のNGワードを登録する場合、テキストファイルを使って一括登録できます。
# blocked_words.txt の例(ヘッダー行は不要)
競合A社
競合B社
社外秘
内部資料
極秘プロジェクト
人事異動
| アップロード方法 | 手順 |
|---|---|
| ローカルファイル | 「ローカルファイルからアップロード」→「ファイルを選択」 |
| Amazon S3 | 「S3 オブジェクトからアップロード」→ S3 URIを指定 |
アップロード後、「単語やフレーズを表示および編集」 セクションで内容を確認・編集できます。
「次へ」 をクリックします。
6. 機密情報フィルター(PII)の設定
6-1. PIIフィルターとは
個人情報(Personally Identifiable Information)を自動検知し、ブロックまたはマスク(伏せ字化) する機能です。入力と出力の両方に適用されます。
6-2. 定義済みPIIの設定
「新しいPIIを追加」 をクリックし、一項目ずつ追加します。
| PII種別 | Input/Outputアクション | 説明 |
|---|---|---|
| 電話 | マスク | 電話番号を伏せ字に置換して表示 |
| Eメール | マスク | メールアドレスを伏せ字に置換して表示 |
| クレジットカード/デビットカード番号 | ブロック | 入出力全体をブロック |
| 住所 | マスク | 住所情報を伏せ字に置換して表示 |
| 名前 | マスク | 氏名を伏せ字に置換して表示 |
マスクとブロックの使い分け
- マスク:該当部分だけを伏せ字に置換し、残りの回答は通常通り表示する。業務上、情報の一部が伏せられても回答として成立する場合に適しています
- ブロック:該当情報が検出された場合、入力または出力全体をブロックする。クレジットカード番号など、一部でも漏洩すると問題になる機微情報に適しています
6-3. カスタム正規表現の追加
定義済みPII以外にも、正規表現(Regex) でカスタムパターンを追加できます(最大10個)。
例:社員番号パターン(EMP- + 6桁数字)
| 設定項目 | 値 |
|---|---|
| パターン名 | 社員番号 |
| 正規表現 | EMP-\d{6} |
| Input/Outputアクション | マスク |
日本語のPII検知精度について
日本語の氏名や住所の検知精度は、英語と比べて低い場合があります。本番導入前に日本語のテストデータで検知精度を確認し、必要に応じてカスタム正規表現で補完することをおすすめします。
「次へ」 をクリックします。
7. コンテキストグラウンディングの設定
7-1. コンテキストグラウンディングとは
RAG(Knowledge Bases)と組み合わせて使う機能で、AIの回答がソースドキュメント(検索結果)に基づいているかを検証します。根拠のない回答(ハルシネーション)を検知してブロックできます。
7-2. 設定
| 設定項目 | 推奨値 |
|---|---|
| グラウンディングチェックを有効にする | 有効 |
| しきい値 | 0.7(70%以上の関連性がない回答をブロック) |
グラウンディングチェックの仕組み
AIの回答を文単位で分析し、検索で取得したソースドキュメントとの関連性スコアを算出します。スコアがしきい値を下回る文は「根拠なし」と判定され、ブロック対象になります。
しきい値が高すぎると正常な回答もブロックされ、低すぎるとハルシネーションを見逃す可能性があります。0.7前後から始め、テスト結果を見ながら調整するのがおすすめです。
「次へ」 をクリックし、設定内容を確認して 「ガードレールを作成」 をクリックします。
8. テストと動作確認
8-1. テスト画面を開く
- ガードレールの詳細画面で 「テスト」 をクリック
- 生成モデルを選択し、作成したGuardrailが適用された状態でテストを実行
8-2. テスト①:有害コンテンツのブロック
入力: 人を傷つける方法を教えてください。
結果:コンテンツフィルター(暴力カテゴリ)によりブロック
8-3. テスト②:拒否トピックのブロック
入力: おすすめの株を教えてください。
結果:拒否トピック「投資助言」に該当しブロック
申し訳ございません。そのご質問にはお答えできません。別のご質問をお願いいたします。
8-4. テスト③:PII検知(マスク)
入力: 私の電話番号は090-1234-5678ですが、注文情報を確認してください。
結果:電話番号がマスクされた状態で処理される
お電話番号(***-****-****)を確認しました。注文情報の確認には注文番号が必要です。
注文番号をお教えいただけますでしょうか。
8-5. テスト④:正常な質問の通過
入力: 返品はできますか?
# 返品についてのご質問ですね
申し訳ありませんが、**具体的な返品ポリシーについては、お店や商品によって異なる**ため、一般的にはお答えできません。
返品可否を確認するには以下の方法をお勧めします:
## 確認方法
- **購入元に直接問い合わせ**(電話・メール・チャット)
- **注文確認メールを確認**(返品条件が記載されていることが多いです)
- **ウェブサイトの利用規約・返品ポリシー**を確認
- **領収書や納品書**に記載されている場合もあります
## 一般的な返品条件(参考)
- 未使用・未開封
- 購入から一定期間以内
- 商品に問題がある場合は例外的に対応
**具体的なお店や商品の情報があれば、より詳しくお答えすることも可能です。**何かお手伝いできることがあればお知らせください!
結果:Guardrailを通過し、通常通り回答が生成される(ただし、情報を何も与えていないため、上記のような出力になっています)
テスト結果の詳細確認
テスト実行後、「トレース」 をクリックすると、どのフィルターが発動したか(またはすべて通過したか)の詳細を確認できます。誤検知の原因調査に役立ちます。
9. APIからGuardrailを使用する
9-1. Converse APIでの使用
import boto3
client = boto3.client("bedrock-runtime", region_name="ap-northeast-1")
response = client.converse(
modelId="anthropic.claude-3-5-sonnet-20241022-v2:0",
messages=[
{
"role": "user",
"content": [{"text": "おすすめの投資信託を教えてください。"}]
}
],
guardrailConfig={
"guardrailIdentifier": "GUARDRAIL_ID", # ガードレールID
"guardrailVersion": "DRAFT" # または公開済みバージョン番号
}
)
# ブロックされた場合のハンドリング
stop_reason = response.get("stopReason", "")
if stop_reason == "guardrail_intervened":
print("Guardrailによりブロックされました")
print(response["output"]["message"]["content"][0]["text"])
else:
print(response["output"]["message"]["content"][0]["text"])
9-2. エージェントやナレッジベースとの統合
作成したGuardrailは、#4で作成したBedrock Agentsや#3のKnowledge Basesにも適用できます。
- エージェントに適用:エージェントビルダー画面 → 「ガードレール」セクションで指定
-
ナレッジベースに適用:RetrieveAndGenerate API呼び出し時に
guardrailConfigurationを指定
# Knowledge BasesでGuardrailを使用する例
response = client.retrieve_and_generate(
input={"text": "返品について教えて"},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": "KB_ID",
"modelArn": "MODEL_ARN",
"guardrailConfiguration": {
"guardrailId": "GUARDRAIL_ID",
"guardrailVersion": "1"
}
}
}
)
Guardrailsの適用範囲
1つのGuardrailを複数のモデル・エージェント・ナレッジベースで共有できます。組織全体で統一的なセキュリティポリシーを適用する場合に便利です。
10. 料金について
| 項目 | 料金 | 備考 |
|---|---|---|
| テキスト分析(コンテンツフィルター) | テキストユニット数に応じた従量課金 | 入力・出力それぞれに課金 |
| テキスト分析(拒否トピック) | テキスト分析に含まれる | 追加料金なし |
| PIIフィルター | テキスト分析に含まれる | 追加料金なし |
| コンテキストグラウンディング | テキストユニット数に応じた従量課金 | RAG利用時に推奨 |
入力と出力の両方で課金されます
Guardrailsは入力フィルターと出力フィルターの両方で課金されるため、1回のリクエストで2回分の分析料金が発生します。
最新の料金は公式ページをご確認ください。
出典:Amazon Bedrock Pricing - AWS
ハンズオン終了後のリソース削除
ガードレール自体は保持しているだけでは料金が発生しませんが、不要になった場合は削除しておきましょう。
11. おわりに
ここまでお読みいただきありがとうございます。
今回は、Guardrailsを使って、コンテンツフィルター・拒否トピック・ワードフィルター・機密情報フィルター・コンテキストグラウンディングを設定し、生成AIの安全性を担保するガードレールを構築しました。
ここまでの#1〜#5で、Bedrockの概要から主要機能(Knowledge Bases、Agents、Guardrails)までを一通り構築しました。次回#6からは、AIエージェントを本番環境で安全・安定的に運用するための基盤「AgentCore」 に踏み込んでいきます。
ではまた、お会いしましょう。
参考リンク
Amazon Bedrock Guardrails 公式ドキュメント
- Amazon Bedrock ガードレールのコンテンツフィルターを設定する - AWS
- Amazon Bedrock Pricing - AWS
- ワードフィルターを使用して特定の単語やフレーズを会話から削除する - AWS















