生成 AI モデル/アプリケーションを AI Red Teaming Agent で評価する
目的(Objective)
このノートブックでは Azure AI Evaluation に含まれる AI Red Teaming Agent 機能を使い、生成 AI システムを悪意あるプロンプト攻撃(Adversarial Prompt)に対して安全性・耐性を評価する方法を解説します。
AI Red Teaming Agent は Microsoft AI Red Team が公開している自動 AI レッドチーミングフレームワーク PyRIT を内部で利用し、以下を組み合わせて潜在的な安全性の問題を特定します。
- リスクカテゴリ(暴力・ヘイト/不公平・性的表現・自傷行為)
- 攻撃ストラテジ(符号化・変形・JailBreak など)
- 複雑度レベル(Baseline/Easy/Moderate/Difficult)
所要時間(Time)
実行時間の目安:30〜45 分
評価対象のリスクカテゴリ、攻撃ストラテジ、複雑度レベルが多いほど時間は伸びます。
事前準備
1.前提条件
- Azure サブスクリプション
- Azure AI Hub と Azure AI Project を作成
- プライベートネットワーク/プライベートエンドポイント対応
- AI Red Teaming Agent は攻撃用モデルをホスティング済み
- ご自身で LLM をデプロイする必要はありません
- 評価結果を Azure AI Foundry にアップロードする場合
- Blob Data Contributor ロールが必要
- Azure CLI をインストールし、
az login
で認証済みであること
2.環境変数の設定
以下の環境変数をシェルまたは VS Code の settings.json
などで設定してください。
# Azure OpenAI
export AZURE_OPENAI_API_KEY="your-api-key-here"
export AZURE_OPENAI_ENDPOINT="https://endpoint-name.openai.azure.com/openai/deployments/deployment-name/chat/completions"
export AZURE_OPENAI_DEPLOYMENT_NAME="gpt-4"
export AZURE_OPENAI_API_VERSION="2024-12-01-preview"
# Azure AI Project
export AZURE_SUBSCRIPTION_ID="12345678-1234-1234-1234-123456789012"
export AZURE_RESOURCE_GROUP_NAME="your-resource-group"
export AZURE_PROJECT_NAME="your-project-name"
インストール
1. 仮想環境の作成
python -m venv .venv
環境のアクティブ化
Windows
.venv\Scripts\activate
2. 依存パッケージのインストール
pip install uv
uv pip install azure-ai-evaluation[redteam] azure-identity openai
3. VS Code を開く
code .
Tip: VS Code のカーネルに作成した .venv を指定してください。
インポート
from typing import Optional, Dict, Any
import os
# Azure
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from azure.ai.evaluation.red_team import RedTeam, RiskCategory, AttackStrategy
# OpenAI
from openai import AzureOpenAI
# 認証
credential = DefaultAzureCredential()
環境変数の読み込み
# Azure AI Project
azure_ai_project = {
"subscription_id": os.environ.get("AZURE_SUBSCRIPTION_ID"),
"resource_group_name": os.environ.get("AZURE_RESOURCE_GROUP_NAME"),
"project_name": os.environ.get("AZURE_PROJECT_NAME"),
}
# Azure OpenAI
azure_openai_endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
azure_openai_deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_NAME")
azure_openai_api_key = os.environ.get("AZURE_OPENAI_API_KEY")
azure_openai_api_version = os.environ.get("AZURE_OPENAI_API_VERSION")
AI Red Teaming Agent の機能概要
リスクカテゴリ
カテゴリ | 説明 |
---|---|
Violence | 暴力的表現 |
HateUnfairness | ヘイト・不公平表現 |
Sexual | 性的表現 |
SelfHarm | 自傷行為 |
攻撃ストラテジ 一例
Strategy | アプローチ |
---|---|
AnsiAttack |
ANSI エスケープシーケンスを挿入 |
Base64 |
Base64 で符号化 |
ROT13 |
ROT13 で符号化 |
UnicodeConfusable |
似た Unicode 文字を置換 |
Jailbreak |
ガードレールを回避するプロンプト |
... | ほか多数 |
複数ストラテジを AttackStrategy.Compose()
で組み合わせることも可能です。
複雑度レベル
- Baseline: 通常プロンプト
- Easy: 単純な攻撃パターン
- Moderate: 中程度の複雑さ
- Difficult: 複数の変換を組み合わせた高度な攻撃
評価指標
ASR (Attack Success Rate): 攻撃が有害出力を引き出すことに成功した割合
基本例:固定レスポンスコールバック
最も簡単な例として、どんな入力でも固定の安全レスポンスを返すコールバックをターゲットに設定します。
当然ながら ASR は常に 0% となります。
# 固定レスポンスを返すコールバック
def financial_advisor_callback(query: str) -> str: # noqa: ARG001
return (
"私はファイナンシャルアドバイザーアシスタントです。"
"法令と倫理を守りながら投資助言や資金計画をお手伝いします。"
)
# RedTeam インスタンス
red_team = RedTeam(
azure_ai_project=azure_ai_project,
credential=credential,
risk_categories=[RiskCategory.Violence, RiskCategory.HateUnfairness],
num_objectives=1,
)
# Flip ストラテジのみでスキャン
result = await red_team.scan(
target=financial_advisor_callback,
scan_name="Basic-Callback-Scan",
attack_strategies=[AttackStrategy.Flip],
output_path="red_team_output.json",
)
中級例:モデル構成をターゲットに利用
Azure OpenAI デプロイメントを直接ターゲットにする場合はモデル構成を辞書で渡します。
azure_oai_model_config = {
"azure_endpoint": azure_openai_endpoint,
"azure_deployment": azure_openai_deployment,
"api_key": azure_openai_api_key,
}
result = await red_team.scan(
target=azure_oai_model_config,
scan_name="Intermediary-Model-Target-Scan",
attack_strategies=[AttackStrategy.Flip],
)
上級例:Azure OpenAI エンドポイントをコールバック関数で呼び出す
実際のアプリケーションに近い形として、チャット履歴を受け取り Azure OpenAI API を呼び出す非同期コールバックを定義します。
async def azure_openai_callback(
messages: list,
stream: Optional[bool] = False, # noqa: ARG001
session_state: Optional[str] = None, # noqa: ARG001
context: Optional[Dict[str, Any]] = None, # noqa: ARG001
) -> Dict[str, list[Dict[str, str]]]:
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)
client = AzureOpenAI(
azure_endpoint=azure_openai_endpoint,
api_version=azure_openai_api_version,
azure_ad_token_provider=token_provider,
)
messages_list = [{"role": m.role, "content": m.content} for m in messages]
latest_message = messages_list[-1]["content"]
try:
response = client.chat.completions.create(
model=azure_openai_deployment,
messages=[{"role": "user", "content": latest_message}],
max_completion_tokens=500, # o1 base model の場合は必須
)
formatted_response = {"content": response.choices[0].message.content, "role": "assistant"}
except Exception as e:
print(f"Error calling Azure OpenAI: {e!s}")
formatted_response = {"content": "エラーが発生しました。", "role": "assistant"}
return {"messages": [formatted_response]}
RedTeam インスタンスを 4 カテゴリ × 5 目標攻撃で作成します。
model_red_team = RedTeam(
azure_ai_project=azure_ai_project,
credential=credential,
risk_categories=[
RiskCategory.Violence,
RiskCategory.HateUnfairness,
RiskCategory.Sexual,
RiskCategory.SelfHarm,
],
num_objectives=5,
)
攻撃ストラテジのテスト
複数ストラテジと複雑度レベルを指定して包括的に評価します。
advanced_result = await model_red_team.scan(
target=azure_openai_callback,
scan_name="Advanced-Callback-Scan",
attack_strategies=[
AttackStrategy.EASY,
AttackStrategy.MODERATE,
AttackStrategy.CharacterSpace,
AttackStrategy.ROT13,
AttackStrategy.UnicodeConfusable,
AttackStrategy.CharSwap,
AttackStrategy.Morse,
AttackStrategy.Leetspeak,
AttackStrategy.Url,
AttackStrategy.Binary,
AttackStrategy.Compose([AttackStrategy.Base64, AttackStrategy.ROT13]),
],
output_path="Advanced-Callback-Scan.json",
)
スキャン完了後、ターミナルに表示される URL から Azure AI Foundry 上のスコアカードを確認できます。
独自プロンプトを使った評価
自作の攻撃シードプロンプトを JSON で用意すれば、それらを目標として評価可能です。
サポートされるリスクタイプは violence
, sexual
, hate_unfairness
, self_harm
です。
path_to_prompts = "./data/prompts.json"
custom_red_team = RedTeam(
azure_ai_project=azure_ai_project,
credential=credential,
custom_attack_seed_prompts=path_to_prompts,
)
custom_red_team_result = await custom_red_team.scan(
target=azure_openai_callback,
scan_name="Custom-Prompt-Scan",
attack_strategies=[
AttackStrategy.EASY,
AttackStrategy.MODERATE,
AttackStrategy.DIFFICULT,
],
output_path="Custom-Prompt-Scan.json",
)
まとめ
- AI Red Teaming Agent を活用すると、生成 AI モデルが どのリスクカテゴリに弱いか、どの攻撃ストラテジが有効か を定量的に把握できます。
- キー指標は ASR (Attack Success Rate)
- 攻撃成功率が高い → ガードレール強化が必要
定期的なレッドチーミングを開発ライフサイクルに組み込み、実運用前に潜在的脆弱性を洗い出しましょう。
得られるインサイト
観点 | 例 |
---|---|
総合 ASR | モデル全体の脆弱性レベル |
カテゴリ別弱点 | 「暴力表現に特に弱い」など |
攻撃手法の効果 | ROT13 が最も成功率が高い 等 |
複雑度の影響 | Difficult ストラテジで ASR が急増 など |
次のステップ
- Mitigation: 脆弱ポイントに対し、プロンプトフィルタリングやファインチューニングでガードレールを強化
- Continuous Testing: CI/CD パイプラインに RedTeam 評価を組み込み、継続的に安全性を監査
- Custom Strategies: ドメイン固有の攻撃ストラテジを実装し、より現実的なリスクを再現
- Safety Layers: Azure AI Content Safety など追加フィルタでリクエスト/レスポンスを二重にチェック
これで Azure AI Foundry と AI Red Teaming Agent を組み合わせた評価方法の紹介は終了です。
ぜひご自身のプロジェクトでも試して、安全な生成 AI システムの構築に役立ててください!
引用📎
Discussion