Выполнение вычислений в облаке с помощью пакета SDK для Microsoft Foundry

Важно

Элементы, помеченные (предварительная версия) в этой статье, в настоящее время находятся в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или могут иметь ограниченные возможности. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Используйте облачные оценки для большинства сценариев, особенно при тестировании в масштабе, интеграции вычислений в конвейеры непрерывной интеграции и непрерывной доставки (CI/CD) или выполнения предварительного тестирования. Выполнение вычислений в облаке устраняет необходимость управления локальной вычислительной инфраструктурой и поддерживает крупномасштабные автоматизированные рабочие процессы тестирования. Вы также можете запланировать выполнение вычислений на регулярной основе или настроить непрерывную оценку для автоматической оценки примеров ответов агента в рабочей среде.

Результаты оценки облака хранятся в проекте Foundry. Вы можете просмотреть результаты на портале, получить их с помощью пакета SDK или перенаправить их в Application Insights при подключении. Облачная оценка поддерживает все оценщики, организованные Microsoft, и собственные пользовательские оценщики. Оценщики управляются в каталоге оценщиков с тем же охватом проекта и управлением доступом на основе ролей.

Совет

Полные исполняемые примеры см. в образцах оценки Python SDK на GitHub.

Как работает оценка облака

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

Облачная оценка поддерживает следующие сценарии:

Сценарий Когда следует использовать Тип источника данных Цель
Оценка набора данных Оцените предварительно вычисляемые ответы в JSONL-файле. jsonl
Оценка набора данных CSV Оцените предварительно вычисляемые ответы в CSV-файле. csv
Целевая оценка модели Предоставьте запросы и создайте ответы из модели во время выполнения для оценки. azure_ai_target_completions azure_ai_model
Оценка целевого объекта агента Продемонстрируйте запросы и создайте ответы от агента Foundry (интерактивный или размещенный) во время выполнения программы для оценки. azure_ai_target_completions azure_ai_agent
Оценка ответа агента Получение и оценка ответов агента Foundry по идентификаторам ответов. azure_ai_responses
Оценка трасс (предварительная версия) Оцените взаимодействия агентов, уже зафиксированные в Application Insights по идентификатору трассировки. Используйте этот подход для агентов, не связанных с Foundry (LangChain и пользовательских платформ, которые соответствуют протоколу логирования на основе OpenTelemetry). azure_ai_traces
Оценка искусственных данных (предварительная версия) Создайте искусственные тестовые запросы, отправьте их модели или агенту и оцените ответы. azure_ai_synthetic_data_gen_preview azure_ai_model Или azure_ai_agent
Оценка красной команды Запуск автоматического состязательного тестирования против модели или агента. azure_ai_red_team azure_ai_model Или azure_ai_agent

Для большинства сценариев требуются входные данные. Вы можете предоставить данные двумя способами:

Тип источника Описание
file_id Используйте идентификатор для ссылки на загруженный набор данных.
file_content Предоставьте данные непосредственно в запросе.

Для каждой оценки требуется data_source_config, указывающий службе, какие поля ожидать в ваших данных.

  • custom — вы определяете item_schema, в котором указываются имена и типы полей. Задайте значение include_sample_schematrue при использовании целевого объекта, чтобы вычислители могли ссылаться на созданные ответы.
  • azure_ai_source — схема выводится из службы. Установите значение "scenario" для оценки ответа агента, "responses" для "traces", для "synthetic_data_gen_preview" или для "red_team".

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

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

  • Проект Foundry.

  • Развертывание Azure OpenAI с моделью GPT, поддерживающей завершение общения (например, gpt-5-mini).

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

    Важно

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

  • При необходимости можно использовать собственную учетную запись хранения для выполнения вычислений.

Примечание

Некоторые функции оценки имеют региональные ограничения. Дополнительные сведения см. в поддерживаемых регионах .

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

Установите пакет SDK и настройте клиент:

pip install "azure-ai-projects>=2.0.0"
import os
from azure.identity import DefaultAzureCredential 
from azure.ai.projects import AIProjectClient 
from openai.types.eval_create_params import DataSourceConfigCustom
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileContent,
    SourceFileContentContent,
    SourceFileID,
)

# Azure AI Project endpoint
# Example: https://<account_name>.services.ai.azure.com/api/projects/<project_name>
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]

# Model deployment name (for AI-assisted evaluators)
# Example: gpt-5-mini
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")

# Dataset details (optional, for reusing existing datasets)
dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")

# Create the project client
project_client = AIProjectClient( 
    endpoint=endpoint, 
    credential=DefaultAzureCredential(), 
)

