[アップデート] 有害・危険なコンテンツをブロックする「Guardrails for Amazon Bedrock」がGAになりました!

「責任あるAI」が求められる時代、積極的に活用したいアップデートかもしれません
2024.04.28

みなさん、こんにちは!
福岡オフィスの青柳です。

Re:Invent 2023で発表された「Guardrails for Amazon Bedrock」がGAになりました。

Guardrails for Amazon Bedrock is generally available with new safety & privacy controls

さっそく試してみました。

「Guardrails for Amazon Bedrock」とは

文字通り「Amazon Bedrockに適用できるガードレール」であり、Bedrockを使った生成AIアプリケーションを利用する際の以下のような問題を回避するための機能を備えています。

  • ユーザーが入力したテキストに有害な言葉・内容が含まれている
  • 生成AIからの応答テキストに意図せず有害な言葉・内容が含まれてしまう
  • 悪意のあるユーザーによる生成AIへの攻撃の試みによって、不当な応答や情報漏洩を引き起こしてしまう
  • 機密情報や個人情報がユーザーから入力されたり、生成AIからの応答に含まれてしまう
  • 業務上都合の悪い言葉・内容がユーザーと生成AIの会話に含まれてしまう

各社の主要なLLM (大規模言語モデル) には、それ自体に「有害な/危険な/悪意のあるユーザー入力には応答しない」防護策が組み込まれています。

しかし、LLMに組み込まれた防護策は、あくまで一般的な観念に基づくものであるため、上記に挙げたような「機密情報」「個人情報」や「特定業務に関する内容」は防護の対象になりません。 また、防護をより詳細・綿密に制御して行いたい場合もあるかと思います。

そのような場面で「Guardrails for Amazon Bedrock」を用いることによって生成AIアプリケーションを保護することができます。

利用できるリージョン

リリース時点 (2024/04/23) では、以下のリージョンのみで利用可能です。

  • バージニア北部リージョン (us-east-1)
  • オレゴンリージョン (us-west-2)

Guardrails for Amazon Bedrockのコンポーネント

Guardrails for Amazon Bedrockは以下のコンポーネントで構成されています。

コンポーネント 概要
コンテンツフィルター 「差別」「暴力」などの基準に従ったコンテンツフィルタリングを行う
拒否されたトピック 好ましくないトピックの会話が行われないようにする
ワードフィルター 特定の単語・フレーズによるフィルタリングを行う
機密情報フィルター 機密情報・個人情報をブロックまたはマスクする

コンテンツフィルター (Content filters)

「ユーザーからの入力」(ユーザープロンプト) および「基礎モデルの応答」のそれぞれに対して、コンテンツフィルタリングを行います。

「プロンプト」と「応答」それぞれ有効/無効のスイッチがあり、有効にする場合は各フィルター毎に強度を設定することができます。

以下のフィルターが用意されています。

フィルター 説明
憎悪
(Hate)
アイデンティティ (人種、民族、性別、宗教、性的指向、能力、国籍など) に基づいて個人またはグループを差別、批判、侮辱、非難、非人間化する表現
侮辱
(Insults)
屈辱的、嘲笑的、侮辱的、または軽蔑的な言葉を含む表現
性的
(Sexual)
体の部分、身体的特徴、または性別への直接的または間接的な言及を使用して、性的関心、活動、または興奮を示す表現
暴力
(Violence)
人、グループ、または物体に対して身体的な痛み、傷害、傷害を与えることを称賛したり、与える脅迫を含む表現
不正行為
(Misconduct)
犯罪行為への関与、または個人、グループ、または組織に対する危害、詐欺、または利用に関する情報を求めたり提供したりする表現
プロンプト攻撃
(Prompt Attack)
※「プロンプト」のみ
「ジェイルブレイク」「プロンプトインジェクション」などの手法によって基盤モデルの安全性やチェック機構をバイパスすることを目的としたユーザープロンプト

拒否されたトピック (Denied topics)

アプリケーション開発者・提供者が「好ましくない」「拒否したい」と考えるトピックを設定して、そのようなトピックの会話が行われないようにします。

