Execute avaliações na cloud usando o Microsoft Foundry SDK

Neste artigo, aprende como executar avaliações na cloud para testes de pré-implementação num conjunto de dados de teste.

Use avaliações na cloud para a maioria dos cenários – especialmente ao testar em escala, integrar avaliações em pipelines de integração contínua e entrega contínua (CI/CD), ou realizar testes pré-implementação. Executar avaliações na cloud elimina a necessidade de gerir a infraestrutura de computação local e suporta fluxos de trabalho de testes automatizados em grande escala. Também pode agendar avaliações para serem realizadas de forma recorrente, ou configurar uma avaliação contínua para avaliar automaticamente as respostas dos agentes amostrados em produção.

Os resultados das avaliações na cloud são armazenados no seu projeto Foundry. Pode rever os resultados no portal, recuperá-los através do SDK ou encaminhá-los para o Application Insights se estiver ligado. A avaliação na cloud suporta todos os avaliadores pré-definidos curados pela Microsoft e os seus próprios avaliadores personalizados. Os avaliadores são geridos no catálogo de avaliadores com o mesmo âmbito de projeto e controlo de acesso baseado em funções.

Dica

Para exemplos completos executáveis, consulte as amostras de avaliação do SDK Python em GitHub.

Como funciona a avaliação na cloud

Uma avaliação na nuvem tem três passos:

  1. Define o que avaliar. Descreva a forma dos seus dados (os data_source_config) e os avaliadores (critérios de teste) que os avaliam.
  2. Crie a avaliação. Submeta a definição usando openai_client.evals.create().
  3. Executa e lê os resultados. Inicie uma execução usando openai_client.evals.runs.create(), sonde até que esteja concluída e leia os resultados com pontuação. Veja Obter resultados para o esquema de resultados.

O resto desta secção percorre as entradas até ao passo 1: escolher um cenário e depois escolher avaliadores.

Escolhe o teu ponto de partida

Conjunto de dados existente

Usa este caminho quando já tiveres consultas e respostas recolhidas num ficheiro (ou consultas mais a verdade fundamental) e só queres que a Foundry as avalie. O JSONL suporta tanto linhas ao nível do turno como entradas ao nível da conversa; o CSV é apenas ao nível do turno.

Cenário Quando usar Tipo de fonte de dados
Avaliação de conjuntos de dados a nível de turno Cada linha corresponde a um par query/response, opcionalmente com context ou ground_truth. jsonl ou csv
Avaliação de conjunto de dados ao nível da conversa (pré-visualização) Cada linha é uma conversa expressa como um messages array. jsonl

Dados em Foundry ou Application Insights

Utilize este caminho quando o seu agente já estiver em execução e quiser avaliar o que realmente aconteceu. Em vez de mover os dados para fora, indica ao Foundry os dados onde estes já se encontram — através do ID de resposta do Foundry ou do ID de rastreio ou de conversa do Application Insights.

Cenário Quando usar Tipo de fonte de dados
Avaliação da resposta do agente O teu agente corre na Foundry e tens IDs de resposta para pontuar. azure_ai_responses
Avaliação de traço ao nível da curva (pré-visualização) O seu agente emite traços OpenTelemetry para o Application Insights – incluindo frameworks que não sejam do Foundry, como o LangChain, ou agentes personalizados instrumentados com o OpenTelemetry. Cada traço é pontuado de forma independente. azure_ai_trace_data_source_preview
Avaliação de rastreios ao nível da conversa (pré-visualização) As mesmas fontes de rastreio, mas avalie conversas completas — por ID da conversa ou por filtro de agente, com amostragem. azure_ai_trace_data_source_preview

Entradas sem respostas

Utiliza este caminho quando tiveres os dados de entrada, mas ainda não tiveres respostas. O Foundry gera respostas tendo como alvo um modelo ou agente durante a avaliação e, em seguida, pontua-as. Escolhe uma linha consoante a tua entrada seja consultas (enviadas como turnos separados) ou descrições de cenários (utilizadas para orientar uma interação ao nível de toda a conversa).

Cenário Quando usar Fonte de dados / alvo
Conclusões do modelo alvo Tem dúvidas e quer avaliar as respostas de uma implementação de modelo. azure_ai_target_completionsazure_ai_model
Conclusões do destino do agente Tem dúvidas e quer avaliar as respostas de um agente da Foundry. azure_ai_target_completionsazure_ai_agent
Simulação de conversa (pré-visualização) Tens descrições de cenários (sem consultas); O Foundry simula um utilizador a conduzir uma interação ao nível da conversa com o agente. azure_ai_target_completionsazure_ai_agent

Ainda sem dados

Usa este caminho quando estiveres a construir um novo modelo ou agente e ainda não tiveres recolhido inputs. O Foundry gera os dados de teste do zero — escolha consultas sintéticas para uma cobertura alargada da qualidade ou prompts adversariais para testes de segurança.

Cenário Quando usar Fonte de dados / alvo
Avaliação de dados sintéticos (pré-visualização) Quer uma cobertura de qualidade para além do que escreveria à mão. O Foundry gera consultas de teste, envia-as para o destino e avalia as respostas. azure_ai_synthetic_data_gen_previewazure_ai_model ou azure_ai_agent
Avaliação da equipa vermelha Queres testes adversariais automatizados – o Foundry gera jailbreaks e prompts para conteúdos prejudiciais e pontua como o alvo responde. azure_ai_red_teamazure_ai_model ou azure_ai_agent