# Get the OpenAI client for evaluation API
client = project_client.get_openai_client()

Подготовка входных данных

Для большинства сценариев оценки требуются входные данные. Вы можете предоставить данные двумя способами:

Отправьте JSONL или CSV-файл, чтобы создать набор данных с версиями в проекте Foundry. Наборы данных поддерживают управление версиями и повторное использование в нескольких запусках оценки. Используйте этот подход для производственного тестирования и рабочих процессов CI/CD.

Подготовьте JSONL-файл с одним объектом JSON на строку, содержащую поля, необходимые вычислителям:

{"query": "What is machine learning?", "response": "Machine learning is a subset of AI.", "ground_truth": "Machine learning is a type of AI that learns from data."}
{"query": "Explain neural networks.", "response": "Neural networks are computing systems inspired by biological neural networks.", "ground_truth": "Neural networks are a set of algorithms modeled after the human brain."}

Или подготовьте CSV-файл с заголовками столбцов, соответствующими полям вычислителя:

query,response,ground_truth
What is machine learning?,Machine learning is a subset of AI.,Machine learning is a type of AI that learns from data.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are a set of algorithms modeled after the human brain.
# Upload a local JSONL file. Skip this step if you already have a dataset registered.
data_id = project_client.datasets.upload_file(
    name=dataset_name,
    version=dataset_version,
    file_path="./evaluate_test_data.jsonl",
).id

Предоставьте данные в строки

Для быстрого экспериментирования с небольшими наборами тестов предоставьте данные непосредственно в запросе на оценку с помощью file_content.

source = SourceFileContent(
    type="file_content",
    content=[
        SourceFileContentContent(
            item={
                "query": "How can I safely de-escalate a tense situation?",
                "ground_truth": "Encourage calm communication, seek help if needed, and avoid harm.",
            }
        ),
        SourceFileContentContent(
            item={
                "query": "What is the largest city in France?",
                "ground_truth": "Paris",
            }
        ),
    ],
)

Параметр source передайте как поле "source" в конфигурации вашего источника данных при создании запуска процесса. В разделах сценария, которые следуют далее, используется file_id по умолчанию.

Оценка набора данных

Оцените предварительно вычисляемые ответы в JSONL-файле с помощью jsonl типа источника данных. Этот сценарий полезен, если у вас уже есть выходные данные модели и требуется оценить их качество.

Совет

Прежде чем начать, завершите начало работы и подготовьте входные данные.

Определение схемы данных и вычислителей

Укажите схему, соответствующую полям JSONL, и выберите вычислители (критерии тестирования) для выполнения. Используйте параметр data_mapping для подключения полей из ваших входных данных к параметрам оценщика с использованием синтаксиса {{item.field}}. Всегда включайте data_mapping с необходимыми полями входных данных для каждого оценщика. Имена полей должны совпадать с именами в JSONL-файле — например, если ваши данные содержат "question" вместо "query", используйте "{{item.question}}" в сопоставлении. Сведения о необходимых параметрах для каждого оценщика см. встроенные оценщики.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
            "response": {"type": "string"},
            "ground_truth": {"type": "string"},
        },
        "required": ["query", "response", "ground_truth"],
    },
)

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "f1",
        "evaluator_name": "builtin.f1_score",
        "data_mapping": {
            "response": "{{item.response}}",
            "ground_truth": "{{item.ground_truth}}",
        },
    },
]

Создание оценки и запуск

Создайте оценку, а затем запустите выполнение по вашему загруженному набору данных. Выполнение выполняет каждый вычислитель для каждой строки в наборе данных.

# Create the evaluation
eval_object = client.evals.create(
    name="dataset-evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run using the uploaded dataset
eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="dataset-run",
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=data_id,
        ),
    ),
)

Полный пример запуска см. в разделе sample_evaluations_builtin_with_dataset_id.py на GitHub. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Оценка набора данных CSV

Оцените предварительно вычисляемые ответы в CSV-файле с помощью csv типа источника данных. Этот сценарий работает так же, как и оценка набора данных , но принимает CSV-файлы вместо JSONL. Используйте CSV,если данные уже в электронной таблице или табличном формате.

Совет

Прежде чем начать, завершите начало работы и подготовьте входные данные.

Подготовка CSV-файла

Создайте CSV-файл с заголовками столбцов, соответствующими полям, которые нужны вычислителям. Каждая строка представляет один тестовый случай:

query,response,context,ground_truth
What is cloud computing?,Cloud computing delivers computing services over the internet.,Cloud computing is a technology for on-demand resource delivery.,Cloud computing is the delivery of computing services including servers storage and databases over the internet.
What is machine learning?,Machine learning is a subset of AI that learns from data.,Machine learning is a branch of artificial intelligence.,Machine learning is a type of AI that enables computers to learn from data without being explicitly programmed.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are used in deep learning.,Neural networks are a set of algorithms modeled after the human brain designed to recognize patterns.

Отправка и запуск

Отправьте CSV-файл в виде набора данных, а затем создайте оценку с помощью csv типа источника данных. Конфигурация схемы и настройка оценщика такие же, как и для оценок JSONL — единственное отличие заключается "type": "csv" в источнике данных.

# Upload the CSV file
data_id = project_client.datasets.upload_file(
    name="eval-csv-data",
    version="1",
    file_path="./evaluation_data.csv",
).id

# Define the schema matching your CSV columns
data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
            "response": {"type": "string"},
            "context": {"type": "string"},
            "ground_truth": {"type": "string"},
        },
        "required": [],
    },
    include_sample_schema=True,
)

# Define evaluators with data mappings to CSV columns
testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        "initialization_parameters": {"deployment_name": model_deployment_name},
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        "initialization_parameters": {"deployment_name": model_deployment_name},
    },
    {
        "type": "azure_ai_evaluator",
        "name": "f1",
        "evaluator_name": "builtin.f1_score",
    },
]

# Create the evaluation
eval_object = client.evals.create(
    name="CSV evaluation with built-in evaluators",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run using the CSV data source type
eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="csv-evaluation-run",
    data_source={
        "type": "csv",
        "source": {
            "type": "file_id",
            "id": data_id,
        },
    },
)

Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Оценка целевых показателей модели

Отправьте запросы в развернутую модель во время выполнения и оцените ответы с помощью azure_ai_target_completions типа источника данных с целевым azure_ai_model объектом. Входные данные содержат запросы; Модель создает ответы, которые затем вычисляются.

Совет

Прежде чем начать, завершите начало работы и подготовьте входные данные.

Определение шаблона сообщения и целевого объекта

Шаблон input_messages управляет отправкой запросов в модель. Используется {{item.query}} для ссылки на поля из входных данных. Укажите модель для оценки и необязательных параметров выборки:

input_messages = {
    "type": "template",
    "template": [
        {
            "type": "message",
            "role": "user",
            "content": {
                "type": "input_text",
                "text": "{{item.query}}"
            }
        }
    ]
}

target = {
    "type": "azure_ai_model",
    "model": "gpt-5-mini",
    "sampling_params": {
        "top_p": 1.0,
        "max_completion_tokens": 2048,
    },
}

Настройка оценщиков и сопоставлений данных

Когда модель генерирует ответы во время выполнения, используйте {{sample.output_text}} в data_mapping для ссылки на выходные данные модели. Используется {{item.field}} для ссылки на поля из входных данных.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
        },
        "required": ["query"],
    },
    include_sample_schema=True,
)

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
]

Создание оценки и запуск

eval_object = client.evals.create(
    name="Model Target Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="model-target-evaluation",
    data_source=data_source,
)

Полный пример запуска см. в разделе sample_model_evaluation.py на GitHub. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Совет

Чтобы добавить другой запуск оценки, можно использовать тот же код.

Оценка целевого объекта агента

Отправляйте запросы агенту Foundry в режиме выполнения и оценивайте ответы, используя тип источника данных azure_ai_target_completions с целевым объектом azure_ai_agent. Этот сценарий подходит как для оперативных агентов, так и для размещенных агентов.

Совет

Прежде чем начать, завершите начало работы и подготовьте входные данные.

Совет

Размещенные агенты, использующие протокол ответов, работают с теми же примерами кода, которые показаны здесь. Для агентов в облаке, использующих протокол вызовов, формат input_messages отличается. В протоколе вызовов размещенного агента см. дополнительные сведения.

Определение шаблона сообщения и целевого объекта

Шаблон input_messages управляет отправкой запросов агенту. Используется {{item.query}} для ссылки на поля из входных данных. Укажите агент для оценки по названию.

input_messages = {
    "type": "template",
    "template": [
        {
            "type": "message",
            "role": "developer",
            "content": {
                "type": "input_text",
                "text": "You are a helpful assistant. Answer clearly and safely."
            }
        },
        {
            "type": "message",
            "role": "user",
            "content": {
                "type": "input_text",
                "text": "{{item.query}}"
            }
        }
    ]
}

target = {
    "type": "azure_ai_agent",
    "name": "my-agent",
    "version": "1"  # Optional. Uses latest version if omitted.
}

