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

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

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

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

Совет

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

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

Оценка облака состоит из трех этапов:

  1. Определите, что нужно оценить. Опишите структуру данных (data_source_config) и оценщики (критерии тестирования), по которым она оценивается.
  2. Создайте оценку. Отправьте определение с помощью openai_client.evals.create().
  3. Запустите его и прочтите результаты. Запустите запуск с помощью openai_client.evals.runs.create()опроса, пока он не завершится, и прочтите результаты оценки. См. статью "Получение результатов " для схемы результатов.

В оставшейся части этого раздела рассматриваются входные данные для шага 1: выбор сценария, а затем выбор оценщиков.

Выберите начальную точку

Существующий набор данных

Используйте этот вариант, если у вас уже есть запросы и ответы, сохранённые в файле (или запросы вместе с эталонными ответами), и вы просто хотите, чтобы Foundry оценил их. JSONL поддерживает как строки на уровне отдельных реплик, так и входные данные на уровне всей беседы; CSV поддерживает только строки на уровне отдельных реплик.

Сценарий Когда следует использовать Тип источника данных
Оценка набора данных на уровне реплик Каждая строка является одной query/response парой, при необходимости с context или ground_truth. jsonl Или csv
Оценка набора данных на уровне беседы (предварительная версия) Каждая строка — это беседа, выраженная как messages массив. jsonl

Данные в Foundry или Application Insights

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

Сценарий Когда следует использовать Тип источника данных
Оценка ответа агента Ваш агент работает в Foundry, и у вас есть идентификаторы ответов, которые нужно оценить. azure_ai_responses
Оценка трассировки на уровне хода (предварительная версия) Ваш агент отправляет трассировки OpenTelemetry в службу Application Insights, включая фреймворки, не относящиеся к Foundry, такие как LangChain, а также пользовательские агенты с инструментированием OpenTelemetry. Каждая трассировка оценивается независимо. azure_ai_trace_data_source_preview
Оценка трассировки на уровне разговора (предварительная версия) Те же источники трассировки, но оценивайте беседы целиком — по идентификатору беседы или с фильтром по агенту и выборкой. azure_ai_trace_data_source_preview

Входные данные без ответов

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

Сценарий Когда следует использовать Источник данных или целевой объект
Завершение целевых моделей У вас есть запросы, и вы хотите оценить ответы развернутой модели. azure_ai_target_completionsazure_ai_model
Завершение целевого объекта агента У вас есть запросы и требуется оценить ответы от агента Foundry. azure_ai_target_completionsazure_ai_agent
Моделирование бесед (предварительная версия) У вас есть описания сценариев (без запросов); Foundry имитирует пользователя, управляющего взаимодействием на уровне беседы с агентом. azure_ai_target_completionsazure_ai_agent

Пока нет данных

Используйте этот путь, если вы создаёте новую модель или агента и ещё не собрали никаких входных данных. Foundry создает тестовые данные с нуля - выберите искусственные запросы для широкого охвата качества или состязательные запросы на тестирование безопасности.

Сценарий Когда следует использовать Источник данных или целевой объект
Оценка искусственных данных (предварительная версия) Вам нужно качественное покрытие, превосходящее то, которого можно добиться вручную. Foundry создает тестовые запросы, отправляет их в целевой объект и оценивает ответы. azure_ai_synthetic_data_gen_preview azure_ai_model→ илиazure_ai_agent
Оценка красной команды Вам нужно автоматизированное adversarial-тестирование — Foundry генерирует запросы для обхода ограничений и промпты с вредоносным контентом и оценивает, как целевая модель на них отвечает. azure_ai_red_team azure_ai_model→ илиazure_ai_agent

Выбор оценщиков

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

Обзор доступных оценщиков и рекомендации по их выбору см. в встроенных оценщиках и пользовательских оценщиках.

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

  • Проект 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.2.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
openai_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": {
            "model": model_deployment_name
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "initialization_parameters": {
            "model": 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 = openai_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 = openai_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": {"model": model_deployment_name},
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        "initialization_parameters": {"model": model_deployment_name},
    },
    {
        "type": "azure_ai_evaluator",
        "name": "f1",
        "evaluator_name": "builtin.f1_score",
    },
]

