Konversationsdatensätze mit Microsoft Foundry SDK auswerten

Bewerten Sie vollständige Konversationen aus Datensätzen auf Turn- oder Konversationsebene.

Voraussetzungen

In den Beispielen wird der in SDK-Client einrichten konfigurierte SDK-Client verwendet.

Konversationsdatensätze auswerten

Bewerten Sie vollständige Unterhaltungen, um die Agentqualität über ganze Benutzerinteraktionen hinweg zu bewerten – nicht nur einzelne Antworten. Verwenden Sie die Evaluierung auf Konversationsebene, um Qualitätsprobleme wie unvollständige Aufgabenlösung, Benutzerfrustration und Regressionen bei Tool-Aufrufen zu identifizieren, die bei der Bewertung auf Turn-Ebene übersehen werden.

Betrachten Sie beispielsweise einen Support-Agenten, bei dem der Benutzer im Verlauf mehrerer Gesprächsrunden zunehmend frustriert wird:

Turn 1 — User: "Ich muss mein Kennwort zurücksetzen." Agent: "Ich habe Ihr Konto gefunden. Ich schicke einen Link zum Zurücksetzen.

Turn 2 — User: "Ich habe die E-Mail nicht erhalten." Agent: "Ich habe den Link erneut gesendet. Bitte überprüfen Sie Spam."

Turn 3 — Benutzer: "Immer noch nichts. „Können Sie es nicht einfach direkt zurücksetzen?“ Agent: „Ich habe einen weiteren Link zum Zurücksetzen gesendet.“

Ein Evaluator auf Durchlaufebene bewertet nur die letzte Antwort – die höflich ist und Aktionen ausführt – und vergibt daher eine gute Bewertung. Ein Evaluator auf Gesprächsebene, der die Kundenzufriedenheit über den gesamten Gesprächsverlauf hinweg bewertet, stellt fest, dass der Agent dieselbe erfolglose Maßnahme dreimal wiederholt hat, ohne eine Alternative zu versuchen, sodass das Problem des Nutzers ungelöst blieb.

Die Bewertung auf Konversationsebene unterscheidet sich in mehreren Punkten von der Bewertung auf Turn-Ebene:

Aspect Durchlaufebene Konversationsebene
Umfang Einzelne Abfrageantwortpaare Vollständige Konversationen mit mehreren Nachrichten
Metrics Qualität und Sicherheit pro Reaktion Ergebnisse auf Konversationsebene und Benutzerzufriedenheit
Datenformat JSONL mit query und response Feldern JSONL mit einem messages Array, das die vollständige Unterhaltung enthält
Anwendungsfall Testen einzelner Modellantworten Testen der End-to-End-Agent-Erfahrungen

Wählen Sie den Unterhaltungsworkflow aus, der Ihrer Datenquelle entspricht:

Workflow Wann verwenden? Datenquellentyp
Aus Datensatz oder Inline Sie haben lokale Gesprächsprotokolle oder Testdaten. jsonl mit file_id oder file_content
Bereitgestellte Konversationen Sie möchten bestimmte Unterhaltungen oder stichprobenbasierten Produktionsdatenverkehr aus Application Insights auswerten. azure_ai_trace_data_source_preview mit trace_source
Simulierte Unterhaltungen Sie möchten synthetische Testgespräche generieren azure_ai_user_conversation_simulation

Auswählen einer Auswertungsstufe

Der evaluation_level-Parameter für die Ausführung bestimmt, ob Evaluatoren einzelne Durchläufe oder vollständige Unterhaltungen bewerten sollen:

Wert Behavior
"turn" Die Evaluatoren bewerten jeden Durchlauf einzeln.
"conversation" Evaluatoren bewerten die gesamte Unterhaltung als Ganzes.
(weggelassen) Wird standardmäßig auf "turn" festgelegt.

Important