Настройка оценщиков и сопоставлений данных

Когда агент генерирует ответы во время выполнения, используйте переменные {{sample.*}} в data_mapping для указания на выводные данные агента.

Переменная Описание Применение для
{{sample.output_text}} Обычный текстовый ответ агента. Оценщики, ожидающие строковый ответ (например, coherence, violence).
{{sample.output_items}} Выходные данные агента в формате JSON, включая структурированные вызовы инструментов. Оценщики, которым требуется полный контекст взаимодействия (например, task_adherence).
{{item.field}} Поле из входных данных. Поля ввода, например query или ground_truth.

Совет

Поле query может содержать структурированные json, включая системные сообщения и журнал бесед. Некоторые оценщики агентов, такие как task_adherence, используют этот контекст для более точной оценки. Дополнительные сведения о форматировании запросов см. в разделе о вычислителях агентов.

data_source_config = DataSourceConfigCustom(
    type="custom",
    item_schema={
        "type": "object",
        "properties": {
            "query": {"type": "string"},
        },
        "required": ["query"],
    },
    include_sample_schema=True,
)

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "task_adherence",
        "evaluator_name": "builtin.task_adherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_items}}",
        },
    },
]

Создание оценки и запуск

eval_object = client.evals.create(
    name="Agent Target Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

agent_eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-target-evaluation",
    data_source=data_source,
)

Полный пример запуска см. в разделе sample_agent_evaluation.py на GitHub. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Протокол вызовов хостинг агента

Размещенные агенты , использующие протокол вызовов, поддерживают тот же azure_ai_agent тип целевого объекта, но используют формат свободной формы input_messages . Вместо структурированного формата шаблона укажите объект JSON, который сопоставляется непосредственно с текстом запроса агента /invocations . Используйте {{item.*}} заполнители для замены полей из входных данных.

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

Определение формата сообщения и целевого объекта

input_messages = {"message": "{{item.query}}"}

target = {
    "type": "azure_ai_agent",
    "name": "my-hosted-agent",  # Replace with your hosted agent name
    "version": "1",
}

Создание оценки и запуск

eval_object = client.evals.create(
    name="Hosted Agent Invocations Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_target_completions",
    "source": {
        "type": "file_id",
        "id": data_id,
    },
    "input_messages": input_messages,
    "target": target,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="hosted-agent-invocations-evaluation",
    data_source=data_source,
)

Параметры установки и сопоставления данных вычислителя совпадают с оценкой агента запроса. Используйте {{sample.output_text}} для текстового ответа агента и {{sample.output_items}} для полно структурированных выходных данных, включая вызовы инструментов.

Оценка ответа агента

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

Совет

Прежде чем начать, выполните приступайте.

Идентификатор ответа — это уникальный идентификатор, возвращаемый каждый раз, когда агент Foundry создает ответ. Идентификаторы ответов можно собирать из взаимодействий агента с помощью API ответов или из журналов трассировки приложения. Укажите идентификаторы непосредственно в содержимом файла или загрузите их в виде набора данных (см. Подготовка входных данных).

Сбор идентификаторов ответов

Каждый вызов API ответов возвращает объект ответа с уникальным id полем. Соберите эти идентификаторы из взаимодействий приложения или создайте их напрямую:

# Generate response IDs by calling a model through the Responses API
response = client.responses.create(
    model=model_deployment_name,
    input="What is machine learning?",
)
print(response.id)  # Example: resp_abc123

Вы также можете собирать идентификаторы ответов из взаимодействий с агентом в журналах трассировки приложения или конвейере мониторинга. Каждый идентификатор ответа однозначно идентифицирует сохраненный ответ, который может получить служба оценки.

Создание оценки и запуск

data_source_config = {"type": "azure_ai_source", "scenario": "responses"}

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
    },
]

eval_object = client.evals.create(
    name="Agent Response Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_responses",
    "item_generation_params": {
        "type": "response_retrieval",
        "data_mapping": {"response_id": "{{item.resp_id}}"},
        "source": {
            "type": "file_content",
            "content": [
                {"item": {"resp_id": "resp_abc123"}},
                {"item": {"resp_id": "resp_def456"}},
            ]
        },
    },
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-response-evaluation",
    data_source=data_source,
)

Полный пример запуска см. в разделе sample_agent_response_evaluation.py на GitHub. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Оценка трассировки (предварительная версия)

Оцените взаимодействия агента, которые уже были записаны в Application Insights. Используйте тип источника данных azure_ai_traces. Этот сценарий полезен для оценки реального рабочего трафика после развертывания, вы выбираете трассировки из конвейера мониторинга и запускаете оценщики для них без повторного выполнения запросов.

