Запуск агента AI для красных команд в облаке

Хотя агент Red Teaming AI может выполняться локально во время прототипирования и разработки для выявления рисков безопасности, запуск их в облаке позволяет использовать следующие сценарии:

  • Пре-развертывание AI red teaming осуществляется на более крупных комбинациях стратегий атак и категорий рисков для более полного анализа.
  • Запуски непрерывных испытаний искусственного интеллекта после развертывания, которые можно запланировать для выполнения с заданными интервалами времени.
  • Сценарии риска, специфичные для агента, для поддержки минимально ограниченной среды для проведения учений с красной командой искусственного интеллекта.

Необходимые условия

  • Проект Foundry.

  • Роль пользователя Foundry в проекте Foundry .

    Important

    Недавно были переименованы роли RBAC в Foundry. Foundry User, Foundry Owner, Foundry Account Owner и Foundry Project Manager ранее назывались пользователь Azure AI, владелец Azure AI, владелец учетной записи Azure AI и руководитель проекта Azure AI. Пока новое название внедряется, в некоторых местах вы всё ещё можете видеть прежние названия. Идентификаторы ролей и основные разрешения не меняются из-за переименования.

  • Python 3.9 или более поздней версии.

  • Для агентских сценариев: существующий агент Foundry, развернутый в проекте. Имя агента требуется в качестве AZURE_AI_AGENT_NAME.

Начало работы

Сначала установите клиент проекта Microsoft Foundry SDK, который запускает агент ИИ Red Teaming в облаке.

pip install "azure-ai-projects>=2.0.0"

В дальнейшем задайте переменные среды для ресурсов Microsoft Foundry.

import os

endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]  # Example: https://<account_name>.services.ai.azure.com/api/projects/<project_name>
agent_name = os.environ["AZURE_AI_AGENT_NAME"]  # Required. The name of the agent to red team.

Поддерживаемые целевые объекты

Запуск агента Red Teaming AI в облаке в настоящее время поддерживает только следующее:

  • Развертывания проектов Foundry
  • Развертывания моделей Azure OpenAI
  • Агенты Foundry (запросы и агенты контейнера) в проекте Microsoft Foundry в качестве целевого объекта.

Настройка целевой модели

Развертывание целевой модели можно настроить двумя способами:

Вариант 1: Развертывания проектов Foundry

Если вы используете развертывания моделей, которые входят в проект Foundry, передайте имя развертывания непосредственно в initialization_parameters.deployment_name поле при создании красной команды. Microsoft рекомендует проверку подлинности без ключей через DefaultAzureCredential — запустите az login перед выполнением.

Если в вашем сценарии требуется проверка подлинности ключа API, вместо этого выполните следующие действия.

import os

model_endpoint = os.environ["MODEL_ENDPOINT"]  # Example: https://<account_name>.openai.azure.com
model_api_key = os.environ["MODEL_API_KEY"]    # Use DefaultAzureCredential when possible
model_deployment_name = os.environ["MODEL_DEPLOYMENT_NAME"]  # Example: gpt-4o-mini

Вариант 2: Развертывание Azure OpenAI/Foundry Tools

Если вы хотите использовать развертывания из учетных записей Azure OpenAI или Foundry Tools, сначала необходимо подключить эти ресурсы к проекту Foundry через подключения.

  1. Создайте подключение: Следуйте инструкциям в Добавьте новое подключение к вашему проекту для подключения вашего ресурса Azure OpenAI или служб AI к проекту Foundry.

  2. Получите имя подключения: после подключения учетной записи в вашем проекте Foundry появится подключение с автоматически сгенерированным именем.

  3. Настройте целевой объект: используйте формат "connectionName/deploymentName" конфигурации развертывания модели:

# Format: "connectionName/deploymentName"
model_deployment_name = "my-openai-connection/gpt-4o-mini"

Создайте красную команду для искусственного интеллекта

Создайте красную команду для проведения одного или нескольких запусков, разделяющих источник данных и категории рисков.

import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient

endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]
model_deployment = os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"]

with DefaultAzureCredential() as credential:
    with AIProjectClient(endpoint=endpoint, credential=credential) as project_client:
        client = project_client.get_openai_client()

        # Create a red team with built-in safety evaluators
        red_team = client.evals.create(
            name="Red Team Agentic Safety Evaluation",
            data_source_config={"type": "azure_ai_source", "scenario": "red_team"},
            testing_criteria=[
                {
                    "type": "azure_ai_evaluator",
                    "name": "Prohibited Actions",
                    "evaluator_name": "builtin.prohibited_actions",
                    "evaluator_version": "1"
                },
                {
                    "type": "azure_ai_evaluator",
                    "name": "Task Adherence",
                    "evaluator_name": "builtin.task_adherence",
                    "evaluator_version": "1",
                    "initialization_parameters": {"deployment_name": model_deployment},
                },
                {
                    "type": "azure_ai_evaluator",
                    "name": "Sensitive Data Leakage",
                    "evaluator_name": "builtin.sensitive_data_leakage",
                    "evaluator_version": "1"
                },
            ],
        )
        print(f"Created red team: {red_team.id}")

