Amazon Bedrock Guardrailsで拒否されたトピックと機密情報フィルターを試す
はじめに
生成AIによるチャットボットを運用する場合、特定のトピックに関する質問や回答をブロックしたい場合があります。また、RAGに関しても、社内文書など内部情報に基づいたものであっても機密情報の出力は避けたい場合があるかもしれません。
このような場合に、Amazon Bedrock Guardrailsを使用して、特定のトピックや機密情報をフィルタリングする方法を試してみました。
公式ドキュメントにあるように、Amazon Bedrock Guardrailsは2024年10月現在、英語のみをサポートしています。そのため、日本語での動作は安定しない場合がありました。
試したこと
今回は、以下の2つのシナリオを試してみました。
特定のトピックを拒否する
機密情報を拒否する
このnoteの記事は、Qiitaに書いた記事からの抜粋です。Qiitaの記事もご覧ください
1. 特定のトピックを拒否する
拒否されたトピック(Denied topics)とは:
以下のように、拒否したいトピックとそのトピックに関するサンプルプレーズを定義します。ここでは、「Amazon Bedrock」というトピックを拒否するように設定してみました。
Definition
Amazon Bedrock は、Anthropic、Cohere、Stability AI、Amazon などの大手 AI 企業の高性能な基盤モデルを単一の API を通じて選択できる、完全に管理されたサービスです。
Sample phrases
Amazon Bedrockは何に使用できますか?
Amazon Bedrockとは何ですか?
はじめに、「Bedrockを使ってRAGを構築するには、どのような方法があるか?」という質問をしたところ、プロンプト(質問)にBedrockが含まれるため回答がブロックされました。
つづいて、「AWSのリソースを使ってRAGを構築するには、どのような方法があるか?」という質問をしたところ、回答にBedrockに関する内容が含まれるため回答がブロックされました。
このように、拒否されたトピック(Denied topics)を使用すると特定のトピックに関する質問や回答をブロックすることができました。
別のトピックも試してみました。ここでは、「競馬」というトピックを拒否するように設定してみました。Definitionに記載した内容は、Wikipediaの「競馬」を参考にしました。
Definition
競馬(けいば、英: Horse racing)は、騎手が乗った馬により競われる競走競技、および、その着順を予想する賭博である。イギリスを発祥とする近代競馬は多くの国々で開催されており、その多くは勝馬投票券(馬券)の販売とセットの興行として行われている。
Sample phrases
競馬の歴史を知りたい。
競馬とは何ですか?
はじめに、「競馬の歴史を知りたい。」という質問をしたところ、プロンプトと回答に競馬が含まれるにもかかわらず、ブロックされませんでした。もう一度同じ質問をしたところ、今度はブロックされました。日本語が正式にサポートされていないためか結果が安定しないようです。
つづいて、「競馬とは何ですか?」という質問をしたところ、プロンプトと回答に競馬が含まれるにもかかわらず、ブロックされませんでした。
2. 機密情報を拒否する
Sensitive information filters(機密情報フィルター)とは:
以下のように、ブロックまたはマスクしたい機密情報を設定します。ここでは、`Add all PII types(31) with behavior: Mask`を選択してみました。
そして、あらかじめ用意した以下の項目からなるダミーの個人情報をもとに、レスポンスがマスクされるか試してみました。
名前
メールアドレス
携帯電話番号
住所(都道府県)
住所(市区町村)
年齢
職
好きなスポーツ
性別
「関東地方在住者の一覧をCSVで作成してください。」という質問をしたところ、以下のようにレスポンスがマスクされました。ただし、一部の住所(都道府県)はマスクされませんでした。また、1行目以外は年齢のカラムが欠落しています。
コードで書いてみる
以下のコードは、コマンドライン引数で入力されたテキストに対してAmazon Bedrock Guardrailsを使って回答を生成するものです。
Converse APIであればguardrailConfigを指定することでGuardrailを適用できます。
import json
import logging
import sys
import boto3
from botocore.exceptions import ClientError
logging.basicConfig(format="%(asctime)s [%(levelname)s] %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)
def get_bedrock_client():
"""Bedrock クライアントを取得する"""
return boto3.client(service_name="bedrock-runtime", region_name="us-east-1")
def generate_response(input_text: str) -> str:
"""応答を生成する"""
bedrock_client = get_bedrock_client()
messages = [{"role": "user", "content": [{"text": f"{input_text}"}]}]
modelid = "anthropic.claude-3-5-sonnet-20240620-v1:0"
inference_config = {
"temperature": 0,
"maxTokens": 500,
"topP": 0.99,
}
guardrail_id = "xxxxxxxxxxxx" # Guardrail IDを指定する
guardrail_version = "DRAFT" # Guardrail Versionを指定する
guardrail_config = {
"guardrailIdentifier": guardrail_id,
"guardrailVersion": guardrail_version,
"trace": "enabled"
}
try:
response_body = bedrock_client.converse(
messages=messages,
modelId=modelid,
inferenceConfig=inference_config,
guardrailConfig=guardrail_config
)
logger.info("Usage: %s", json.dumps(response_body['usage'], indent=2, ensure_ascii=False))
logger.info("Output: %s", json.dumps(response_body['output'], indent=2, ensure_ascii=False))
logger.info("stopReason: %s", json.dumps(response_body['stopReason'], indent=2, ensure_ascii=False))
logger.info("Trace: %s", json.dumps(response_body['trace'], indent=2, ensure_ascii=False))
return response_body['output']['message']['content'][0]['text']
except Exception as e:
logger.error("Failed to generate response: %s", e)
raise
def main():
# コマンドライン引数を取得する
if len(sys.argv) < 2:
print("Usage: python3 ./app.py <input_text>")
sys.exit(1)
input_text = sys.argv[1]
logger.info("Original query: %s", input_text)
try:
print("Final response: " f"{generate_response(input_text)}")
except ClientError as err:
message = err.response['Error']['Message']
logger.error("A client error occurred: %s", message)
if __name__ == "__main__":
main()
上記のコードを app.py というファイル名で保存し、以下のように引数にプロンプトを指定して実行します。sensitiveInformationPolicy にどの情報がマスクされたかが出力されています。Final responseが最終的な出力です。ここでは、郵便番号はADDRESSとしてマスクされましたが、それ以降の住所はそのまま出力されてしまいました。
❯ python ./app.py "IPAの連絡先を教えて。"
2024-10-12 01:03:26,897 [INFO] Original query: IPAの連絡先を教えて。
2024-10-12 01:03:26,945 [INFO] Found credentials in shared credentials file: ~/.aws/credentials
2024-10-12 01:03:35,816 [INFO] Usage: {
"inputTokens": 19,
"outputTokens": 298,
"totalTokens": 317
}
2024-10-12 01:03:35,816 [INFO] Output: {
"message": {
"role": "assistant",
"content": [
{
"text": "IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します:\n\n1. 本部所在地:\n{ADDRESS}\n東京都文京区本駒込2-28-8\n文京グリーンコートセンターオフィス\n\n2. 電話番号:\n{PHONE}\n\n3. FAX番号:\n{PHONE}\n\n4. Webサイト:\n{URL}\n\n5. 一般的な問い合わせ:\n{URL}\n(ウェブサイト上の問い合わせフォームを利用)\n\n具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。"
}
]
}
}
2024-10-12 01:03:35,816 [INFO] stopReason: "guardrail_intervened"
2024-10-12 01:03:35,817 [INFO] Trace: {
"guardrail": {
"modelOutput": [
"{\"id\":\"msg_bdrk_01V5pFDSuTMjwZRZ9LHd9w3C\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します:\\n\\n1. 本部所在地:\\n〒113-6591\\n東京都文京区本駒込2-28-8\\n文京グリーンコートセンターオフィス\\n\\n2. 電話番号:\\n03-5978-7501(代表)\\n\\n3. FAX番号:\\n03-5978-7510\\n\\n4. Webサイト:\\nhttps://www.ipa.go.jp/\\n\\n5. 一般的な問い合わせ:\\nhttps://www.ipa.go.jp/about/contact/index.html\\n(ウェブサイト上の問い合わせフォームを利用)\\n\\n具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":19,\"output_tokens\":298}}"
],
"inputAssessment": {
"qxug23uqmi11": {}
},
"outputAssessments": {
"qxug23uqmi11": [
{
"sensitiveInformationPolicy": {
"piiEntities": [
{
"match": "〒113-6591",
"type": "ADDRESS",
"action": "ANONYMIZED"
},
{
"match": "03-5978-7501(代表)",
"type": "PHONE",
"action": "ANONYMIZED"
},
{
"match": "03-5978-7510",
"type": "PHONE",
"action": "ANONYMIZED"
},
{
"match": "https://www.ipa.go.jp/",
"type": "URL",
"action": "ANONYMIZED"
},
{
"match": "https://www.ipa.go.jp/about/contact/index.html",
"type": "URL",
"action": "ANONYMIZED"
}
]
}
}
]
}
}
}
Final response: IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します:
1. 本部所在地:
{ADDRESS}
東京都文京区本駒込2-28-8
文京グリーンコートセンターオフィス
2. 電話番号:
{PHONE}
3. FAX番号:
{PHONE}
4. Webサイト:
{URL}
5. 一般的な問い合わせ:
{URL}
(ウェブサイト上の問い合わせフォームを利用)
具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。
まとめ
Amazon Bedrock Guardrailsを使って、Denied topicsとSensitive information filtersを試してみました。Guardrailsは英語のみ対応しているため、日本語の処理に弱いことは想定していましたが、英語の出力においても不安定な出力となりました。
今回は簡易なプロンプトで試しましたが、実際の業務で使用する際にはシステムプロンプトに秘匿したい情報の例を与えることで、より適切な結果を得ることができるかもしれません。
そして、日本語対応も期待したいところです。