Важно

Оценка трассировки — это рекомендуемый подход для оценки агентов, не созданных с помощью службы агента Microsoft Foundry, включая LangChain и пользовательские платформы. Если агент выдает диапазоны OpenTelemetry после семантических соглашений GenAI в Application Insights, оценка трассировки может оценить его взаимодействие с помощью тех же оценщиков, доступных для агентов Foundry.

Оценка трассировки поддерживает два режима:

  • Идентификаторы трассировки — оценка взаимодействия конкретного агента путем предоставления их operation_Id значений из Application Insights.
  • По фильтру агента — автоматическое обнаружение и оценка последних следов для данного агента без ручного сбора идентификаторов следов.

Совет

Прежде чем начать, выполните приступайте. Для этого сценария также требуется ресурс Application Insights, подключенный к проекту Foundry.

Требования к данным трассировки

Для оценки трассировки агент должен выдавать спаны в соответствии с семантическими соглашениями OpenTelemetry для генеративного ИИ. В частности, служба оценки считывает invoke_agent диапазоны из Application Insights и извлекает данные беседы из их атрибутов.

Используются следующие атрибуты диапазона:

Атрибут Обязательно Описание
gen_ai.operation.name Да Должно быть равно "invoke_agent". Служба игнорирует все остальные диапазоны.
gen_ai.agent.id Для режима фильтрации агента Уникальный идентификатор агента (формат: agent-name:version).
gen_ai.agent.name Для режима фильтрации агента Читаемое человеком имя агента.
gen_ai.input.messages Входные данные для вычислителей Массив JSON входных сообщений в соответствии с форматом сообщений семантических конвенций GenAI. Сообщения с ролью user или system соответствуют query; сообщения с ролью assistant или tool соответствуют response.
gen_ai.output.messages Входные данные для вычислителей Массив JSON выходных сообщений, созданных моделью. Все выходные сообщения сопоставляются с response. Если выходные данные также содержат тип: tool_call или тип: tool_result, он сопоставляется с tool_calls
gen_ai.tool.definitions Необязательный Массив JSON схем инструментов, доступных агенту. При отсутствии данных, служба пытается определить параметры инструментов из сообщений вызова инструментов, но полученные схемы могут быть неполными.
gen_ai.conversation.id Необязательный Идентификатор беседы, используемый в результатах оценки для корреляции.

Примечание

Если gen_ai.input.messages и gen_ai.output.messages являются пустыми или отсутствующими, оценка качества (согласованность, беглость, релевантность, разрешение намерений) вернет score=None. Оценщики безопасности (насилие, самоповреждение, сексуальное, ненависть/несправедливость) по-прежнему могут создавать оценки с частичными данными, но они могут не производить существенные результаты.

Для Python-агентов, созданных с помощью Azure AI Agent Server SDK, добавьте [tracing] опцию для включения автоматической генерации спанов:

pip install "azure-ai-agentserver-core[tracing]"

Предварительные требования для оценки трассировки

Помимо общих предварительных требований, требуется оценка трассировки:

  • Ресурс Application Insights, подключенный к проекту Foundry. См. раздел Настроить трассировку в Microsoft Foundry.
  • Управляемое удостоверение проекта должно иметь роль читателя логов Log Analytics как в ресурсе Application Insights, так и в связанной рабочей области Log Analytics.
  • Пакет azure-monitor-query Python (необходим только при сборе идентификаторов трассировки вручную).
pip install "azure-ai-projects>=2.0.0" azure-monitor-query

Задайте следующие переменные среды:

  • APPINSIGHTS_RESOURCE_ID — идентификатор ресурса Application Insights (например, /subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.Insights/components/<resource_name>).
  • AGENT_ID — идентификатор агента, создаваемый интеграцией трассировки (gen_ai.agent.id атрибутом), используемый для фильтрации трассировок. Формат: agent-name:version.
  • TRACE_LOOKBACK_HOURS — (Необязательно) Количество часов назад, при запросе данных трассировки. По умолчанию — 1.

Вариант A. Оценка по фильтру агента

Самый простой подход — позволить службе автоматически обнаруживать и оценивать последние трассировки для конкретного агента. Ручной сбор идентификаторов трассировки не требуется.

import os

agent_id = os.environ["AGENT_ID"]  # e.g., "my-weather-agent:1"
trace_lookback_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))

# Create the evaluation
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

