はじめに
AWS Summit Japan 2025の初日(2025/06/25)にAmazon Bedrock Guardrailsの日本語対応が発表されました。このアップデートでは、Standard Tier を選択することでコンテンツフィルターと拒否トピックについて日本語を含む 60 以上の言語を利用できるようになりました。従来のGuardrailsは Classic Tierに分類され、サポートする言語や機能に変更はないようです。
2025/04/21ごろ、以下のアナウンスがあり2025/04/30にGuardrailsが日本語を含む4つの言語に新たに対応すると発表されました。しかし、何らかの重大な不具合があったらしく、リリース直後に取り下げられました。
On April 30, 2025, Amazon Bedrock Guardrails will be updated to support 4 additional languages including German, Italian, Japanese and Korean.
今回、対応言語が増え正式にリリースされたので、Guardrailsの日本語対応について試してみます。
Amazon Bedrock Guardrailsとは
Amazon Bedrock Guardrailsは、望ましくない有害なコンテンツを回避し、プライバシー保護のために機密情報を削除またはマスクするように設定できる以下のフィルタリングポリシーを提供する仕組みです。グラウンドチェックは、モデルの出力が情報ソースに基づいて適切であるかどうかやユーザーの入力に関連するものであるかをフィルタリングできるため、ハルシネーションの検出に使用できます。
Standard Tierでは、誤字や表記揺れを含むコンテンツもフィルタリングできるようになったようです。
- コンテンツフィルター
- 拒否されたトピック
- 単語フィルター (日本語非対応)
- 機密情報フィルター
- コンテキストのグラウンドチェック (日本語非対応)
機能ごとの言語サポート状況は、Languages supported by Amazon Bedrock Guardrails で確認できます。
参考情報
Guardrailを作成する
Denied Topics(拒否トピック)を作成する
以前、以下の記事でGuardrailsのDenied Topicsを作成しました。このときはまだ日本語がサポートされていなかったので、期待したとおりの動作にはなりませんでした。今回、同じ内容でDenied Topics(拒否トピック)を作成し、日本語でもフィルタリングできることを確認します。
Amazon Bedrock のコンソールメニューから Guardrails を選択し、Create guardrail を選択します。
Step 1: Provide guardrail details では、以下のように入力します。デフォルトでは、プロンプトとレスポンスに対するブロックメッセージは同じものが使われますが、それぞれ異なるメッセージを指定することもできます。ここでは、どちら側でブロックされたのかが分かるように、
Apply the same blocked message for responses のチェックを外し異なるメッセージを指定しています。
項目名 | 入力内容 |
---|---|
Name(任意の名称) | DeniedTopicTest |
Description(任意の説明) | Denied Topics を英語と日本語でそれぞれ試す。 |
Messaging for blocked prompts (Guardrailがユーザープロンプトをブロックする場合に表示するメッセージ) | その質問には回答できません。 |
Messaging for blocked responses (Guardrailがモデルの応答をブロックする場合に表示するメッセージ) | 回答に拒否トピックが含まれるため回答できません。 |
Enable cross-Region inference for your guardrail (クロスリージョン推論を有効にする。Standard Tierの場合は必須) | ✅ |
Choose guardrail profile (使用するクロスリージョン推論プロファイル) | APAC Guardrail v1:0 |
クロスリージョン推論プロファイルによる推論が行われるリージョンは、Guardrailsを作成するリージョンにより決定します。東京リージョン(ap-northeast-1)でGuardrailsを作成した場合、以下のAPACリージョンに推論処理が分散されます。詳しくは、Supported Regions for cross-Region guardrail inferenceを参照してください。
クロスリージョン推論プロファイルを利用するには、これらのリージョンでBedrockが利用可能となっている必要があります。
- ap-south-1 (ムンバイ)
- ap-northeast-1 (東京)
- ap-northeast-2 (ソウル)
- ap-northeast-3 (大阪)
- ap-southeast-1 (シンガポール)
- ap-southeast-2 (シドニー)
Step 2: Configure content filters は入力をスキップします。
Step 3: Add denied topics では、以下のように Denied Topics を追加します。
項目名 | 入力内容 |
---|---|
Name (任意の名称) | 拒否トピックの名前を入力します。 |
Definition (任意の説明) | 拒否トピックの説明を入力します。 |
Input (ユーザープロンプトに対してブロックもしくは検出のみのどちらを行うか) | Block |
Output (モデルの応答に対してブロックもしくは検出のみのどちらを行うか) | Block |
Add sample phrases (サンプルフレーズを追加する) | Amazon Bedrockは何に使用できますか? / Amazon Bedrockとは何ですか? |
以下のステップは入力をスキップします。
Step 4: Add word filters
Step 5: Add sensitive information filters
Step 6: Add contextual grounding check
試してみる
日本語で質問する
モデルは Amazon Nova Proを使用します。
日本語で質問してみます。
AWSのリソースを使ってRAGを構築するには、どのような方法があるか?
という質問に対し、回答(Model response)にBedrockが含まれるため回答がブロックされました。そして、Final responseには、Guardrails構築時にMessaging for blocked responsesの項目で設定した回答に拒否トピックが含まれるため回答できません。
というメッセージが表示されました。
Bedrockを使ってRAGを構築するには、どのような方法があるか?
という質問に対し、プロンプト(Prompt)にBedrockが含まれるため回答がブロックされました。そして、Final responseには、Guardrails構築時にMessaging for blocked promptsの項目で設定したその質問には回答できません。
というメッセージが表示されました。
たまに、 このようなエラーが発生します。なぜか、選択できないはずのオンデマンドプロファイルに勝手に切り替わってしまうようです。この場合は、再度モデルを選択してください。
Invocation of model ID amazon.nova-pro-v1:0 with on-demand throughput isn’t supported. Retry your request with the ID or ARN of an inference profile that contains this model.
別の拒否トピックを追加する
以前の記事では、Guardrailsが日本語未対応だったこともあり、拒否トピックをすり抜けることがありました。その時と同じ拒否トピックを作成し、日本語でもフィルタリングできることを確認します。
さきほど作成したGuardrailsをWorking Draftから選択します。
Add denied topic
をクリックし、拒否トピックを作成します。
以下の内容で拒否トピックを作成します。Definitionの内容はWikipediaを参考にしました。
項目名 | 入力内容 |
---|---|
Name (任意の名称) | Horse racing |
Definition (任意の説明) | 競馬(けいば、英: Horse racing)は、騎手が乗った馬により競われる競走競技、および、その着順を予想する賭博である。イギリスを発祥とする近代競馬は多くの国々で開催されており、その多くは勝馬投票券(馬券)の販売とセットの興行として行われている。 |
Input (ユーザープロンプトに対してブロックもしくは検出のどちらを行うか) | Block |
Output (モデルの応答に対してブロックもしくは検出のどちらを行うか) | Block |
Add sample phrases (サンプルフレーズを追加する) | 競馬の歴史を知りたい。 /競馬とは何ですか? |
拒否トピックが一覧に追加されました。Save and exit
をクリックします。
日本語で質問する
さきほどと同じく、モデルは Amazon Nova Proを使用します。
日本語で質問してみます。
競馬の歴史を知りたい。
という質問に対し、プロンプト(Prompt)に競馬が含まれるため回答がブロックされました。
競馬とは何ですか?
という質問に対し、プロンプト(Prompt)に競馬が含まれるため回答がブロックされました。
以前の記事では、このふたつの質問に対して拒否トピックをすり抜けていましたが、今回はブロックされました。
単純に、好きな馬を教えて。
と馬について質問したところ、これもブロックされました。どうやら、馬
に関連する質問に対して過剰に反応しているようです。この場合は、単語フィルターを利用することで、このような質問に対してもブロックできると思われますが、残念ながら日本語非対応です。
コードで書いてみる
以下のコードは、コマンドライン引数で入力されたテキストに対して、Amazon Bedrock Guardrailsを使って回答を生成するものです。
Converse APIであれば、guardrailConfigを指定することでGuardrailを適用できます。
app.py
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="ap-northeast-1")
def generate_response(input_text: str) -> str:
"""応答を生成する"""
bedrock_client = get_bedrock_client()
messages = [{"role": "user", "content": [{"text": f" {input_text}"}]}]
modelid = "apac.anthropic.claude-sonnet-4-20250514-v1:0"
inference_config = {
"temperature": 0,
"maxTokens": 500,
"topP": 0.99,
}
guardrail_id = "**********" # 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 ./guardrails.py ")
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()
実行結果は以下の通りです。
python3 ./guardrails.py "Bedrockを使ってRAGを構築するには、どのような方法があるか?"
2025-07-11 02:49:33,366 [INFO] Original query: Bedrockを使ってRAGを構築するには、どのような方法があるか?
2025-07-11 02:49:33,393 [INFO] Found credentials in shared credentials file: ~/.aws/credentials
2025-07-11 02:49:34,421 [INFO] Usage: {
"inputTokens": 0,
"outputTokens": 0,
"totalTokens": 0
}
2025-07-11 02:49:34,422 [INFO] Output: {
"message": {
"role": "assistant",
"content": [
{
"text": "その質問には回答できません。"
}
]
}
}
2025-07-11 02:49:34,422 [INFO] stopReason: "guardrail_intervened"
2025-07-11 02:49:34,422 [INFO] Trace: {
"guardrail": {
"modelOutput": [],
"inputAssessment": {
"iwzzw1ytax08": {
"topicPolicy": {
"topics": [
{
"name": "About Bedrock",
"type": "DENY",
"action": "BLOCKED"
}
]
},
"invocationMetrics": {
"guardrailProcessingLatency": 371,
"usage": {
"topicPolicyUnits": 1,
"contentPolicyUnits": 0,
"wordPolicyUnits": 0,
"sensitiveInformationPolicyUnits": 0,
"sensitiveInformationPolicyFreeUnits": 0,
"contextualGroundingPolicyUnits": 0
},
"guardrailCoverage": {
"textCharacters": {
"guarded": 47,
"total": 47
}
}
}
}
}
}
}
Final response: その質問には回答できません。
まとめ
日本語に対応したGuardrailsの拒否トピックを作成し、日本語でもフィルタリングできることを確認しました。以前の記事では、Guardrailsが日本語未対応だったこともあり、拒否トピックをすり抜けることがありました。今回は、Guardrailsが日本語に対応したことで、このような質問に対してもブロックされるようになりました。しかし、設定した拒否トピックに過剰に反応しているのか、拒否すべきでないプロンプトに対しても拒否トピックが適用されました。
拒否トピックの定義の問題なのか、Guardrailsの設定の問題なのか、それとも、モデルの問題なのか、まだまだ課題が残っているようです。
GuardrailsはConverse APIでも利用でき、そのレスポンスはJSON形式で返ってきます。このJSONを解析することで、Guardrailsがどのような挙動を示すのか知ることができます。
Views: 0