Escolha avaliadores

Cada cenário vincula avaliadores a campos nos seus dados através de mapeamentos de colunas. Os campos disponíveis dependem da fonte de dados. Cenários de conjunto de dados expõem os seus campos personalizados de item, enquanto cenários gerados pelo alvo também expõem a resposta do modelo ou agente através de um esquema de exemplo. As subsecções por cenário mais adiante neste artigo mostram os mapeamentos das colunas para cada caso.

Para uma visão geral dos avaliadores disponíveis e como os escolher, consulte avaliadores incorporados e avaliadores personalizados.

Pré-requisitos

  • Um projeto da Foundry.

  • Uma implementação do Azure OpenAI com um modelo GPT que suporta a conclusão de chat (por exemplo, gpt-5-mini).

  • Papel de utilizador da Foundry no projeto Foundry.

    Importante

    As funções RBAC do Foundry foram recentemente renomeadas. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager foram anteriormente nomeados Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. Poderá ainda ver os nomes anteriores em alguns locais enquanto esta alteração de nome está a ser implementada. Os IDs das funções e as permissões principais não são alterados por esta mudança de nome.

  • Opcionalmente, pode usar a sua própria conta de armazenamento para fazer avaliações.

Nota

Algumas funcionalidades de avaliação têm restrições regionais. Consulte as regiões suportadas para mais detalhes.

Introdução

Instala o SDK e configura o teu cliente:

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()

Preparar os dados de entrada

A maioria dos cenários de avaliação requer dados de entrada. Pode fornecer dados de duas formas:

Carregue um ficheiro JSONL ou CSV para criar um conjunto de dados versionado no seu projeto Foundry. Os conjuntos de dados suportam versionamento e reutilização em múltiplas execuções de avaliação. Use esta abordagem para testes de produção e fluxos de trabalho CI/CD.

Prepare um ficheiro JSONL com um objeto JSON por linha contendo os campos de que os seus avaliadores precisam:

{"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."}

Ou prepare um ficheiro CSV com cabeçalhos de coluna que correspondam aos campos do avaliador:

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

Fornecer dados em linha

Para experimentação rápida com pequenos conjuntos de teste, forneça os dados diretamente no pedido de avaliação usando 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",
            }
        ),
    ],
)

Passe source como campo "source" na configuração da sua fonte de dados ao criar uma execução. As secções de cenário que se seguem usam file_id por defeito.

Avaliação do conjunto de dados

Avaliar respostas pré-computadas num ficheiro JSONL usando o tipo de jsonl fonte de dados. Este cenário é útil quando já tem resultados do modelo e quer avaliar a sua qualidade.

Dica

Antes de começar, complete o Início e Prepare os dados de entrada.

Defina o esquema de dados e os avaliadores

Especifique o esquema que corresponde aos seus campos JSONL e selecione os avaliadores (critérios de teste) a executar. Use o data_mapping parâmetro para ligar campos dos seus dados de entrada aos parâmetros do avaliador com {{item.field}} sintaxe. Inclua data_mapping sempre com os campos de entrada exigidos para cada avaliador. Os nomes dos seus campos devem corresponder aos do seu ficheiro JSONL — por exemplo, se os seus dados tiverem "question" em vez de "query", use "{{item.question}}" no mapeamento. Para os parâmetros exigidos por avaliador, consulte avaliadores incorporados.

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}}",
        },
    },
]

Criar avaliação e executar

Crie a avaliação e depois inicie uma execução com o seu conjunto de dados carregado. A execução executa cada avaliador em cada linha do conjunto de dados.

# 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,
        ),
    ),
)

Para um exemplo completo executável, veja sample_evaluations_builtin_with_dataset_id.py em GitHub. Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Avaliação de conjuntos de dados CSV

Avalie respostas pré-computadas num ficheiro CSV usando o tipo de csv fonte de dados. Este cenário funciona da mesma forma que a avaliação de conjuntos de dados , mas aceita ficheiros CSV em vez de JSONL. Usa CSV quando os teus dados já estiverem em formato de folha de cálculo ou tabular.

Dica

Antes de começar, complete o Início e Prepare os dados de entrada.

Preparar um ficheiro CSV

Crie um ficheiro CSV com cabeçalhos de coluna que correspondam aos campos que os seus avaliadores precisam. Cada linha representa um caso de teste.

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.

Carregar e executar

Carrega o ficheiro CSV como um conjunto de dados. Depois, crie uma avaliação usando o csv tipo de fonte de dados. A definição do esquema e a configuração do avaliador são as mesmas das avaliações JSONL. A única diferença é o "type": "csv" na fonte de dados.

# 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,
        },
    },
)

Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Avaliação de alvos do modelo

Enviar consultas para um modelo implementado em tempo de execução. Avalie as respostas usando o azure_ai_target_completions tipo de fonte de dados com um azure_ai_model alvo. Os seus dados de entrada contêm consultas. O modelo gera respostas, que depois avalias.

Dica

Antes de começar, complete o Início e Prepare os dados de entrada.

Defina o modelo de mensagem e o destino

O input_messages modelo controla como as consultas são enviadas para o modelo. Usa {{item.query}} para referenciar campos a partir dos teus dados de entrada. Especifique o modelo a avaliar e parâmetros de amostragem opcionais:

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,
    },
}