# Create the evaluation
eval_object = openai_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 = openai_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": {
            "model": 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 = openai_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 = openai_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": {
            "model": 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": {
            "model": model_deployment_name,
        },
        "data_mapping": {
            "query": "{{item.query}}",
            "response": "{{sample.output_items}}",
        },
    },
]

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

eval_object = openai_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 = openai_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 = openai_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 = openai_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 = openai_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": {
            "model": model_deployment_name,
        },
    },
    {
        "type": "azure_ai_evaluator",
        "name": "violence",
        "evaluator_name": "builtin.violence",
    },
]

eval_object = openai_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 = openai_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 Agent Service, — включая LangChain и пользовательские фреймворки. Если агент выдает диапазоны OpenTelemetry после семантических соглашений GenAI в Application Insights, оценка трассировки может оценить его взаимодействие с помощью тех же вычислителей, доступных для агентов Foundry.

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

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

Совет

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

Интеллектуальная выборка

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

Как работает интеллектуальная выборка

Алгоритм выборки использует подход MinHash с выбором наиболее удалённых элементов для обеспечения разнообразия и выполняется в несколько этапов:

  1. Точная дедупликация — удаляет дублирующиеся трассировки из пула.
  2. Жесткие фильтры — удаляет неработающие сеансы, усеченные трассировки и неправильно сформированные вызовы инструментов, которые не подходят для оценки.
  3. Агрегирование — объединяет сигналы уровня трассировки в единое представление.
  4. Выбор по методу farthest-first на основе MinHash — вычисляет локально-чувствительные хэши (сигнатуры MinHash) пользовательского текста, чтобы оценить сходство между трассировками, а затем итеративно выбирает наименее похожую трассировку из оставшегося пула. Каждый последовательный выбор обеспечивает максимальное расстояние от всех ранее выбранных трассировок.

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

Интеллектуальная выборка особенно эффективна для:

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

Алгоритм выполняется полностью на локальных вычислительных ресурсах без дополнительных вызовов API, поэтому не требует дополнительных затрат на вывод модели за рамки самой оценки.

Пример интеллектуальной выборки

# Eval group for trace-based evaluations
data_source_config = {
    "type": "azure_ai_source",
    "scenario": "traces",
}

print("Creating trace-based evaluation group")
eval_object = client.evals.create(
    name="Trace Evaluation (Agent Smart Filter)",
    data_source_config=data_source_config,  # type: ignore
    testing_criteria=testing_criteria,
)
print(f"Evaluation created (id: {eval_object.id})")

# Compute time window in unix seconds
# Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
now_unix = int(time.time())
end_time = now_unix + 600
start_time = now_unix - (args.lookback_hours * 3600)

# Build trace_source based on mode
trace_source: dict = {
    "type": "agent_filter",
    "start_time": start_time,
    "end_time": end_time,
    "max_traces": args.max_traces,
    "filter_strategy": "smart_filtering"
}

# Add agent name/version or agent id
trace_source["agent_name"] = agent_name
trace_source["agent_version"] = agent_version
## trace_source["agent_id"] = args.agent_id

data_source = {
    "type": "azure_ai_trace_data_source_preview",
    "trace_source": trace_source,
}

eval_run = client.evals.runs.create(
    eval_id=eval_object.id,
    name="trace-evaluation-agent-smart-filter-run",
    data_source=data_source,  # type: ignore
)

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

Для оценки трассировки агент должен выдавать диапазоны, которые соответствуют семантике 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. Если вывод также содержит type: tool_call или type: 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.2.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 = openai_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 = openai_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 = openai_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 = openai_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": {
            "model": 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": {
            "model": 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. Сведения о завершении и интерпретации результатов см. в разделе "Получение результатов".

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

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

Совет

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

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

  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": {
            "model": 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 = openai_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 = openai_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 = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="synthetic-agent-evaluation",
    data_source=data_source,
)

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

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

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

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

Поворот 1 — пользователь: "Мне нужно сбросить пароль". Агент: "Я нашел свою учетную запись. Я отправлю вам ссылку для сброса пароля.

Ход 2 — Пользователь: "Я не получил письмо." Агент: "Я повторно отправил ссылку." Проверьте спам".

Ход 3 — Пользователь: "По-прежнему ничего. «Можете просто сбросить это напрямую?» Агент: «Я отправил ещё одну ссылку для сброса».

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

Оценка на уровне беседы отличается от оценки на уровне реплики несколькими способами:

Аспект Уровень поворота Уровень беседы
Объем Отдельные пары ответов на запросы Завершайте беседы с несколькими репликами
Метрики Качество и безопасность каждого ответа Результаты на уровне беседы и удовлетворенность пользователей
Формат данных JSONL с полями query и response JSONL с массивом, messages содержащим полный диалог
Сценарий использования Тестирование ответов отдельных моделей Тестирование сквозных сценариев работы с агентом

Оценка на уровне беседы поддерживает четыре варианта источника данных:

Опция Когда следует использовать Тип источника данных
Из набора данных или встроенного набора данных У вас есть локальные трассировки диалогов или тестовые данные jsonl с file_id или file_content
По идентификатору беседы Вы хотите оценить определенные беседы из App Insights azure_ai_trace_data_source_preview С trace_source
По фильтру агентов с выборкой Вы хотите оценить общее качество работы агента по выборке продукционного трафика azure_ai_trace_data_source_preview С trace_source
Имитированные беседы Вы хотите создать синтетические тестовые диалоги azure_ai_target_completions С conversation_gen_preview

Выбор уровня оценки

Параметр evaluation_level в запуске определяет, оценивают ли оценщики отдельные реплики или полные диалоги:

Ценность Behavior
"turn" Вычислители оценивают каждый поворот независимо.
"conversation" Оценщики оценивают весь разговор целиком.
(опущено) По умолчанию — "turn".

Важно

Совместимость вычислителя: каждый вычислитель поддерживает определенные уровни оценки. Проверьте поле оценщика supported_evaluation_levels в каталоге оценщиков.

  • Оценщики только поворота (например, fluency, relevance) нельзя использовать с evaluation_level="conversation".
  • В настоящее время все оценщики на уровне диалога поддерживают оба уровня: "turn" и "conversation".

Распространенные ошибки

Error Причина Решение
Несовместимый уровень оценки Использование evaluation_level="conversation" с вычислителем только для поворота Удалите средство оценки только для поворота или измените его на evaluation_level="turn"

Подготовка данных беседы

Создайте JSONL-файл, в котором каждая строка содержит полную беседу в messages поле. Каждое сообщение должно содержать role (пользователя, помощника или системы) и content. Полный пример см. в примерах оценки диалогов в SDK:

 {"messages": [{"role": "user", "content": "What's my account balance?"}, {"role": "assistant", "content": "Your current balance is $1,234.56."}, {"role": "user", "content": "Thanks!"}, {"role": "assistant", "content": "You're welcome! Is there anything else?"}]}

Кроме того, можно включить определения инструментов и вызовы инструментов, если агент использует средства:

{"messages": [{"role": "user", "content": "What is the capital of France?"}, {"role": "assistant", "content": "Paris"}]}
{"messages": [{"role": "user", "content": "How do I reverse a string in Python?"}, {"role": "assistant", "content": "You can reverse a string in Python by using slicing: string[::-1]"}]}
{"messages": [{"role": "user", "content": "What are the main causes of climate change?"}, {"role": "assistant", "content": "The main causes of climate change are the increase in greenhouse gases in the atmosphere, primarily due to human activities such as burning fossil fuels and deforestation."}]}
{"messages": [{"role": "user", "content": "What's my account balance?"}, {"role": "assistant", "content": null, "tool_calls": [{"id": "call_abc123", "type": "function", "function": {"name": "get_account_balance", "arguments": "{\"account_id\": \"ACCT-7890\"}"}}]}, {"role": "tool", "tool_call_id": "call_abc123", "content": "{ \"balance\": 1234.56, \"currency\": \"USD\" }"}, {"role": "assistant", "content": "Your current balance is 1,234.56."}, {"role": "user", "content": "Thanks!"}, {"role": "assistant", "content": "You're welcome! Is there anything else?"}], "tool_definitions": [{"name": "get_account_balance", "description": "Retrieves the current balance for a customer account", "parameters": {"type": "object", "properties": {"account_id": {"type": "string"}}, "required": ["account_id"]}}]}
{"messages": [{"role": "user", "content": "Explain the theory of relativity in simple terms."}, {"role": "assistant", "content": "Einstein's theory of relativity shows that space and time are interconnected and relative to the observer's frame of reference."}]}
{"messages": [{"role": "user", "content": "What's the weather in Seattle?"}, {"role": "assistant", "content": null, "tool_calls": [{"id": "call_002", "type": "function", "function": {"name": "get_weather", "arguments": "{\"location\": \"Seattle, WA\"}"}}]}, {"role": "tool", "tool_call_id": "call_002", "content": "{ \"temperature\": 55, \"condition\": \"Cloudy\" }"}, {"role": "assistant", "content": "It's currently 55F and cloudy in Seattle."}], "tool_definitions": [{"name": "get_weather", "description": "Get the current weather for a location", "parameters": {"type": "object", "properties": {"location": {"type": "string"}}, "required": ["location"]}}]}
{"messages": [{"role": "user", "content": "What is the tallest mountain in the world?"}, {"role": "assistant", "content": "Mount Everest is the tallest mountain in the world."}]}
{"messages": [{"role": "user", "content": "Is 4 x 2 = 16?"}, {"role": "assistant", "content": "No, 4 x 2 = 8."}]}
{"messages": [{"role": "user", "content": "What is the best Italian desert?"}, {"role": "assistant", "content": "Tiramisu is a popular Italian dessert."}]}
{"messages": [{"role": "user", "content": "What is the chemical formula for water?"}, {"role": "assistant", "content": "The chemical formula for water is H2O."}]}

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