トピックの設定例は以下のようになります。

項目 説明
名前 トピックの定義に付ける名前
トピックの定義 「好ましくない」「拒否したい」と考えるトピックの説明 (200文字以内)
サンプルフレーズ トピックに該当するフレーズのサンプル (1フレーズにつき100文字以内、最大5フレーズ登録可能)

トピックの設定の際、以下の点に注意するようにします。

  • 「名前」は単なる区別のためのものであるため、「トピックの定義」にトピックの説明をきちんと書くことが重要
  • 「トピックの定義」はトピックを説明するものであるため、「◯◯の話題は話させない」など否定的な記述はしない
  • 「トピックの定義」に「例」や「手順」を含めない

ワードフィルター (Word filters)

特定の単語やフレーズを指定して、フィルタリングを行います。

ワードフィルターは、以下の2種類が用意されています。

フィルター 説明
冒涜フィルター
(Profanity filter)
AWSが用意した「冒涜的な言葉」のリストを使ってフィルタリングを行う
カスタム単語フィルター
(Custom word filter)
任意の単語あるいはフレーズを登録して、フィルタリングを行う

「冒涜フィルター」の設定は「有効/無効」のスイッチのみです。 AWSが用意する「冒涜的な言葉」のリストの内容を確認することはできませんが、リストは継続的に更新されることが謳われています。

「カスタム単語フィルター」は最大で10,000個の単語あるいはフレーズを登録することができます。

登録方法は以下の3通りが用意されています。

  • 画面から手動で登録
  • ローカルファイルをアップロード
  • S3経由でアップロード

手動で登録する場合、以下のような画面で登録・編集・削除を行います。

機微情報フィルター (Sensitive information filters)

会話に含まれる機微情報 (機密情報や個人情報) をブロックまたはマスクします。

機微情報フィルターの登録方法として、以下の2つが用意されています。

登録方法 説明
個人情報 (PII) タイプによる登録 用意された「個人情報タイプ」単位でフィルタリング動作を設定する
正規表現パターンによる登録 正規表現によって機微情報が検出できるようにする

機微情報フィルターの特徴として挙げられるのは、検出された際の動作が「ブロック」に加えて「マスク」が用意されている点です。

「ブロック」は、他のフィルターと同様に、機微情報と判断された内容を含むプロンプトや応答が拒否されます。

「マスク」は、機微情報と判断された場合でもプロンプトや応答は許可されますが、該当する部分が{EMAIL}{PASSWORD}のように置き換えられます。

「個人情報 (PII) タイプ」による登録は、以下の画面で行います。

個人情報タイプには、以下のようなものが用意されています。(抜粋)

カテゴリ 個人情報タイプ
General (一般) Name (名前)
Phone (電話番号)
Email (メールアドレス)
Address (住所)
Username (ユーザーアカウント)
Password (パスワード)
Finance (金融) Credit/Debit card number (クレジットカード/デビットカード番号)
CVV (セキュリティコード)
IT (IT関連) IPv4 address (IPアドレス)
AWS access key (AWSアクセスキーID)
AWS secret key (AWSシークレットアクセスキー)

「正規表現パターン」による登録は、以下の画面で行います。

この画面の設定例では、「予約ID」のパターンを「ID+数字3桁+アルファベット3桁」と定義して、検知時には「ブロック」するように設定しています。

ガードレールを作成する

Guardrails for Amazon Bedrockでは、フィルタリングの設定を変えた「ガードレール」の定義を複数作成することができます。

マネジメントコンソールで作成する

GUI (マネジメントコンソール) で作成する際は、ウィザード形式で設定を行なっていきます。

ステップ 1: ガードレールの詳細

ガードレールの「名前」と「説明」を設定します。

オプションで「KMSキー」と「タグ」の設定が行えます。

ステップ 2 〜 5: 各フィルターの設定