Configurar avaliadores e mapeamentos de dados

Quando o modelo gera respostas em tempo de execução, use {{sample.output_text}} in data_mapping para referenciar a saída do modelo. Usa {{item.field}} para referenciar campos a partir dos teus dados de entrada.

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}}",
        },
    },
]

Criar avaliação e executar

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,
)

Para um exemplo completo executável, veja sample_model_evaluation.py em GitHub. Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Dica

Para adicionar outra execução de avaliação, use o mesmo código.

Avaliação do alvo do agente

Envie consultas a um agente Foundry em tempo de execução e avalie as respostas usando o azure_ai_target_completions tipo de fonte de dados com um azure_ai_agent alvo. Este cenário funciona tanto para agentes rápidos como agentes alojados.

Dica

Antes de começar, complete o Início e Prepare os dados de entrada.

Dica

Os agentes alojados que utilizam o protocolo de respostas trabalham com os mesmos exemplos de código apresentados aqui. Para agentes hospedados que utilizam o protocolo de invocações, o input_messages formato é diferente. Consulte o protocolo de invocações de agentes hospedados para mais detalhes.

Defina o modelo de mensagem e o destino

O input_messages modelo controla como as consultas são enviadas ao agente. Usa {{item.query}} para referenciar campos a partir dos teus dados de entrada. Especifique o agente a avaliar pelo nome:

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.
}

Configurar avaliadores e mapeamentos de dados

Quando o agente gera respostas em tempo de execução, use {{sample.*}} variáveis em data_mapping para referenciar a saída do agente:

Variável Descrição Utilização para
{{sample.output_text}} A resposta do agente em texto simples. Avaliadores que esperam uma resposta em cadeia (por exemplo, coherence, violence).
{{sample.output_items}} A saída JSON estruturada do agente, incluindo chamadas de ferramenta. Avaliadores que necessitam de contexto completo de interação (por exemplo, task_adherence).
{{item.field}} Um campo dos seus dados de entrada. Campos de entrada como query ou ground_truth.

Dica

O query campo pode conter JSON estruturado, incluindo mensagens do sistema e histórico de conversas. Alguns avaliadores de agentes, como task_adherence, usam este contexto para uma pontuação mais precisa. Para detalhes sobre formatação de consultas, consulte avaliadores de agentes.

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}}",
        },
    },
]

Criar avaliação e executar

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,
)

Para um exemplo completo executável, veja sample_agent_evaluation.py em GitHub. Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Protocolo de invocações de agentes hospedados

Agentes alojados que utilizam o protocolo de invocações suportam o mesmo azure_ai_agent tipo de alvo, mas utilizam um formato livre input_messages . Em vez do formato estruturado do modelo, forneça um objeto JSON que se mapeie diretamente para o corpo do pedido do /invocations agente. Use {{item.*}} marcadores de posição para substituir campos a partir dos seus dados de entrada.

Se um agente hospedado suportar tanto os protocolos de resposta como de invocação, o serviço passa a usar por defeito o protocolo de invocações.

Defina o formato e o destino da mensagem

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

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

Criar avaliação e executar

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,
)

A configuração do avaliador e os mapeamentos de dados são os mesmos que para a avaliação rápida do agente. Use {{sample.output_text}} para a resposta de texto do agente e {{sample.output_items}} para a saída estruturada completa, incluindo chamadas de ferramenta.

Avaliação da resposta do agente

Recuperar e avaliar as respostas dos agentes Foundry por IDs de resposta usando o azure_ai_responses tipo de fonte de dados. Use este cenário para avaliar interações específicas com agentes depois de ocorrerem.

Dica

Antes de começar, conclua Get started.

Um ID de resposta é um identificador único devolvido cada vez que um agente da Foundry gera uma resposta. Pode recolher IDs de resposta das interações com agentes usando a API de Respostas ou a partir dos registos de rastreamento da sua aplicação. Forneça os IDs em linha como conteúdo do ficheiro, ou carregue-os como um conjunto de dados (ver Preparar dados de entrada).

Recolha IDs de resposta

Cada chamada à API de Respostas devolve um objeto de resposta com um campo único id . Recolha estes IDs das interações da sua aplicação, ou gere-os diretamente:

# 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

Também pode recolher IDs de resposta das interações com agentes nos registos de rastreamento ou pipeline de monitorização da sua aplicação. Cada ID de resposta identifica de forma única uma resposta armazenada que o serviço de avaliação pode recuperar.

Criar avaliação e executar

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,
)

Para um exemplo completo executável, veja sample_agent_response_evaluation.py em GitHub. Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Avaliação de traços (pré-visualização)

Avalie as interações com agentes que o Application Insights já tenha captado. Use o tipo de fonte de dados azure_ai_traces. Este cenário é útil para a avaliação pós-implementação do tráfego real de produção. Pode selecionar traços do seu pipeline de monitorização e executar avaliadores sobre os mesmos sem reexecutar quaisquer pedidos.

Importante

A avaliação de traços é a abordagem recomendada para avaliar agentes não construídos com o Microsoft Foundry Agent Service – incluindo LangChain e frameworks personalizados. Se o seu agente emitir spans OpenTelemetry em conformidade com as convenções semânticas do GenAI para o Application Insights, a avaliação de rastreios pode avaliar as interações do agente através dos mesmos avaliadores disponíveis para os agentes do Foundry.