eval_object = client.evals.create(
    name="Agent Trace Evaluation (by agent)",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,  # See "Set up evaluators" below
)

# Create a run — the service queries App Insights for matching traces
data_source = {
    "type": "azure_ai_traces",
    "agent_id": agent_id,
    "max_traces": 50,           # Maximum number of traces to evaluate
    "lookback_hours": trace_lookback_hours,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-trace-eval-run",
    data_source=data_source,
)

print(f"Evaluation run started: {eval_run.id}")

Служба фильтрует диапазоны по атрибуту invoke_agent, делает выборку до gen_ai.agent.id уникальных идентификаторов трассировки и вычисляет все диапазоны из этих трассировок.

Вариант B. Оценка по идентификаторам трассировки

Для большего контроля соберите определенные идентификаторы трассировки из Application Insights и оцените их. Это полезно, если требуется оценить курируемый набор взаимодействий (например, трассировки, помеченные оповещениями или образцы для проверки качества).

Сбор идентификаторов трассировки из Application Insights

Отправьте запрос в Application Insights о значениях из трассировок агента. Каждый operation_Id представляет полное взаимодействие агента:

import os
from datetime import datetime, timedelta, timezone
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, LogsQueryStatus

appinsights_resource_id = os.environ["APPINSIGHTS_RESOURCE_ID"]
agent_id = os.environ["AGENT_ID"]
trace_query_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))

end_time = datetime.now(timezone.utc)
start_time = end_time - timedelta(hours=trace_query_hours)

query = f"""dependencies
| where timestamp between (datetime({start_time.isoformat()}) .. datetime({end_time.isoformat()}))
| extend agent_id = tostring(customDimensions["gen_ai.agent.id"])
| where agent_id == "{agent_id}"
| distinct operation_Id"""

credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
response = logs_client.query_resource(
    appinsights_resource_id,
    query=query,
    timespan=None,  # Time range is specified in the query itself
)

trace_ids = []
if response.status == LogsQueryStatus.SUCCESS:
    for table in response.tables:
        for row in table.rows:
            trace_ids.append(row[0])

print(f"Found {len(trace_ids)} trace IDs")

Создание оценки и запуск с идентификаторами трассировки

# Create the evaluation
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

eval_object = client.evals.create(
    name="Agent Trace Evaluation (by trace IDs)",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,  # See "Set up evaluators" below
)

# Create a run using the collected trace IDs
data_source = {
    "type": "azure_ai_traces",
    "trace_ids": trace_ids,
    "lookback_hours": trace_query_hours,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="agent-trace-eval-run",
    metadata={
        "agent_id": agent_id,
        "start_time": start_time.isoformat(),
        "end_time": end_time.isoformat(),
    },
    data_source=data_source,
)

print(f"Evaluation run started: {eval_run.id}")

Настройка оценщиков и сопоставлений данных

При оценке трассировок служба автоматически извлекает данные беседы из атрибутов диапазона OpenTelemetry. Используйте эти имена полей непосредственно в data_mapping (без использования префиксов item. или sample., которые используются в других сценариях):

Переменная Исходный атрибут Описание
{{item.query}} gen_ai.input.messages (роли пользователя или системы) Запрос пользователя, извлеченный из трассировки.
{{item.response}} gen_ai.input.messages (роли помощника или инструмента) + gen_ai.output.messages Ответ агента, извлеченный из трассировки.
{{item.tool_definitions}} gen_ai.tool.definitions Схемы инструментов, доступные агенту. Требуется только для оценщиков, связанных с инструментами
{{item.tool_calls}} Извлеченные из сообщений помощника в gen_ai.input.messages / gen_ai.output.messages Вызовы инструмента, которые совершает агент во время взаимодействия. Используется оценщиками инструментов. Требуется только для оценщиков, связанных с инструментами
testing_criteria = [
    # Quality evaluators — require query and response from trace data
    {
        "type": "azure_ai_evaluator",
        "name": "intent_resolution",
        "evaluator_name": "builtin.intent_resolution",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
            "tool_definitions": "{{item.tool_definitions}}",
        },
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
    },
    # Tool evaluators — assess tool usage quality
    {
        "type": "azure_ai_evaluator",
        "name": "tool_call_accuracy",
        "evaluator_name": "builtin.tool_call_accuracy",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
            "tool_calls": "{{item.tool_calls}}",
            "tool_definitions": "{{item.tool_definitions}}",
        },
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
    },
    # Safety evaluators — work even with partial trace data
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        "initialization_parameters": {
            "threshold": 4,
        },
    },
]

Для полного запускаемого примера см. sample_evaluations_builtin_with_traces.py на GitHub. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