Укажите схему для данных беседы, "messages", и выберите средства оценки, предназначенные для оценки на уровне беседы. Оценщики на уровне всей беседы оценивают всё взаимодействие, а не отдельные реплики.

pip install "azure-ai-projects>=2.2.0"
import os
from openai.types.eval_create_params import DataSourceConfigCustom
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    data_source_config = DataSourceConfigCustom(
        type="custom",
        item_schema={
            "type": "object",
            "properties": {
                "messages": {"type": "array"},
                "tool_definitions": {"type": "array"},
            },
            "required": ["messages"],
        },
        include_sample_schema=False,
    )

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

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

Подготовка: скачайте sample_data_multiturn_conversations.jsonl

from openai.types.evals.create_eval_jsonl_run_data_source_param import (
    CreateEvalJSONLRunDataSourceParam,
    SourceFileID,
)

# Upload conversation data
data_id = project_client.datasets.upload_file(
    name="multiturn-conversation-data",
    version="1",
    file_path="./sample_data_multiturn_conversations.jsonl",
).id

# Create the evaluation
eval_object = openai_client.evals.create(
    name="Multi-turn Conversation Evaluation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a run with evaluation_level set to "conversation"
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="multiturn-conversation-run",
    data_source=CreateEvalJSONLRunDataSourceParam(
        type="jsonl",
        source=SourceFileID(
            type="file_id",
            id=data_id,
        ),
    ),
    extra_body={"evaluation_level": "conversation"},
)

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

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

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

Где найти идентификаторы разговоров

Найдите идентификаторы бесед в:

  • Интерфейс журналов трассировки в Application Insights — перейдите к нужным трассировкам и найдите поле conversation_id в сведениях о трассировке.
  • Данные журналов вашего приложения — если при создании ответов агента вы явно задаете conversation_id, извлеките его из журналов.
  • Контекст трассировки OpenTelemetryconversation_id также может определяться по заголовку traceparent, если ваш агент использует стандартное распространение контекста трассировки.

Примечание

Определения инструментов автоматически извлекаются из трассировок или запрашиваются из реестра агентов. Вам не нужно предоставлять их в запросе.

Параметры для поиска по идентификатору разговора

Параметр Обязательно Описание
conversation_ids Да Массив идентификаторов бесед для оценки.
lookback_hours Нет Часы для поиска обратно из end_time. По умолчанию — семь дней (168 часов).
end_time Нет Конец окна поиска (формат ISO 8601). По умолчанию используется текущее время.
import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]