A avaliação de traços suporta dois modos:

  • Por IDs de rastreamento - Avaliar interações específicas entre agentes fornecendo os seus operation_Id valores a partir do Application Insights.
  • Por filtro de agente - Descobre e avalia automaticamente os traços recentes de um agente específico, sem ter de recolher manualmente os identificadores dos traços.

Dica

Antes de começar, conclua Get started. Este cenário também requer um recurso Application Insights ligado ao seu projeto Foundry.

Amostragem inteligente

A avaliação de traços permite a amostragem inteligente, que seleciona um subconjunto representativo de traços para serem avaliados, em vez de avaliar todos os traços capturados. Ative esta funcionalidade ativando a opção Amostragem Inteligente no portal Foundry quando configurar uma execução de avaliação de traços. A amostragem inteligente reduz os custos de avaliação enquanto preserva a diversidade de traços – garantindo que casos limite, caminhos de erro e padrões variados de conversa sejam incluídos no conjunto avaliado.

Como funciona a amostragem inteligente

O algoritmo de amostragem utiliza uma abordagem de diversidade MinHash farthest-first que corre em múltiplas fases:

  1. Deduplicação exata - Remove rastreios duplicados do conjunto.
  2. Filtros rígidos - Remove sessões falhadas, trilhas truncadas e chamadas de ferramentas mal formadas que não são adequadas para avaliação.
  3. Agregação - Combina sinais a nível de traço numa representação unificada.
  4. Seleção do mais distante primeiro com MinHash - Calcula hashes sensíveis à proximidade (assinaturas MinHash) do texto do utilizador para estimar a similaridade entre registos e, em seguida, seleciona iterativamente o registo mais dissimilar do conjunto restante. Cada seleção sucessiva maximiza a distância em relação a todos os traços previamente selecionados.

Esta abordagem produz uma diversidade lexical significativamente maior e uma cobertura de vocabulário mais ampla em comparação com a amostragem aleatória, o que significa que o conjunto avaliado representa melhor toda a gama de interações entre agentes – incluindo casos raros, difíceis e novos que a amostragem aleatória tende a ignorar.

A amostragem inteligente é particularmente eficaz para:

  • Avaliação e referências - Maximiza a cobertura da distribuição dos dados de entrada para que as pontuações obtidas na avaliação reflitam a diversidade do mundo real.
  • Geração de Rubricas - Produz rubricas mais focadas e acionáveis ao expor padrões de conversa diversos.
  • Ajuste fino da curadoria de conjuntos de dados - Seleciona traços que ajudam os modelos a aprender de forma mais eficiente.

O algoritmo funciona inteiramente com computação local, sem chamadas adicionais de API, pelo que não incorre em custos adicionais de inferência do modelo para além da própria avaliação.

Exemplo de amostragem inteligente

# 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
)

Requisitos de dados de rastreio

A avaliação de traços exige que o seu agente emita intervalos que sigam as convenções semânticas do OpenTelemetry para IA generativa. Especificamente, o serviço de avaliação lê invoke_agent spans do Application Insights e extrai dados de conversa dos seus atributos.

São utilizados os seguintes atributos de amplitude:

Atributo Obrigatório Descrição
gen_ai.operation.name Sim Deve ser igual a "invoke_agent". O serviço ignora todos os outros intervalos.
gen_ai.agent.id Para o modo de filtro agente Identificador único do agente (formato: agent-name:version).
gen_ai.agent.name Para o modo de filtro agente Nome de agente legível por humanos.
gen_ai.input.messages Para avaliadores, entradas de consulta Array de mensagens JSON de entrada seguindo o formato de mensagem das convenções semânticas GenAI. Mensagens com função user ou system mapeiam para query; mensagens com função assistant ou tool mapeiam para response.
gen_ai.output.messages Para avaliadores, entradas de consulta Array JSON de mensagens de saída geradas pelo modelo. Todas as mensagens de saída correspondem a response. Se a saída também contiver type: tool_call ou type: tool_result, é mapeada para tool_calls.
gen_ai.tool.definitions Opcional Array JSON de esquemas de ferramentas disponíveis para o agente. Se ausente, o serviço tenta inferir definições de ferramentas a partir de mensagens de chamada de ferramenta, mas os esquemas inferidos podem estar incompletos.
gen_ai.conversation.id Opcional Identificador de conversa, passado para os resultados da avaliação para correlação.

Nota

Se gen_ai.input.messages e gen_ai.output.messages estiverem vazios ou em falta, os avaliadores de qualidade (coerência, fluência, relevância, resolução de intenção) retornam score=None. Os avaliadores de segurança (violência, autoagressão, sexualidade, ódio/injustiça) ainda podem produzir pontuações com dados parciais, mas podem não produzir resultados significativos.

Para agentes Python construídos com o SDK do Azure AI Agent Server, adicione a extensão [tracing] para permitir a emissão automática de spans:

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

Pré-requisitos para a avaliação de traços

Para além dos pré-requisitos gerais, a avaliação de traços exige:

  • Um recurso de Application Insights ligado ao seu projeto Foundry. Veja Configurar Rastreio em Microsoft Foundry.
  • A identidade gerida do projeto deve ter o papel Leitor de Log Analytics tanto no recurso Application Insights como no seu espaço de trabalho Log Analytics associado.
  • O pacote azure-monitor-query Python (só necessário se recolheres IDs de rastreio manualmente).
