Avaliar conjuntos de dados de conversa com o Microsoft Foundry SDK (pré-visualização)

Avalie conversas completas em conjuntos de dados ao nível do turno ou da conversa.

Pré-requisitos

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

Avaliar conjuntos de dados de conversaçã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
Scope 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

Escolha o fluxo de trabalho de conversa que corresponda à sua fonte de dados:

Workflow Quando utilizar 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
Conversas publicadas Quer avaliar conversas específicas ou tráfego de produção amostrado do Application Insights 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:

valor Comportamento
"turn" Os avaliadores pontuam cada turno de forma independente.
"conversation" Os avaliadores avaliam toda a conversa como um todo.
(omitido) O valor padrão é "turn".

Importante

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

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

Erros comuns

Erro Cause 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/major city 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["AZURE_AI_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["AZURE_AI_MODEL_DEPLOYMENT_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="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 periodicamente a conclusão e interpretar os resultados, consulte Obter os resultados da avaliação na nuvem.

Para um exemplo completo que pode ser executado, consulte sample_multiturn_conversation_evaluation.py no GitHub.

Passos seguintes