# Provide conversation IDs or trace IDs from App Insights
conversation_ids = ["conversation_1234", "conversation_5678"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Eval group for trace-based evaluations
    data_source_config = {
        "type": "azure_ai_source",
        "scenario": "traces",
    }

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

    # Create evaluation with traces scenario
    eval_object = openai_client.evals.create(
        name="Multi-turn Trace Evaluation (by ID)",
        data_source_config=data_source_config,
        testing_criteria=testing_criteria,
    )

    # Run evaluation on specific conversation IDs
    eval_run = openai_client.evals.runs.create(
        eval_id=eval_object.id,
        name="multiturn-trace-by-id-run",
        data_source={
            "type": "azure_ai_trace_data_source_preview",
            "trace_source": {
                "type": "conversation_id_source",
                "conversation_ids": conversation_ids,
            },
        },
        extra_body={"evaluation_level": "conversation"},
    )

Примечание

  • Прием данных Application Insights может привести к задержке между созданием трассировок и их доступностью для оценки. Если запросу не удается найти трассировки, подождите несколько минут и повторите попытку.
  • Максимальное значение обратного просмотра составляет 7 дней (168 часов). Чтобы получить доступ к старым трассировкам, используйте start_time и end_time в пределах ограничений хранения App Insights.

Оцените выбранные беседы с помощью фильтра агентов

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

Агент, указанный для фильтрации, может быть частью беседы с несколькими агентами. Фильтр соответствует любой беседе, в которой участвовал этот агент.

Примечание

Определения инструментов автоматически извлекаются из трассировок или запрашиваются из реестра агентов. Вам не нужно предоставлять их в запросе.

Идентификационные поля агента

Укажите агент для фильтрации с помощью одного из следующих форматов:

Format Example Описание
agent_name + agent_version "agent_name": "my-agent", "agent_version": "1" Два отдельных поля. Если agent_version опущено, используйте последнюю версию.
agent_id "agent_id": "my-agent:1" Одна строка в "name:version" формате.

Стратегии фильтрации

Стратегия Описание
random_sampling (По умолчанию) Равномерная случайная выборка до max_traces бесед.
smart_filtering Эвристика, управляемая сервисом и отдающая приоритет «интересным» трассировкам — беседам с потенциальными проблемами, пограничными случаями или аномалиями.

Параметры

Параметр Обязательно Описание
agent_name Да Имя агента для фильтрации трассировок по имени.
agent_version Нет Агентская версия. Если опущено, используется последняя версия.
agent_id Нет Альтернатива agent_name + agent_version. Одна строка в формате "name:version".
start_time Да Начало периода времени (секунды эпохи Unix, UTC).
end_time Да Окончание периода времени (секунды эпохи Unix, UTC). Добавьте запас в +600 секунд, чтобы избежать задержки приёма данных.
max_traces Нет Максимальное количество бесед для примера. По умолчанию используется значение 1 000.
filter_strategy Нет "random_sampling" (по умолчанию) или "smart_filtering" (эвристика, управляемая сервисом и отдающая предпочтение интересным трассировкам).

Важно

Период времени () должен быть не менее end_time - start_time (900 секунд). Это требование существует, так как запросы на уровне беседы применяют 5-минутный буфер бездействия на каждом краю, чтобы избежать частичных бесед.

import os
import time
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ["FOUNDRY_AGENT_NAME"]
agent_version = os.environ.get("FOUNDRY_AGENT_VERSION", "")

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Eval group for trace-based evaluations
    data_source_config = {
        "type": "azure_ai_source",
        "scenario": "traces",
    }

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

    eval_object = openai_client.evals.create(
        name="Multi-turn Trace Evaluation (Agent Filter)",
        data_source_config=data_source_config,
        testing_criteria=testing_criteria,
    )

    # Compute time window in unix seconds
    # Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
    now_unix = int(time.time())
    end_time = now_unix + 600
    start_time = now_unix - (24 * 3600)  # 24 hours lookback

    # Build trace_source with agent filter
    trace_source = {
        "type": "agent_filter",
        "agent_name": agent_name,
        "start_time": start_time,
        "end_time": end_time,
        "max_traces": 5,
    }
    if agent_version:
        trace_source["agent_version"] = agent_version

    # Run evaluation on sampled agent conversations
    eval_run = openai_client.evals.runs.create(
        eval_id=eval_object.id,
        name="multiturn-agent-filter-run",
        data_source={
            "type": "azure_ai_trace_data_source_preview",
            "trace_source": trace_source,
        },
        extra_body={"evaluation_level": "conversation"},
    )

Примечание

Интервал времени запроса App Insights в настоящее время ограничен не более 7 дней (168 часов). Вы не можете получить доступ к трассировкам старше 7 дней, если явно не укажете start_time и end_time в рамках срока хранения данных в App Insights.

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

Моделирование бесед

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

Этот подход полезен для:

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

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

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

Подготовка данных сценария

Создайте JSONL-файл, в котором каждая строка описывает сценарий для имитированного пользователя. Для схемы требуется id, test_case_descriptionи desired_num_turns. Включите сведения о цели пользователя, контексте и любых ограничениях. Полный пример см. в примерах оценки диалогов в SDK.


{"id": "contoso_refund_timeline", "test_case_description": "Customer returned an item to Contoso Electronics 5 days ago and hasn't received their refund yet. They want to know how long Contoso refunds take.", "desired_num_turns": 10}
{"id": "contoso_store_hours_lookup", "test_case_description": "Customer wants to know what time the Contoso Electronics store closes today. Simple single-fact question with possibly one clarifying turn about which location.", "desired_num_turns": 3}

Параметры

Параметр Обязательно Описание
num_conversations Нет Количество бесед, генерируемых для каждого сценария. Значение по умолчанию — 5, ограничение на стороне сервера — 5.
max_turns Нет Максимальное количество ходов (обменов) в одном разговоре. Значение по умолчанию — 10, ограничение на стороне сервера — 20.
model Да Развертывание модели для имитации пользователя. Например: gpt-4.1.
sampling_params Нет Параметры выборки для модели симулятора, включая temperature, top_pи max_completion_tokens.
data_mapping Нет Сопоставляет поля из сценария JSONL с параметрами моделирования. Распространенные сопоставления: test_case_description, id, desired_num_turns.

Определить оценщики

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

import os
from openai.types.eval_create_params import DataSourceConfigCustom
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator, PromptAgentDefinition

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "")

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
    project_client.get_openai_client() as openai_client,
):
    # Simulation uses the same "custom" eval group type as dataset evaluation (S1),
    # since the generated conversations follow the same messages schema.
    data_source_config = DataSourceConfigCustom(
        type="custom",
        item_schema={
            "type": "object",
            "properties": {
                "messages": {"type": "array"},
            },
            "required": ["messages"],
        },
        include_sample_schema=False,
    )

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="task_completion",
            evaluator_name="builtin.task_completion",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="conversation_coherence",
            evaluator_name="builtin.coherence",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="groundedness",
            evaluator_name="builtin.groundedness",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

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