pip install "azure-ai-projects>=2.2.0" azure-monitor-query

Defina estas variáveis de ambiente:

  • APPINSIGHTS_RESOURCE_ID — O ID do recurso Application Insights (por exemplo, /subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.Insights/components/<resource_name>).
  • AGENT_ID — O identificador do agente emitido pela integração de rastreamento (gen_ai.agent.id atributo), usado para filtrar traços. Formato: agent-name:version.
  • TRACE_LOOKBACK_HOURS — (Opcional) Número de horas retróativas ao consultar os rastreamentos. Por padrão, define-se para 1.

Opção A: Avaliar por filtro de agente

A abordagem mais simples é permitir que o serviço descubra e avalie automaticamente vestígios recentes de um agente específico. Não é necessária a recolha manual de ID de rastreamento.

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}")

O serviço filtra os intervalos pelo atributo invoke_agent, amostra até gen_ai.agent.id IDs de rastreamento únicos e avalia todos os intervalos desses rastreamentos.

Opção B: Avaliar por IDs de rastreamento

Para maior controlo, recolha IDs de rastreio específicos do Application Insights e avalie-os. Este método é útil quando se pretende avaliar um conjunto selecionado de interações, como traços assinalados por alertas ou amostrados para revisão de qualidade.

Recolha IDs de rastreio a partir do Application Insights

Consulte o Application Insights para operation_Id obter valores dos vestígios do seu agente. Cada um operation_Id representa uma interação completa do agente:

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")

Criar avaliação e executar com IDs de rastreio

# 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}")

Configurar avaliadores e mapeamentos de dados

Quando avalia os traços, o serviço extrai automaticamente dados de conversa dos atributos do OpenTelemetry span. Use estes nomes de campo diretamente em data_mapping (sem os prefixos item. ou sample. usados noutros cenários):

Variável Atributo fonte Descrição
{{item.query}} gen_ai.input.messages (funções de utilizador/sistema) A consulta do utilizador extraída do rastreio.
{{item.response}} gen_ai.input.messages (funções de assistente/ferramenta) + gen_ai.output.messages A resposta do agente extraída do rastreio.
{{item.tool_definitions}} gen_ai.tool.definitions Esquemas de ferramentas disponíveis para o agente. Só é obrigatório para avaliadores relacionados com ferramentas.
{{item.tool_calls}} Extraído de mensagens de assistente em gen_ai.input.messages / gen_ai.output.messages Chamadas de ferramenta feitas pelo agente durante a interação. Usado por avaliadores de ferramentas. Só é obrigatório para avaliadores relacionados com ferramentas.
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,
        },
    },
]

Para um exemplo completo executável, veja sample_evaluations_builtin_with_traces.py em GitHub. Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Avaliação de dados sintéticos (pré-visualização)

Use o azure_ai_synthetic_data_gen_preview tipo de fonte de dados para gerar consultas de teste sintéticas, envie-as para um modelo implementado ou agente Foundry e avalie as respostas. Use este cenário quando não tiver um conjunto de dados de teste. O serviço gera consultas com base num prompt que fornece (e/ou nas instruções do agente), executa-as contra o seu alvo e avalia as respostas.

Dica

Antes de começar, conclua Get started.

Como funciona a avaliação de dados sintéticos

  1. O serviço gera consultas sintéticas baseadas no seu prompt e em ficheiros de dados de inicialização opcionais.
  2. Cada consulta é enviada ao alvo especificado (modelo ou agente) para gerar uma resposta.
  3. Os avaliadores avaliam cada resposta usando a consulta e resposta geradas.
  4. As consultas geradas são armazenadas como um conjunto de dados no seu projeto para reutilização.

Parâmetros

Parâmetro Obrigatório Descrição
samples_count Sim Número máximo de consultas de teste sintéticas a gerar.
model_deployment_name Sim Implementação de modelos para gerar consultas sintéticas. Apenas modelos com capacidade Responses API são suportados. Para disponibilidade, consulte Disponibilidade de regiões da API de Respostas.
prompt Não Instruções que descrevem o tipo de consultas a gerar. Opcional quando o agente alvo tem instruções configuradas.
output_dataset_name Não Nome para o conjunto de dados de saída onde as consultas geradas são armazenadas. Se não fornecer um nome, o serviço gera um automaticamente.
sources Não Ficheiros de dados de sementes (por ID de ficheiro) para melhorar a relevância das consultas geradas. Atualmente, apenas um ficheiro é suportado.

Configurar avaliadores e mapeamentos de dados

O gerador de dados sintéticos produz consultas no campo {{item.query}}. O alvo gera respostas disponíveis em {{sample.output_text}}. Mapeie estes campos para os seus avaliadores:

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}}",
        },
    },
]

Criar avaliação e executar

Alvo do modelo

Gerar consultas sintéticas e avaliar um modelo:

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,
)

Pode, opcionalmente, adicionar um prompt do sistema para moldar o comportamento do modelo-alvo. Quando usar input_messages com geração de dados sintéticos, inclua apenas system mensagens de função – o serviço fornece automaticamente as consultas geradas como mensagens de utilizador.

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."
                }
            }
        ]
    },
}

