Ocena zestawów danych konwersacji przy użyciu zestawu SDK Microsoft Foundry (wersja zapoznawcza)

Oceniaj pełne rozmowy w zbiorach danych na poziomie tury lub całej rozmowy.

Wymagania wstępne

W przykładach użyto klienta zestawu SDK skonfigurowanego w temacie Konfigurowanie klienta zestawu SDK.

Ocena zestawów danych konwersacji

Oceń pełne konwersacje, aby ocenić jakość agenta w obrębie całej interakcji użytkownika — nie tylko poszczególnych odpowiedzi. Ocena na poziomie całej konwersacji pozwala identyfikować problemy z jakością, takie jak niepełna realizacja zadań, frustracja użytkowników i regresje w wywołaniach narzędzi, których nie wychwytuje ocena na poziomie pojedynczych tur.

Rozważmy na przykład agenta wsparcia, podczas interakcji z którym użytkownik coraz bardziej się frustruje po kilku wymianach:

Turn 1 — Użytkownik: "Muszę zresetować moje hasło". Agent: "Znalazłem twoje konto. Wyślem link resetowania."

Turn 2 — Użytkownik: "Nie otrzymałem e-maila." Agent: "Wysłałem link ponownie." Sprawdź spam".

Turn 3 — Użytkownik: "Nadal nic. Czy można go zresetować bezpośrednio?" Agent: "Wysłałem inny link resetowania".

Ewaluator na poziomie pojedynczej tury ocenia tylko ostatnią odpowiedź — która jest uprzejma i podejmuje działanie — dlatego uzyskuje ona wysoką ocenę. Ewaluator oceniający całą rozmowę pod kątem satysfakcji klienta wskazuje, że agent trzykrotnie powtórzył to samo nieskuteczne działanie, nie próbując zastosować alternatywnego rozwiązania, przez co problem użytkownika pozostał nierozwiązany.

Ocena na poziomie całej konwersacji różni się od oceny na poziomie pojedynczej tury na kilka sposobów:

Aspect Na poziomie tury Poziom konwersacji
Scope Pojedyncze pary odpowiedzi na zapytania Prowadzenie rozmów z wieloma wymianami zdań
Metrics Jakość i bezpieczeństwo poszczególnych odpowiedzi Wyniki na poziomie konwersacji i zadowolenie użytkowników
Format danych JSONL z polami query i response JSONL z tablicą messages zawierającą całą rozmowę
Przypadek użycia Testowanie poszczególnych odpowiedzi modelu Testowanie doświadczeń end-to-end agenta

Wybierz przepływ pracy konwersacji zgodny ze źródłem danych:

Workflow Kiedy stosować Typ źródła danych
Z zestawu danych lub w tekście Masz lokalne ślady konwersacji lub dane testowe jsonl z file_id lub file_content
Wdrożone konwersacje Chcesz ocenić określone konwersacje lub próbkowany ruch produkcyjny z usługi Application Insights azure_ai_trace_data_source_preview Z trace_source
Symulowane konwersacje Chcesz wygenerować syntetyczne konwersacje testowe azure_ai_target_completions Z conversation_gen_preview

Wybieranie poziomu oceny

Parametr evaluation_level w uruchomieniu określa, czy ewaluatorzy oceniają poszczególne tury, czy całe rozmowy:

Value Behavior
"turn" Ewaluatorzy oceniają każdy obrót niezależnie.
"conversation" Ewaluatorzy oceniają całą rozmowę jako całość.
(pominięto) Wartość domyślna to "turn".

Ważna

Zgodność ewaluatora: każdy ewaluator obsługuje określone poziomy oceny. Sprawdź pole ewaluatora supported_evaluation_levels w katalogu ewaluatora.

  • Ewaluatory tylko dla jednej tury (na przykład fluency, relevance) nie mogą być używane z evaluation_level="conversation".
  • Obecnie wszystkie ewaluatory konwersacji obsługują zarówno poziom "turn", jak i "conversation".

Typowe błędy

Error Przyczyna Rozwiązanie
Niezgodny poziom oceny Używanie evaluation_level="conversation" z ewaluatorem tylko dla tur Usuń moduł oceniający tylko dla tury lub zmień na evaluation_level="turn"

Przygotowywanie danych konwersacji

Utwórz plik JSONL, w którym każdy wiersz zawiera całą konwersację w polu messages. Każdy komunikat powinien zawierać role (użytkownika, asystenta lub system) i content. Pełny przykład znajdziesz w przykładach oceny konwersacji w pakiecie 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?"}]}

Możesz również uwzględnić definicje narzędzi i wywołania narzędzi, jeśli agent używa narzędzi:

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

Definiowanie schematu danych i ewaluatorów

Określ schemat danych rozmowy, przypisz pole messages do każdego ewaluatora i wybierz ewaluatory przeznaczone do oceny całej rozmowy. Ewaluatorzy na poziomie konwersacji oceniają całą interakcję, a nie poszczególne zwroty.

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

Utwórz ewaluację i uruchom

Pobierz plik sample_data_multiturn_conversations.jsonl przed uruchomieniem przykładu.

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

Aby sprawdzać, czy proces został ukończony, i interpretować wyniki, zobacz Pobieranie wyników oceny w chmurze.

Aby zobaczyć kompletny działający przykład, zobacz plik sample_multiturn_conversation_evaluation.py na GitHubie.

Następne kroki