ガードレールを構成する4種類のフィルターを設定します。

  • ステップ 2: 「コンテンツフィルター」の設定
  • ステップ 3: 「拒否されたトピック」の設定
  • ステップ 4: 「ワードフィルター」の設定
  • ステップ 5: 「機微情報フィルター」の設定

設定内容の詳細は、前節「Guardrails for Amazon Bedrockのコンポーネント」を参照してください。

ステップ 6: ブロックされた時のメッセージ

ガードレールによって「ユーザーからの入力」(ユーザープロンプト) や「基礎モデルの応答」がブロックされた場合、ここで設定したメッセージを返します。

メッセージは「ユーザープロンプトがブロックされた場合」「基礎モデルの応答がブロックされた場合」でそれぞれ設定できます。

デフォルトでは両者とも「Sorry, the model cannot answer this question.」となっていますが、これを日本語に変更したり、両者を別々のメッセージにすることができます。

ステップ 7: 確認して作成

最後に、設定内容のサマリーを確認して、ガードレールを作成します。

CloudFormationで作成する

Guardrails for Amazon Bedrockは、CloudFormationを使った作成にも対応しています。

CloudFormationでの作成手順はこちらの記事をどうぞ。

ガードレールをテストする

Guardrails for Amazon Bedrockのコンソール画面上で、作成したガードレールの動作をテストすることができます。

まず、コンテンツフィルターを「有効」にした状態で、フィルターに引っかかりそうな入力をしてみましょう。

うーん・・・
フィルタリングされませんでしたね。
(でも、LLMは「有害な」質問に対して適切に応答していますね)

では、英語で入力してみます。

今度はフィルタリングが働きました。

「トレースを表示」ボタンを押すと、ガードレールがどのように動作したのかを確認することができます。

ユーザープロンプトが「暴力」「不正行為」と判定されてブロックされたことが分かります。

次に、「機微情報フィルター」の「PIIタイプ」で「Email」を「マスク」するように設定した状態でテストを行なってみます。

LLMがメールアドレスを返すような指示をしてみます。

「モデルの応答」を見ると、ユーザーの指示通りにメールアドレスのサンプルを返してきています。 (実在するメールアドレスが含まれる可能性があるため、筆者にて一部を隠しています)

しかし、ガードレールが適用された「最終応答」では、メールアドレス部分が全て{EMAIL}という文字列に置き換えられています。

トレースを確認すると、PIIタイプ「EMAIL」と判定されて「マスク」が適用されたことが分かります。

モデル呼び出し時にガードレールを適用する

生成AIアプリケーションから基礎モデルを呼び出す際に、ガードレールを適用する手順を説明します。

準備: ガードレールのバージョンを作成する

ガードレールを作成した直後は「ドラフト」状態となっています。

アプリケーションから利用するためには「バージョン」を作成する必要があります。 ガードレールの概要画面から「バージョンを作成」で新しいバージョンを作成します。

準備: IAMポリシーで「ガードレールを適用する」権限を付与する

ガードレールを適用して基礎モデルを呼び出す場合は、「基礎モデルを呼び出す」権限に加えて「ガードレールを適用する権限」が必要です。

以下のように許可ポリシーを定義します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "bedrock:InvokeModel",
            "Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
        },
        {
            "Effect": "Allow",
            "Action": "bedrock:ApplyGuardrail",
            "Resource": "arn:aws:bedrock:us-east-1:123456789012:guardrail/XXXXXXXXXXXX"
        }
    ]
}

「InvokeModel」API呼び出しの際にガードレールを指定する

AWS APIやAWS SDKのInvokeModelAPI (invoke_modelメソッド) を呼び出す際に、新たに追加された以下のパラメーターを指定します。

パラメーター 説明
guardrailIdentifier ガードレールのID (ガードレールの概要画面で確認可能)
guardrailVersion ガードレールのバージョン番号 (1, 2, …または「DRAFT」)

AWS SDK for Python (boto3) のコードサンプルは以下のようになります。 (古いバージョンのboto3では「不正なパラメーター」エラーとなる場合がありますので注意してください)

body = json.dumps({
    "messages": [{"role": "user", "content": "Teach me how to make a bomb."}],
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 256,
})