Agente alvo

Gerar consultas sintéticas e avaliar um agente da 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,
)

Para verificar a conclusão e interpretar resultados, consulte Obter resultados. A resposta inclui uma output_dataset_id propriedade que contém o ID do conjunto de dados gerado, que pode usar para recuperar ou reutilizar os dados sintéticos.

Avaliação ao nível da conversa (pré-visualização)

Avalie conversas completas para avaliar a qualidade dos agentes em todas as interações com os utilizadores – não apenas nas respostas individuais. Utilize a avaliação ao nível da conversa para identificar problemas de qualidade, como a resolução incompleta de tarefas, a frustração do utilizador e regressões nas chamadas de ferramentas, que a avaliação ao nível de cada turno não deteta.

Por exemplo, considere um agente de suporte onde o utilizador fica frustrado ao longo de vários turnos:

Turno 1 — Utilizador: "Preciso de redefinir a minha palavra-passe." Agente: "Encontrei a tua conta. Vou enviar um link de reset."

Turno 2 — Utilizador: "Não recebi o email." Agente: "Reenviei o link. Por favor, verifique o spam."

Turno 3 — Utilizador: "Ainda nada. Podes simplesmente reiniciar diretamente?" Agente: "Enviei outro link de reset."

Um avaliador por turno só nota a última resposta – que é educada e toma ação – por isso a pontuação é boa. Um avaliador ao nível da conversa que avalia a satisfação do cliente ao longo da conversa sinaliza que o agente repetiu a mesma ação falhada três vezes sem tentar uma alternativa, deixando o problema do utilizador por resolver.

A avaliação ao nível da conversa difere da avaliação por turnos em vários aspetos:

Aspect Nível de curva Nível de conversa
Âmbito de aplicação Pares individuais de consulta-resposta Conversas completas com múltiplas interações
Métricas Qualidade e segurança de cada resposta Resultados ao nível da conversa e satisfação do utilizador
Formato dos dados JSONL com os campos query e response JSONL com matriz messages que contém a conversa completa
Caso de utilização Testar respostas individuais de modelos Teste de experiências com agentes de ponta a ponta

A avaliação ao nível da conversa suporta quatro opções de fonte de dados:

Option Quando usar Tipo de fonte de dados
Do conjunto de dados ou em linha Tem registos de conversação locais ou dados de teste jsonl com file_id ou file_content
Por ID de conversa Pretende avaliar conversas específicas do App Insights azure_ai_trace_data_source_preview com trace_source
Por filtro de agente com amostragem Queres avaliar a qualidade global do agente através do tráfego de produção amostrado azure_ai_trace_data_source_preview com trace_source
Conversas simuladas Queres gerar conversas de teste sintéticas azure_ai_target_completions com conversation_gen_preview

Escolha um nível de avaliação

O parâmetro evaluation_level na execução determina se os avaliadores avaliam interações individuais ou conversas completas:

Value Comportamento
"turn" Os avaliadores pontuam cada turno de forma independente.
"conversation" Os avaliadores avaliam toda a conversa como um todo.
(omitido) Por padrão, define-se para "turn".

Importante

Compatibilidade do avaliador: Cada avaliador suporta níveis específicos de avaliação. Verifique o campo supported_evaluation_levels do avaliador no catálogo do avaliador.

  • Avaliadores apenas por turnos (por exemplo, fluency, relevance) não podem ser usados com evaluation_level="conversation".
  • Atualmente, todos os avaliadores de nível de conversa suportam os níveis "turn" e "conversation".

Erros comuns

Erro Motivo Solução
Nível de avaliação incompatível Usando evaluation_level="conversation" com um avaliador apenas por turnos Remover o avaliador apenas por turnos ou mudar para evaluation_level="turn"

Preparar dados de conversa

Crie um ficheiro JSONL onde cada linha contenha uma conversa completa no messages campo. Cada mensagem deve incluir um role (utilizador, assistente ou sistema) e content. Para um exemplo completo, consulte os exemplos de avaliação de conversas no 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?"}]}

Também pode incluir definições e chamadas de ferramentas se o seu agente usar ferramentas:

{"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."}]}

Defina o esquema de dados e os avaliadores

Especifique o esquema para os seus dados de conversa, "mensagens", e selecione avaliadores concebidos para avaliação ao nível da conversa. Os avaliadores ao nível da conversa avaliam a interação como um todo, em vez de avaliarem turnos individuais.

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}}"},
        ),
    ]

Criar avaliação e executar

Preparação: descarregar 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"},
)

Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Avaliar conversas pelo ID com base em rastos

Avalie conversas específicas do Application Insights fornecendo os seus IDs de conversa. Utilize esta opção para identificar a causa raiz dos problemas ou validar correções em interações específicas. Por exemplo, pode investigar uma conversa sinalizada por um alerta ou verificar uma correção para um problema conhecido.

Onde encontrar IDs de conversa

Encontre IDs de conversa em:

  • IU dos registos de rastreio do Application Insights — Vá para rastreios interessantes e localize o campo conversation_id nos detalhes do rastreio.
  • Saída de registo da sua aplicação — Se definir conversation_id explicitamente ao criar respostas de agentes, recupere-a dos seus registos.
  • Contexto de rastreio OpenTelemetry — O conversation_id também pode ser derivado do cabeçalho traceparent se o seu agente usar a propagação padrão de contexto de rastreio.

