Avaliar interações de agente e modelo implantados

Importante

Os itens marcados (versão prévia) neste artigo estão atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não recomendamos isso para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares para Versões Prévias do Microsoft Azure.

Avalie respostas armazenadas ou rastreamentos OpenTelemetry de agentes e modelos implantados sem reproduzir as solicitações originais.

Pré-requisitos

  • Conclua os pré-requisitos de avaliação de nuvem e a configuração do cliente.
  • IDs de respostas armazenadas para avaliação de respostas ou um recurso do Application Insights conectado ao seu projeto Foundry para avaliação de rastreamento.
  • O OpenTelemetry abrange os requisitos de dados de rastreamento quando você avalia rastreamentos.

Os exemplos usam o cliente SDK configurado em Configurar o cliente SDK.

Avaliar interações por ID de resposta

Recupere e avalie as respostas de agentes do Foundry pelos IDs de respostas usando o tipo de fonte de dados azure_ai_responses. Use esse cenário para avaliar interações específicas do agente depois que elas ocorrerem.

Dica

Antes de começar, conclua a configuração do cliente.

Uma ID de resposta é um identificador único retornado sempre que um agente Foundry gera uma resposta. Você pode coletar IDs de resposta de interações com agentes usando a API de Respostas ou dos logs de rastreamento do seu aplicativo. Forneça as IDs diretamente no conteúdo do arquivo.

Importante

As avaliações de respostas do agente (azure_ai_responses) aceitam apenas file_content para fornecer IDs de resposta. O tipo de origem file_id não é compatível e retorna o erro 400 Bad Request.

Coletar IDs de resposta

Cada chamada à API de Respostas retorna um objeto de resposta com um campo exclusivo id . Colete essas IDs das interações do aplicativo ou gere-as 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

Você também pode coletar IDs de resposta de interações do agente nos logs de rastreamento do aplicativo ou no fluxo de monitoramento. Cada ID de resposta identifica exclusivamente uma resposta armazenada que o serviço de avaliação pode recuperar.

Criar avaliação e executar