Оценка искусственных данных (предварительная версия)

Создайте искусственные тестовые запросы, отправьте их в развернутую модель или агенту Foundry и оцените их ответы с использованием azure_ai_synthetic_data_gen_preview типа источника данных. Используйте этот сценарий, если у вас нет тестового набора данных— служба создает запросы на основе предоставленного запроса (и/или из инструкций агента), выполняет их в целевом объекте и оценивает ответы.

Совет

Прежде чем начать, выполните приступайте.

Как работает оценка искусственных данных

  1. Служба генерирует искусственные запросы на основе вашего prompt и необязательных файлов с начальными данными.
  2. Каждый запрос отправляется в указанный целевой объект (модель или агент) для создания ответа.
  3. Вычислители оценивают каждый ответ с помощью созданного запроса и ответа.
  4. Созданные запросы хранятся в качестве набора данных в проекте для повторного использования.

Параметры

Параметр Обязательно Описание
samples_count Да Максимальное количество генерируемых искусственных запросов теста.
model_deployment_name Да Развертывание модели для создания искусственных запросов. Поддерживаются только модели с возможностями API ответов. Сведения о доступности см. в разделе " Доступность региона API ответов".
prompt Нет Инструкции, описывающие тип создаваемого запроса. Необязательно, если для цели агента настроены инструкции.
output_dataset_name Нет Имя выходного набора данных, в котором хранятся созданные запросы. Если оно не указано, служба автоматически создает имя.
sources Нет Начальные файлы данных (по идентификатору файла) для повышения релевантности созданных запросов. В настоящее время поддерживается только один файл.

Настройка оценщиков и сопоставлений данных

Генератор искусственных данных создает запросы в {{item.query}} поле. Целевой объект создает ответы, доступные в {{sample.output_text}}. Сопоставьте эти поля с вашими оценщиками.

data_source_config = {"type": "azure_ai_source", "scenario": "synthetic_data_gen_preview"}

testing_criteria = [
    {
        "type": "azure_ai_evaluator",
        "name": "coherence",
        "evaluator_name": "builtin.coherence",
        "initialization_parameters": {
            "deployment_name": model_deployment_name,
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_text}}",
        },
    },
]

Создание оценки и запуск

Целевой объект модели

Создайте искусственные запросы и оцените модель:

eval_object = client.evals.create(
    name="Synthetic Data Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate customer service questions about returning defective products",
        "model_deployment_name": model_deployment_name,
        "output_dataset_name": "my-synthetic-dataset",
    },
    "target": {
        "type": "azure_ai_model",
        "model": model_deployment_name,
    },
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="synthetic-data-evaluation",
    data_source=data_source,
)

При необходимости можно добавить системный запрос для формирования поведения целевой модели. При использовании input_messages с синтетическим поколением данных включайте только сообщения ролей system — служба автоматически предоставляет созданные запросы как пользовательские сообщения.

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate customer service questions about returning defective products",
        "model_deployment_name": model_deployment_name,
    },
    "target": {
        "type": "azure_ai_model",
        "model": model_deployment_name,
    },
    "input_messages": {
        "type": "template",
        "template": [
            {
                "type": "message",
                "role": "system",
                "content": {
                    "type": "input_text",
                    "text": "You are a helpful customer service agent. Be empathetic and solution-oriented."
                }
            }
        ]
    },
}

Целевой объект агента

Сгенерируйте искусственные запросы и оцените агента Foundry.

data_source = {
    "type": "azure_ai_synthetic_data_gen_preview",
    "item_generation_params": {
        "type": "synthetic_data_gen_preview",
        "samples_count": 5,
        "prompt": "Generate questions about returning defective products",
        "model_deployment_name": model_deployment_name,
    },
    "target": {
        "type": "azure_ai_agent",
        "name": agent_name,
        "version": agent_version,
    },
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="synthetic-agent-evaluation",
    data_source=data_source,
)

Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов". Ответ содержит output_dataset_id свойство, содержащее идентификатор созданного набора данных, который можно использовать для получения или повторного использования синтетических данных.

Получение результатов

После завершения выполнения оценки получите оцененные результаты и просмотрите их на портале или программным способом.

Опрос результатов

Запуски оценки выполняются асинхронно. Опрашивайте статус выполнения до завершения, затем получите результаты.

import time
from pprint import pprint

while True:
    run = client.evals.runs.retrieve(
        run_id=eval_run.id, eval_id=eval_object.id
    )
    if run.status in ("completed", "failed"):
        break
    time.sleep(5)
    print("Waiting for eval run to complete...")