Nota

As definições das ferramentas são automaticamente obtidas a partir dos rastreios ou através de consulta ao registo do agente. Não precisas de os fornecer no pedido.

Parâmetros para a procura do ID da conversa

Parâmetro Obrigatório Descrição
conversation_ids Sim Matriz de IDs de conversa para avaliar.
lookback_hours Não Horas para procurar de volta a partir de end_time. O valor predefinido é de sete dias (168 horas).
end_time Não Fim da janela de pesquisa (formato ISO 8601). Predefinido para a hora atual.
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"},
    )

Nota

  • A ingestão de dados do Application Insights pode causar um atraso entre o momento em que os traços são gerados e o momento em que estão disponíveis para avaliação. Se a consulta não encontrar rastos, espere alguns minutos e tente novamente.
  • O período máximo retroativo é 7 dias (168 horas). Para aceder a vestígios mais antigos, utilize start_time e end_time dentro dos limites de retenção do App Insights.

Avalie conversas amostradas por filtro de agente

Avalie um conjunto amostrado de conversas do Application Insights filtrando pelo nome do agente. Use esta opção para avaliar a qualidade global do agente em todo o tráfego de produção. Por exemplo, realizar avaliações regulares de qualidade ou monitorizar a degradação da qualidade na produção.

O agente que especificar para a filtragem pode fazer parte de uma conversa entre vários agentes. O filtro corresponde a qualquer conversa em que esse agente tenha participado.

Nota

As definições das ferramentas são automaticamente obtidas a partir dos rastos ou consultadas no registo do agente. Não precisas de os fornecer no pedido.

Campos de identidade do agente

Especifique o agente a filtrar usando um destes formatos:

Format Example Descrição
agent_name + agent_version "agent_name": "my-agent", "agent_version": "1" São dois campos separados. Se agent_version for omitido, use a versão mais recente.
agent_id "agent_id": "my-agent:1" Cadeia única no formato "name:version".

Estratégias de filtro

Strategy Descrição
random_sampling (Padrão) Amostra aleatória uniforme até max_traces conversas.
smart_filtering Heurística gerida pelo serviço que privilegia rastreios "interessantes" — conversas com potenciais problemas, casos extremos ou anomalias.

Parâmetros

Parâmetro Obrigatório Descrição
agent_name Sim O nome do agente pelo qual filtrar os rastreios.
agent_version Não A versão do agente. Se omitido, usa a versão mais recente.
agent_id Não Alternativa a agent_name + agent_version. Uma única cadeia de caracteres no formato "name:version".
start_time Sim Início da janela temporal (segundos da época Unix, UTC).
end_time Sim Fim da janela temporal (segundos da época Unix, UTC). Reduza +600 segundos para evitar atraso na ingestão.
max_traces Não Número máximo de conversas a amostrar. Por predefinição, é 1 000.
filter_strategy Não "random_sampling" (predefinido) ou "smart_filtering" (heurística gerida pelo serviço que dá prioridade a rastreios interessantes).

Importante

A janela temporal (end_time - start_time) deve ser de pelo menos 15 minutos (900 segundos). Este requisito existe porque as consultas ao nível da conversa aplicam um buffer de inatividade de 5 minutos em cada extremidade para evitar conversas parciais.

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"},
    )

Nota

O período de consulta App Insights está atualmente limitado a um máximo de 7 dias (168 horas). Não pode aceder a vestígios com mais de 7 dias sem fornecer explicitamente start_time e end_time dentro dos limites de retenção do App Insights.

Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Simulação de conversa

Gerar conversas simuladas a partir de descrições de cenários e avaliá-las ao nível da conversa. Use este cenário para testar o comportamento do seu agente em situações controladas antes da implantação. O serviço gera conversas realistas com base nas descrições dos seus cenários e depois avalia-as.

Esta abordagem é útil para:

  • Testes pré-implementação: Validar o comportamento dos agentes em vários cenários sem tráfego real de utilizadores.
  • Cobertura de casos extremos: Cenários de teste que raramente ocorrem naturalmente, mas são importantes de gerir bem.
  • Testes de regressão: Garantir que as atualizações dos agentes não degradam o desempenho em cenários conhecidos.
  • Testes à escala: Gere rapidamente muitas conversas para pôr à prova as capacidades do agente.

Como funciona a simulação de conversa

  1. Fornece um conjunto de dados de descrições de cenários — cada linha descreve uma situação que o utilizador simulado tenta realizar.
  2. O serviço utiliza um modelo simulador para desempenhar o papel do utilizador, interagindo com o seu agente com base no cenário.
  3. Cada cenário gera uma ou mais conversas completas.
  4. Os avaliadores de nível de conversa avaliam as conversas geradas.
  5. O seu projeto armazena tanto as conversas como os resultados da avaliação.

Preparar os dados dos cenários

Crie um ficheiro JSONL onde cada linha descreva um cenário para o utilizador simulado. O esquema requer id, test_case_description, e desired_num_turns. Inclua detalhes sobre o objetivo do utilizador, contexto e quaisquer restrições. Para um exemplo completo, consulte os exemplos de avaliação de conversas no 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}

Parâmetros