from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

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

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
    ),
    TestingCriterionAzureAIEvaluator(
        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 obter um exemplo executável completo, consulte sample_agent_response_evaluation.py no GitHub. Para sondar a conclusão e interpretar os resultados, consulte Obter resultados de avaliação de nuvem.

Avaliar rastros (versão prévia)

Avalie as interações do agente que o Application Insights já capturou. Use o tipo de azure_ai_traces fonte de dados. Esse cenário é útil para a avaliação pós-implantação do tráfego de produção real. Você seleciona rastreamentos do seu pipeline de monitoramento e executa avaliadores neles sem reexecutar nenhuma solicitação.

Importante

A avaliação de rastreamento é a abordagem recomendada para avaliar agentes não criados com o Microsoft Foundry Agent Service - incluindo LangChain e estruturas personalizadas. Desde que seu agente emita spans do OpenTelemetry seguindo as convenções semânticas do GenAI para o Application Insights, a avaliação de rastros pode analisar suas interações usando os mesmos avaliadores disponíveis para os agentes do Foundry.

A avaliação de rastreamento dá suporte a dois modos:

  • Por IDs de rastreamento – avalie interações específicas do agente fornecendo seus operation_Id valores do Application Insights.
  • Por filtro de agente – descubra e avalie automaticamente os rastreamentos recentes de um determinado agente, sem coletar manualmente as IDs de rastreamento.

Dica

Antes de começar, conclua a configuração do cliente. Esse cenário também requer um recurso do Application Insights conectado ao seu projeto do Foundry.

Amostragem inteligente

A avaliação de traces oferece suporte à amostragem inteligente, que seleciona um subconjunto representativo de traces a serem avaliados, em vez de avaliar cada trace capturado. Ative a opção Amostragem inteligente no portal do Foundry ao configurar uma execução de avaliação de rastreio. A amostragem inteligente reduz o custo da avaliação, ao mesmo tempo que preserva a diversidade dos rastros — garantindo que casos de borda, caminhos de erro e diferentes padrões de conversa sejam incluídos no conjunto avaliado.

Como funciona a amostragem inteligente

O algoritmo de amostragem usa uma abordagem de diversidade do tipo MinHash “farthest-first”, executada em vários estágios:

  1. Eliminação exata de duplicação – remove rastreamentos duplicados do pool.
  2. Filtros rígidos – remove sessões interrompidas, rastreamentos truncados e chamadas de ferramentas malformadas que não são adequadas para avaliação.
  3. Agregação – Combina sinais de nível de rastreamento em uma representação unificada.
  4. Seleção mais distante do MinHash – calcula hashes sensíveis à localidade (assinaturas MinHash) do texto do usuário para estimar a similaridade entre rastreamentos e, em seguida, seleciona iterativamente o rastreamento mais diferente do pool restante. Cada nova seleção maximiza a distância em relação a todos os rastreamentos selecionados anteriormente.

Essa abordagem produz uma diversidade léxica 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 do agente - incluindo casos raros, difíceis e novos que a amostragem aleatória tende a perder.

A amostragem inteligente é particularmente eficaz para:

  • Avaliação e parâmetros de comparação – maximiza a cobertura da distribuição de entrada para que as pontuações de avaliação reflitam a diversidade do mundo real.
  • Geração de rubricas - produz rubricas mais focadas e acionáveis, expondo diversos padrões de conversa.
  • Configuração do conjunto de dados do Finetuning – seleciona rastreamentos que ajudam os modelos a aprender com mais eficiência.

O algoritmo é executado inteiramente na computação local sem chamadas de API extras, portanto, ele não incorre em custos extras de inferência de modelo 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 rastreamento

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

Os seguintes atributos de intervalo são usados:

Attribute Obrigatório Description
gen_ai.operation.name Yes Deve ser igual a "invoke_agent". O serviço ignora todos os outros intervalos.
gen_ai.agent.id Para o modo de filtro do agente Identificador de agente exclusivo (formato: agent-name:version).
gen_ai.agent.name Para o modo de filtro do agente Nome do agente legível por humanos.
gen_ai.input.messages Para entradas de consulta de avaliadores Matriz JSON de mensagens de entrada seguindo o formato de mensagem de convenções semânticas do GenAI. Mensagens com papel user ou system mapeiam para query. Mensagens com papel assistant ou tool mapeiam para response.
gen_ai.output.messages Para entradas de consulta de avaliadores Matriz JSON de mensagens de saída geradas por modelo. Todas as mensagens de saída são mapeadas para response. Se a saída também contiver type: tool_call ou type: tool_result, ela é mapeada para tool_calls.
gen_ai.tool.definitions Opcional Matriz JSON de esquemas de ferramentas disponíveis para o agente. Se estiver ausente, o serviço tentará 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ção, transferido para os resultados da avaliação para fins de correlação.

Note

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

Para os agentes Python criados com o SDK do Servidor de Agente de IA do Azure, adicione o [tracing] extra para habilitar a emissão automática de intervalos:

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

Pré-requisitos para avaliação de rastreamento

Além dos pré-requisitos gerais, a avaliação de traço requer:

pip install "azure-ai-projects>=2.2.0" azure-monitor-query

Defina estas variáveis de ambiente:

  • APPINSIGHTS_RESOURCE_ID — A ID do recurso do 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 rastreamentos. Formato: agent-name:version.
  • TRACE_LOOKBACK_HOURS — (Opcional) Número de horas para retroceder ao consultar rastros. Usa 1 como padrão.

Opção A: Avaliar por filtro de agente

A abordagem mais simples é permitir que o serviço descubra e avalie automaticamente rastreamentos recentes para um agente específico. Você não precisa coletar manualmente IDs 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 invoke_agent spans pelo atributo gen_ai.agent.id, amostra até max_traces IDs de rastreamento exclusivas e avalia todos os spans desses rastreios.

Opção B: Avaliar por IDs de rastreamento

Para obter mais controle, colete IDs de rastreamento específicas do Application Insights e avalie-as. Esse método é útil quando você deseja avaliar um conjunto selecionado de interações, como rastros sinalizados por alertas ou amostrados para revisão de qualidade.

Coletar IDs de rastreamento do Application Insights

Consulte o Application Insights em busca de valores operation_Id nos rastreamentos do agente. Cada 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")

Crie uma avaliação e rode com IDs de rastreamento

# 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 você avalia rastreamentos, o serviço extrai automaticamente os dados da conversa dos atributos de span do OpenTelemetry. Use estes nomes de campo diretamente no data_mapping (sem os prefixos item. ou sample. usados em outros cenários):

Variável Atributo de origem Description
{{item.query}} gen_ai.input.messages (funções de usuário/sistema) A consulta de usuário extraída do rastreamento.
{{item.response}} gen_ai.input.messages (assistente/funções de ferramenta) + gen_ai.output.messages A resposta do agente extraída do rastreamento.
{{item.tool_definitions}} gen_ai.tool.definitions Esquemas de ferramentas disponíveis para o agente. Necessário apenas para avaliadores relacionados à ferramenta.
{{item.tool_calls}} Extraído de mensagens do 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. Necessário apenas para avaliadores relacionados à ferramenta.
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

testing_criteria = [
    # Quality evaluators — require query and response from trace data
    TestingCriterionAzureAIEvaluator(
        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
    TestingCriterionAzureAIEvaluator(
        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
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        initialization_parameters={"threshold": 4},
    ),
]

Próximas Etapas