Подготовка: скачивание sample_data_simulation_scenarios.jsonl.

# Create (or update) an agent to simulate against
agent = project_client.agents.create_version(
    agent_name=agent_name,
    definition=PromptAgentDefinition(
        model=model_deployment_name,
        instructions="You are a helpful customer service agent. Be empathetic and solution-oriented.",
    ),
)

# Upload scenario data
scenarios_id = project_client.datasets.upload_file(
    name="simulation-scenarios",
    version="1",
    file_path="./sample_data_simulation_scenarios.jsonl",
).id

# Create the evaluation
eval_object = openai_client.evals.create(
    name="Multi-turn Conversation Simulation",
    data_source_config=data_source_config,
    testing_criteria=testing_criteria,
)

# Create a simulation run
eval_run = openai_client.evals.runs.create(
    eval_id=eval_object.id,
    name="conversation-simulation-run",
    data_source={
        "type": "azure_ai_target_completions",
        "source": {
            "type": "file_id",
            "id": scenarios_id,
        },
        "target": {
            "type": "azure_ai_agent",
            "name": agent.name,
            "version": agent.version,
        },
        "item_generation_params": {
            "type": "conversation_gen_preview",
            "model": model_deployment_name,
            "num_conversations": 2,
            "max_turns": 5,
            "sampling_params": {
                "temperature": 0.7,
                "top_p": 1.0,
                "max_completion_tokens": 800,
            },
            "data_mapping": {
                "test_case_description": "test_case_description",
                "id": "id",
                "desired_num_turns": "desired_num_turns",
            },
        },
    },
    extra_body={"evaluation_level": "conversation"},
)

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

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

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

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

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

import time
from pprint import pprint

while True:
    run = openai_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(
    openai_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. Любая небинарная "оценка" преобразуется в "pass" или "fail" в поле "label" на основе значения "threshold".
  • Пороговое значение: любые небинарные оценки преобразуются в двоичный результат — «прошёл» или «не прошёл» — на основе порогового значения по умолчанию, который пользователь может изменить в 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. Отмените текущее задание оценки с помощью openai_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.

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

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

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