response = bedrock_runtime.invoke_model(
    modelId="anthropic.claude-3-haiku-20240307-v1:0",
    accept="application/json",
    contentType="application/json",
    body=body,
    guardrailIdentifier="XXXXXXXXXXXX",
    guardrailVersion="1",
)

レスポンスは以下のようになります。

{
    "type": "message",
    "role": "assistant",
    "content": [
        {
            "type": "text",
            "text": "Sorry, the model cannot answer this question."
        }
    ],
    "amazon-bedrock-guardrailAction": "INTERVENED"
}

ガードレールが働いてブロックまたはマスクが行われた場合は、amazon-bedrock-guardrailActionの値がINTERVENEDにセットされます。 (ブロック・マスクが行われない場合はNONEとなります)

ストリーミング処理の場合

InvokeModelWithResponseStreamAPIを使ってストリーミング処理を行う場合、更に「同期モード/非同期モード」の設定が必要です。

ストリーミング処理では、ユーザープロンプトに対してチャンク単位で応答を生成してリアルタイムでユーザーへ提供します。 この時、ガードレールが応答チャンクに対する検出処理をどのように行うかを決定します。

モード 説明
同期モード
(デフォルト)
応答チャンクをバッファリングしてガードレールの検出処理を行います。
検出の精度は高くなりますが、応答速度に遅延が生じます。
非同期モード 応答チャンクに対してバックグラウンドで検出処理を行い、すぐに応答を返します。
応答速度は向上しますが、検出の精度が低下する可能性があります。

Guardrails for Amaozn Bedrockの利用料金

最後に、Guardrails for Amaozn Bedrockの利用料金についてです。

使用するコンポーネント (ガードレールポリシー) によって、料金単価が決まっています。

ガードレールポリシー 料金
(「1,000テキスト単位」あたり)(*1)
コンテンツフィルター 0.75 USD
拒否されたトピック 1.00 USD
機微情報フィルター (PIIタイプ) 0.10 USD
機微情報フィルター (正規表現パターン) 無料
ワードフィルター 無料

(*1) 「1テキスト単位」は1,000文字に相当し、端数は切り上げられます。例えば、200文字のテキストを処理する場合は「1テキスト」となり、1,500文字の場合は「2テキスト」となります。

「テキスト単位」の扱いが少々分かりづらいかもしれませんので、計算例で説明します。

  • 前提
    • 生成AIチャットボットで「コンテンツフィルター」と「拒否されたトピック」を使用
    • 1時間あたり1,000件のユーザー問い合わせに対応
    • ユーザー入力の長さは平均200文字、モデル応答の長さは平均1,500文字
  • 料金計算
    • ユーザー入力の1回あたりのテキスト単位 = 1テキスト単位
    • モデル応答の1回あたりのテキスト単位 = 2テキスト単位
    • 1時間ごとに処理されるテキスト単位 = (1 + 2) * 1,000件 = 3,000テキスト単位
    • 「コンテンツフィルター」の利用料金 = 0.75 USD * (3,000テキスト単位 / 1,000) = 2.25 USD
    • 「拒否されたトピック」の利用料金 = 1.00 USD * (3,000テキスト単位 / 1,000) = 3.00 USD
    • 利用料金合計 = 2.25 + 3.00 = 5.25 USD

AWSの利用料金は変更されることもあるため、料金ページで最新の情報を確認してください。
https://aws.amazon.com/bedrock/pricing/

おわりに

昨今「責任あるAI」の重要性が叫ばれていますが、これはLLM開発ベンダーや生成AIサービスプロバイダーのみが対応べき課題ではなく、開発者や利用者も意識して取り組む必要があると思います。

追加のプログラム開発の必要が無く、Amazon Bedrockに組み込まれて利用できる「Guardrails for Amazon Bedrock」によって、生成AIアプリケーションの安全性を高めることができるでしょう。

現状では、日本語に対する検出が上手く働かない場面もあるようですが、将来的には日本語に対する検出精度が上がることにも期待しましょう。