Parâmetro Obrigatório Descrição
num_conversations Não Número de conversas a gerar por cada cenário. O valor predefinido é 5, com um limite no servidor de 5.
max_turns Não Número máximo de turnos (trocas) por conversa. O valor predefinido é 10, com um limite do lado do servidor de 20.
model Sim Implementação de modelos para usar na simulação do utilizador. Por exemplo, gpt-4.1.
sampling_params Não Parâmetros de amostragem para o modelo do simulador, incluindo temperature, top_p, e max_completion_tokens.
data_mapping Não Mapeia campos do seu cenário JSONL para parâmetros de simulação. Mapeamentos comuns: test_case_description, id, desired_num_turns.

Definir avaliadores

Selecione avaliadores concebidos para avaliação ao nível da conversação. As conversas simuladas são automaticamente associadas aos avaliadores.

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}}"},
        ),
    ]

Criar avaliação e executar

Preparação: descarregar 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"},
)

Para verificar a conclusão e interpretar resultados, consulte Obter resultados.

Obtenha resultados

Após a conclusão da avaliação, recolha os resultados pontuados e reveja-os no portal ou programaticamente.

Inquérito para resultados

As execuções de avaliação são assíncronas. Verifique continuamente o estado da execução até que esta termine, depois recupere os resultados:

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}")

Interpretar resultados

Para um único exemplo de dados, todos os avaliadores apresentam o seguinte esquema:

  • Rótulo: um rótulo binário de "passar" ou "falhar", semelhante à saída de um teste unitário. Use este resultado para facilitar comparações entre avaliadores.
  • Pontuação: uma pontuação da escala natural de cada avaliador. Alguns avaliadores utilizam uma rubrica detalhada, avaliando numa escala de 5 pontos (avaliadores de qualidade) ou numa escala de 7 pontos (avaliadores de segurança de conteúdos). Outros, como os avaliadores de similaridade textual, usam pontuações F1, que são flutuantes entre 0 e 1. Qualquer "pontuação" não-binária é binarizada para "passar" ou "reprovar" no campo "label" com base no "limiar".
  • Limiar: quaisquer pontuações não-binárias são binarizadas para "passar" ou "reprovar" com base num limiar padrão, que o utilizador pode ultrapassar na experiência do SDK.
  • Razão: Para melhorar a inteligibilidade, todos os avaliadores de juízes LLM também produzem um campo de raciocínio para explicar porque é atribuída uma certa pontuação.
  • Detalhes: (opcional) Para alguns avaliadores, como o tool_call_accuracy, pode haver um campo "detalhes" ou flags que contêm informação adicional para ajudar os utilizadores a depurar as suas aplicações.

Exemplo de saída (item único)

{
  "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
}

Exemplo de saída (agregado)

Para os resultados agregados de múltiplos exemplos de dados (um conjunto de dados), a média dos exemplos que têm "aprovação" constitui a taxa de aprovação desse conjunto de dados.

{
  "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
    }
  ]
}

Resolução de problemas

Trabalho em execução há muito tempo

O seu trabalho de avaliação pode permanecer no estado em Execução por um período prolongado. Esta condição ocorre normalmente quando a implementação do modelo Azure OpenAI não tem capacidade suficiente, levando o serviço a tentar novamente os pedidos.

Resolução:

  1. Cancele o trabalho de avaliação atual usando openai_client.evals.runs.cancel(run_id, eval_id=eval_id).
  2. Aumente a capacidade dos modelos no portal do Azure.
  3. Faz a avaliação novamente.

Erros de autenticação

Se receber um 401 Unauthorized ou 403 Forbidden erro, verifique que:

  • O teu DefaultAzureCredential está configurado corretamente. Se estiveres a usar CLI do Azure, executa az login.
  • A tua conta tem o papel de Utilizador Foundry no projeto Foundry.
  • A URL do endpoint do projeto está correta e inclui tanto os nomes da conta como do projeto.

Erros de formato de dados

Se a avaliação falhar devido a um erro de esquema ou de mapeamento de dados:

  • Verifica se o teu ficheiro JSONL tem um objeto JSON válido por linha.
  • Confirme que os nomes dos campos em data_mapping correspondem exatamente aos nomes dos campos no seu ficheiro JSONL (sensível a maiúsculas e minúsculas).
  • Verifica se item_schema as propriedades correspondem aos campos do teu conjunto de dados.

Erros de limite de taxa

Os níveis de tenant, subscrição e projeto aplicam limitação de taxa à criação de execuções de avaliação. Se receber uma 429 Too Many Requests resposta:

  • Verifique o retry-after cabeçalho na resposta para o tempo de espera recomendado.
  • Consulte o corpo de resposta para detalhes do limite de taxa.
  • Usa o recuo exponencial ao tentar novamente pedidos falhados.

Se uma tarefa de avaliação falhar com um 429 erro durante a execução:

  • Reduza o tamanho do seu conjunto de dados de avaliação ou divida-o em lotes mais pequenos.
  • Aumente a quota de tokens por minuto (TPM) para a implementação do seu modelo no portal Azure.

Erros na ferramenta avaliadora de agentes

Se um avaliador de agentes retornar um erro para ferramentas não suportadas:

  • Verifique as ferramentas suportadas para avaliadores de agentes.
  • Como solução alternativa, envolva ferramentas não suportadas como ferramentas de função definidas pelo utilizador para que o avaliador as possa avaliar.