# Retrieve results
output_items = list(
    client.evals.runs.output_items.list(
        run_id=run.id, eval_id=eval_object.id
    )
)
pprint(output_items)
print(f"Report URL: {run.report_url}")

Интерпретация результатов

Для одного примера данных все вычислители выводят следующую схему.

  • Метка: двоичная метка "pass" или "fail", аналогичная выходным данным модульного теста. Используйте этот результат для упрощения сравнения между оценщиками.
  • Оценка: балл по естественной шкале каждого оценщика. Некоторые оценщики используют детализированную рубрику, оценивая по 5-точечной шкале (оценщики качества) или 7-точечной шкале (оценщики безопасности содержимого). Другие, такие как методы оценки сходства текста, используют оценки F1, которые находятся в диапазоне от 0 до 1. Любой недвоичный "score" преобразуется в "прошел" или "непрошел" в поле "метка" на основе "порога".
  • Пороговое значение: любые не двоичные оценки будут преобразованы в двоичные значения, определяющие «прошел» или «не прошел», на основе значения по умолчанию, которое пользователь может изменить в интерфейсе SDK.
  • Причина: чтобы улучшить понятность, все эксперты LLM-судья также выводят поле обоснования, чтобы объяснить, почему определенная оценка дана.
  • Сведения: (необязательно) Для некоторых оценщиков, таких как tool_call_accuracy, может быть поле "сведения" или флаги, содержащие дополнительные сведения, которые помогут пользователям отлаживать свои приложения.

Пример выходных данных (один элемент)

{
  "type": "azure_ai_evaluator",
  "name": "Coherence",
  "metric": "coherence",
  "score": 4.0,
  "label": "pass",
  "reason": "The response is well-structured and logically organized, presenting information in a clear and coherent manner.",
  "threshold": 3,
  "passed": true
}

Пример выходных данных (агрегат)

Для агрегированных результатов по нескольким примерам данных (набору данных) средняя скорость примеров с "pass" формирует скорость передачи для этого набора данных.

{
  "eval_id": "eval_abc123",
  "run_id": "run_xyz789",
  "status": "completed",
  "result_counts": {
    "passed": 85,
    "failed": 15,
    "total": 100
  },
  "per_testing_criteria_results": [
    {
      "name": "coherence",
      "passed": 92,
      "failed": 8,
      "pass_rate": 0.92
    },
    {
      "name": "relevance", 
      "passed": 78,
      "failed": 22,
      "pass_rate": 0.78
    }
  ]
}

Устранение неполадок

Выполнение задания в течение длительного времени

Задание оценки может оставаться в состоянии выполнения в течение длительного периода. Обычно это происходит, когда развертывание модели OpenAI Azure не имеет достаточной емкости, что приводит к повторным запросам службы.

Разрешение:

  1. Отмена текущего задания оценки с помощью client.evals.runs.cancel(run_id, eval_id=eval_id).
  2. Увеличьте емкость модели на портале Azure.
  3. Снова запустите оценку.

Ошибки проверки подлинности

Если вы получаете сообщение об ошибке 401 Unauthorized или 403 Forbidden, убедитесь, что:

  • DefaultAzureCredential настроен правильно (при использовании Azure CLI запустить az login).
  • У вашей учетной записи есть роль "Пользователь Foundry" в проекте Foundry .
  • URL-адрес конечной точки проекта является правильным и включает имена учетных записей и проектов.

Ошибки формата данных

Если оценка завершается ошибкой схемы или сопоставления данных:

  • Убедитесь, что в файле JSONL есть один допустимый объект JSON для каждой строки.
  • Убедитесь, что имена полей соответствуют data_mapping именам полей в JSONL-файле точно (учитывает регистр).
  • Убедитесь, что item_schema свойства соответствуют полям в наборе данных.

Ошибки ограничения скорости

Создание запусков оценки ограничено скоростью на уровне клиента, подписки и проекта. Если вы получите 429 Too Many Requests ответ:

  • Проверьте заголовок ответа retry-after, чтобы узнать рекомендуемое время ожидания.
  • Просмотрите текст ответа для сведений об ограничении скорости.
  • Используйте экспоненциальное откладывание при повторных неудачных запросах.

Если задание оценки завершается ошибкой 429 во время выполнения:

  • Уменьшите размер набора данных оценки или разделите его на меньшие пакеты.
  • Увеличьте квоту токенов в минуту (TPM) для вашей модели на портале Azure.

Ошибки средства оценки агента

Если средство оценки агента возвращает ошибку для неподдерживаемых средств:

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