Evaluatorkompatibilität: Jeder Evaluator unterstützt bestimmte Auswertungsstufen. Überprüfen Sie das Feld des supported_evaluation_levels Auswertenden in Bewertungsebenen.

  • Evaluatoren nur für Durchläufe (z. B. builtin.fluency, builtin.relevance) werden nicht mit evaluation_level="conversation" ausgeführt. Wenn ein Evaluator die Auswertung auf Unterhaltungsebene nicht unterstützt, überspringt der Dienst diesen Evaluator, anstatt den Auswertungslauf fehlschlagen zu lassen.

  • Evaluator, die die Bewertung auf Unterhaltungsebene unterstützen: Die folgenden integrierten Auswerter unterstützen sowohl die Bewertung auf Turn-Ebene (single-turn) als auch die Auswertung auf Unterhaltungsebene (Multi-Turn):

    • builtin.output_quality
    • builtin.tool_use_quality
    • builtin.deflection_rate
    • builtin.customer_satisfaction
    • builtin.task_completion
    • builtin.coherence
    • builtin.groundedness

    builtin.output_quality und builtin.tool_use_quality sind zusammengesetzte Evaluatoren, die mehrere Qualitätsdimensionen bewerten.

  • Für die Bewertung auf Turn-Ebene unterstützen alle integrierten Evaluatoren außer messages und dem veralteten builtin.document_retrieval das Eingabeformat builtin.quality_grader. Die Azure OpenAI-Bewerter label_model, python_grader, score_model, string_check und text_similarity unterstützen das Eingabeformat messages nicht.

Häufige Fehler

Fehler Ursache Lösung
Der Evaluator wird übersprungen. Verwendung von evaluation_level="conversation" mit einem Evaluator, der die Auswertung auf Unterhaltungsebene nicht unterstützt Verwenden Sie einen Evaluator auf Unterhaltungsebene, oder wechseln Sie zu evaluation_level="turn", wenn Sie diesen Evaluator benötigen.

Gesprächsdaten vorbereiten

Erstellen Sie eine JSONL-Datei, in der jede Zeile eine vollständige Unterhaltung im messages Feld enthält. Jede Nachricht sollte ein role (Benutzer, Assistent oder System) und ein content enthalten. Ein vollständiges Beispiel finden Sie in den Beispielen zur konversationsauswertung im 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?"}]}

Sie können auch Tooldefinitionen und Toolaufrufe einschließen, wenn Ihr Agent Tools verwendet:

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

Definieren des Datenschemas und der Auswerter

Geben Sie das Schema für Ihre Unterhaltungsdaten an und wählen Sie Evaluatoren aus, die für Auswertungen auf Unterhaltungsebene ausgelegt sind. Ordnen Sie jedem Evaluator messages zu. Für Evaluatoren, die das Toolverhalten bewerten, ordnen Sie auch tool_definitions zu. Evaluatoren auf Unterhaltungsebene bewerten die gesamte Interaktion, nicht nur einzelne Durchläufe.

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="output_quality",
            evaluator_name="builtin.output_quality",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={
                "messages": "{{item.messages}}",
                "tool_definitions": "{{item.tool_definitions}}",
            },
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="tool_use_quality",
            evaluator_name="builtin.tool_use_quality",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={
                "messages": "{{item.messages}}",
                "tool_definitions": "{{item.tool_definitions}}",
            },
        ),
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="deflection_rate",
            evaluator_name="builtin.deflection_rate",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={
                "messages": "{{item.messages}}",
                "tool_definitions": "{{item.tool_definitions}}",
            },
        ),
        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="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}}"},
        ),
    ]

Auswertung erstellen und ausführen

Laden Sie sample_data_multiturn_conversations.jsonl herunter, bevor Sie das Beispiel ausführen.

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

Weitere Informationen zum Abfragen der Beendigung und zum Interpretieren der Ergebnisse finden Sie unter Ergebnisse der Cloudbewertung abrufen.

Ein vollständiges, ausführbares Beispiel finden Sie auf GitHub unter sample_multiturn_conversation_evaluation.py.

Nächste Schritte