☣️

生成 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.前提条件

  1. Azure サブスクリプション
  2. Azure AI Hub と Azure AI Project を作成
  3. プライベートネットワーク/プライベートエンドポイント対応
  4. AI Red Teaming Agent は攻撃用モデルをホスティング済み
  5. ご自身で LLM をデプロイする必要はありません
  6. 評価結果を Azure AI Foundry にアップロードする場合
  7. Blob Data Contributor ロールが必要
  8. 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 が急増 など

次のステップ

  1. Mitigation: 脆弱ポイントに対し、プロンプトフィルタリングやファインチューニングでガードレールを強化
  2. Continuous Testing: CI/CD パイプラインに RedTeam 評価を組み込み、継続的に安全性を監査
  3. Custom Strategies: ドメイン固有の攻撃ストラテジを実装し、より現実的なリスクを再現
  4. Safety Layers: Azure AI Content Safety など追加フィルタでリクエスト/レスポンスを二重にチェック

これで Azure AI Foundry と AI Red Teaming Agent を組み合わせた評価方法の紹介は終了です。
ぜひご自身のプロジェクトでも試して、安全な生成 AI システムの構築に役立ててください!

引用📎

https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/ai-red-teaming-agent
https://learn.microsoft.com/en-us/azure/ai-foundry/how-to/develop/run-scans-ai-red-teaming-agent
https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/AI_RedTeaming

Discussion