Что это делает:

  • Создает команду red team для проведения всех упражнений по моделированию атак
  • Настраивает красную команду с помощью трех встроенных оценщиков (Запрещенные Действия, Соблюдение Задач, Утечка Конфиденциальных Данных).

Вы получите:

  • Тело JSON с метаданными группы, включая идентификатор (сохраните его как {{red_team_id}} для дальнейшего использования).

Подготовка команды "Ред Тим"

Используйте это для проверки наличия красной команды и проверки конфигурации (критерии, источник данных, метки времени).

print(f"[Group] Retrieving group by id={red_team.id} ...")
red_team_fetched = client.evals.retrieve(red_team.id)
print("[Group] Response:")
print(red_team_fetched)

Создание (или обновление) таксономии оценки

Чтобы провести операцию по оценке агентного риска в категории запрещенных действий, необходимо иметь возможность подтвердить, изменить или обновить таксономию оценки запрещенных действий, сгенерированную в рамках рабочего процесса красной команды. В следующем примере будет создан JSON-файл с созданной таксономией запрещенных действий, которые будут использоваться в динамическом создании запросов атак на тестирование поведения агента на основе утвержденной пользователем политики. После проверки и подтверждения таксономии она будет использоваться для проведения упражнения для красной команды и оценки уровня успешности атак (ASR) выходных данных агента.

from azure.ai.projects.models import (
    AzureAIAgentTarget,
    AgentTaxonomyInput,
    EvaluationTaxonomy,
    RiskCategory,
)

# Define the agent target for taxonomy generation
target = AzureAIAgentTarget(
    name=agent_name,
    version=agent_version.version,
)

# Create taxonomy for prohibited actions risk category
taxonomy = project_client.beta.evaluation_taxonomies.create(
    name=agent_name,
    body=EvaluationTaxonomy(
        description="Taxonomy for red teaming run",
        taxonomy_input=AgentTaxonomyInput(
            risk_categories=[RiskCategory.PROHIBITED_ACTIONS],
            target=target
        ),
    )
)
taxonomy_file_id = taxonomy.id
print(f"Created taxonomy: {taxonomy_file_id}")

Что это делает:

  • Создает и обновляет ресурс таксономии с именем {{name}} :
    • Определяет целевой объект агента и описания инструментов
    • Указывает категории рисков ProhibitedActions

Вы будете ссылать на него

  • через универсальный код ресурса (URI) в запросе file_idCreate Run.

Запуск операции в составе красной команды

Выполнение генерирует элементы из источника (например, таксономии) и тестирует целевого агента группой из красной команды с выбранными стратегиями атаки.

# Create a red team run with attack strategies
eval_run = client.evals.runs.create(
    eval_id=red_team.id,
    name="Red Team Agent Safety Eval Run",
    data_source={
        "type": "azure_ai_red_team",
        "item_generation_params": {
            "type": "red_team_taxonomy",
            "attack_strategies": ["Flip", "Base64", "IndirectJailbreak"],
            "num_turns": 5,
            "source": {"type": "file_id", "id": taxonomy_file_id},
        },
        "target": target.as_dict(),
    },
)
print(f"Created run: {eval_run.id}, status: {eval_run.status}")

Ключевые поля для настройки запуска:

  • attack_strategies: например, "Flip", "Base64", "IndirectJailbreak" (выберите те, которые требуется протестировать)
  • num_turns: многоэтапная глубина для созданных элементов red-team
  • source.id: указывает на таксономию по URI идентификатора файла
  • target: агент под тестом (имя, версия, средства)

Вы получите

  • Объект выполнения, включая id (сохранить как {{eval_run_id}})

Получение запуска красной команды (по идентификатору)

Используйте это для проверки состояния выполнения операции в режиме красной команды (например, в очереди, выполняется, успешно, сбой).

import time

# Poll for run completion
while True:
    run = client.evals.runs.retrieve(run_id=eval_run.id, eval_id=red_team.id)
    print(f"Status: {run.status}")
    if run.status in ("completed", "failed", "canceled"):
        break
    time.sleep(5)

Примечание

API работает синхронно по каждому запросу, но обработка самих запусков происходит на стороне сервера; опрашивайте эту конечную точку до завершения перед получением выходных элементов.

Вывод элементов и результатов выполнения красной команды

Используйте это для проверки итоговых метрик после завершения проведения командных учений.

print("[Run] Fetching output items...")
items = list(client.evals.runs.output_items.list(run_id=run.id, eval_id=red_team.id))
output_path = os.path.join(data_folder, f"redteam_eval_output_items_{agent_name}.json")
with open(output_path, "w") as f:
    f.write(json.dumps(_to_json_primitive(items), indent=2))
print(f"[Run] Done. Status={run.status}. Output items saved to {output_path}")