Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
- Define o que avaliar. Descreva a forma dos seus dados (os
data_source_config) e os avaliadores (critérios de teste) que os avaliam. - Crie a avaliação. Submeta a definição usando
openai_client.evals.create(). - 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_completions → azure_ai_model |
| Conclusões do destino do agente | Tem dúvidas e quer avaliar as respostas de um agente da Foundry. |
azure_ai_target_completions → azure_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_completions → azure_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_preview → azure_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_team → azure_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
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:
Carregar um conjunto de dados (recomendado)
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_Idvalores 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:
- Deduplicação exata - Remove rastreios duplicados do conjunto.
- Filtros rígidos - Remove sessões falhadas, trilhas truncadas e chamadas de ferramentas mal formadas que não são adequadas para avaliação.
- Agregação - Combina sinais a nível de traço numa representação unificada.
- 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-queryPython (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.idatributo), 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 para1.
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
- O serviço gera consultas sintéticas baseadas no seu
prompte em ficheiros de dados de inicialização opcionais. - Cada consulta é enviada ao alvo especificado (modelo ou agente) para gerar uma resposta.
- Os avaliadores avaliam cada resposta usando a consulta e resposta geradas.
- 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 comevaluation_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_idnos detalhes do rastreio. -
Saída de registo da sua aplicação — Se definir
conversation_idexplicitamente ao criar respostas de agentes, recupere-a dos seus registos. -
Contexto de rastreio OpenTelemetry — O
conversation_idtambé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_timeeend_timedentro 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
- Fornece um conjunto de dados de descrições de cenários — cada linha descreve uma situação que o utilizador simulado tenta realizar.
- O serviço utiliza um modelo simulador para desempenhar o papel do utilizador, interagindo com o seu agente com base no cenário.
- Cada cenário gera uma ou mais conversas completas.
- Os avaliadores de nível de conversa avaliam as conversas geradas.
- 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:
- Cancele o trabalho de avaliação atual usando
openai_client.evals.runs.cancel(run_id, eval_id=eval_id). - Aumente a capacidade dos modelos no portal do Azure.
- Faz a avaliação novamente.
Erros de autenticação
Se receber um 401 Unauthorized ou 403 Forbidden erro, verifique que:
- O teu
DefaultAzureCredentialestá configurado corretamente. Se estiveres a usar CLI do Azure, executaaz 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_mappingcorrespondem exatamente aos nomes dos campos no seu ficheiro JSONL (sensível a maiúsculas e minúsculas). - Verifica se
item_schemaas 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-aftercabeç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.