Evaluar conjuntos de datos de conversación con el SDK de Microsoft Foundry (versión preliminar)

Evalúe las conversaciones completas de conjuntos de datos a nivel de turno o de conversación.

Prerequisites

En los ejemplos se usa el cliente del SDK configurado en Configuración del cliente del SDK.

Evaluación de conjuntos de datos de conversación

Evalúe las conversaciones completas para evaluar la calidad del agente en todas las interacciones del usuario, no solo las respuestas individuales. Utilice la evaluación a nivel de conversación para identificar problemas de calidad, como la resolución incompleta de tareas, la frustración del usuario y las regresiones en las llamadas a herramientas que la evaluación a nivel de turno no detecta.

Por ejemplo, consideremos un agente de soporte en el que el usuario se va frustrando a lo largo de varios turnos:

Turn 1 — Usuario: "Necesito restablecer mi contraseña". Agente: "He encontrado su cuenta. Enviaré un vínculo de restablecimiento".

Turn 2 — Usuario: "No he recibido el correo electrónico." Agente: "He reenviado el enlace." Por favor, compruebe el correo no deseado".

Turn 3 — Usuario: "Todavía no hay nada. ¿Puede restablecerlo directamente?" Agente: "He enviado otro vínculo de restablecimiento".

Un evaluador a nivel de turno puntúa solo la última respuesta, que es amable y actúa, por lo que obtiene una buena puntuación. Un evaluador a nivel de conversación que califica la satisfacción del cliente a lo largo de toda la conversación señala que el agente repitió la misma acción fallida tres veces sin intentar una alternativa, dejando sin resolver el problema del usuario.

La evaluación de nivel de conversación difiere de la evaluación de nivel de turno de varias maneras:

Aspecto Nivel de turno Nivel de conversación
Ámbito Pares individuales de consulta-respuesta Completar conversaciones con varios intercambios
Metrics Calidad y seguridad de cada respuesta Resultados de nivel de conversación y satisfacción del usuario
Formato de datos JSONL con campos query y response JSONL con messages matriz que contiene la conversación completa
Caso de uso Prueba de respuestas de modelos individuales Pruebas integrales de las experiencias del agente

Elija el flujo de trabajo de conversación que coincida con el origen de datos:

Workflow Cuándo usarlo Tipo de origen de datos
De conjunto de datos o insertado Tiene registros de conversaciones locales o datos de prueba jsonl con file_id o file_content
Conversaciones implementadas Quiere evaluar conversaciones específicas o tráfico de producción muestreado desde Application Insights. azure_ai_trace_data_source_preview con trace_source
Conversaciones simuladas Conviene generar conversaciones de prueba sintética azure_ai_target_completions con conversation_gen_preview

Elección de un nivel de evaluación

El parámetro evaluation_level de la ejecución determina si los evaluadores evalúan turnos individuales o conversaciones completas:

Value Comportamiento
"turn" Los evaluadores puntúan cada turno de forma independiente.
"conversation" Los evaluadores puntúan toda la conversación como un todo.
(omitido) Tiene como valor predeterminado "turn".

Importante

Compatibilidad del evaluador: cada evaluador admite niveles de evaluación específicos. Compruebe el campo supported_evaluation_levels del evaluador en el catálogo de evaluadores.

  • Los evaluadores solo por turno (por ejemplo, fluency, relevance) no se pueden usar con evaluation_level="conversation".
  • Actualmente, todos los evaluadores de nivel de conversación admiten tanto niveles "turn" como "conversation" .

Errores frecuentes

Error Causa Solución
Nivel de evaluación incompatible Uso de evaluation_level="conversation" con un evaluador por turnos Quitar el evaluador de solo turno o cambiar a evaluation_level="turn"

Preparación de los datos de conversación

Cree un archivo JSONL donde cada línea contenga una conversación completa en el messages campo. Cada mensaje debe incluir un role (usuario, asistente o sistema) y content. Para obtener un ejemplo completo, consulte los ejemplos de evaluación de conversation en el 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?"}]}

También puede incluir definiciones de herramientas y llamadas a herramientas si el agente usa herramientas:

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

Definir el esquema de datos y los evaluadores

Especifique el esquema de los datos de conversación, "mensajes" y seleccione evaluadores diseñados para la evaluación de nivel de conversación. Los evaluadores a nivel de conversación evalúan toda la interacción en lugar de evaluar turnos individuales.

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

Crear evaluación y ejecutar

Preparación: descargue 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 sondear la finalización e interpretar los resultados, consulte Obtención de resultados de evaluación en la nube.

Para ver un ejemplo completo y ejecutable, consulte sample_multiturn_conversation_evaluation.py en GitHub.

Pasos siguientes