Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Valuta le conversazioni complete nei set di dati a livello di singolo turno o di intera conversazione.
Prerequisiti
- Completare i prerequisiti di valutazione cloud e la configurazione del client.
- Dati della conversazione con un
messagesarray. - Valutatori che supportano il livello di valutazione selezionato, ad esempio coerenza e base.
Gli esempi usano il client SDK configurato in Configurare il client SDK.
Valutare i set di dati di conversazione
Valutare le conversazioni complete per valutare la qualità dell'agente tra intere interazioni utente, non solo le singole risposte. Usare la valutazione a livello di conversazione per identificare problemi di qualità come la risoluzione incompleta delle attività, la frustrazione dell'utente e le regressioni delle chiamate agli strumenti che non vengono valutate a livello di turno.
Prendiamo ad esempio un operatore dell'assistenza con cui l'utente si sente sempre più frustrato nel corso di diversi scambi:
Turno 1 - Utente: "Devo reimpostare la password". Agente: "Ho trovato il tuo account. Invierò un collegamento di reimpostazione."
Turno 2 — Utente: "Non ho ricevuto l'e-mail." Agente: "Ho reinviato il link." Si prega di controllare la posta indesiderata."
Turn 3 — User: "Ancora niente. Puoi semplicemente reimpostarla direttamente?" Agente: "Ho inviato un altro collegamento di reimpostazione".
Un valutatore a livello di singolo turno assegna un punteggio solo all’ultima risposta, che è educata e intraprende un’azione, perciò ottiene un buon punteggio. Un valutatore a livello di conversazione che valuta la soddisfazione del cliente nell'intera conversazione segnala che l'agente ha ripetuto la stessa azione inefficace tre volte senza tentare un'alternativa, lasciando il problema dell'utente irrisolto.
La valutazione a livello di conversazione differisce dalla valutazione a livello di turno in diversi modi:
| Aspect | Livello di turno | Livello di conversazione |
|---|---|---|
| Scope | Singole coppie domanda-risposta | Conversazioni complete con scambi multipli |
| Metrics | Qualità e sicurezza per ogni risposta | Risultati a livello di conversazione e soddisfazione degli utenti |
| Formato dati | JSONL con campi query e response |
JSONL con messages matrice contenente la conversazione completa |
| caso d'uso | Test delle risposte dei singoli modelli | Verifica delle esperienze end-to-end degli agenti |
Scegliere il flusso di lavoro di conversazione corrispondente all'origine dati:
| Workflow | Quando utilizzare | Tipo di origine dati |
|---|---|---|
| Da un set di dati o in linea | Sono presenti tracce di conversazioni locali o dati di test |
jsonl con file_id o file_content |
| Conversazioni distribuite | Si vogliono valutare conversazioni specifiche o traffico di produzione campionato da Application Insights |
azure_ai_trace_data_source_preview con trace_source |
| Conversazioni simulate | Vuoi generare conversazioni di test sintetiche | azure_ai_user_conversation_simulation |
Scegliere un livello di valutazione
Il parametro evaluation_level del comando run determina se i valutatori valutano i singoli turni o conversazioni complete:
| Value | Behavior |
|---|---|
"turn" |
Gli analizzatori valutano ogni turno in modo indipendente. |
"conversation" |
Gli analizzatori valutano l'intera conversazione nel suo complesso. |
| (omesso) | Di default è "turn". |
Importante
Compatibilità dell'analizzatore: ogni analizzatore supporta livelli di valutazione specifici. Controllare il campo del valutatore supported_evaluation_levels in Livelli di valutazione.
Valutatori solo turno (ad esempio,
builtin.fluency,builtin.relevance) non vengono eseguiti conevaluation_level="conversation". Se un analizzatore non supporta la valutazione a livello di conversazione, il servizio ignora tale analizzatore invece di far fallire l'esecuzione della valutazione.Valutatori che supportano la valutazione a livello di conversazione: i seguenti valutatori predefiniti supportano sia la valutazione a livello di turno (a turno singolo) che a livello di conversazione (multi turni):
builtin.output_qualitybuiltin.tool_use_qualitybuiltin.deflection_ratebuiltin.customer_satisfactionbuiltin.task_completionbuiltin.coherencebuiltin.groundedness
builtin.output_qualityebuiltin.tool_use_qualitysono valutatori compositi, che valutano più dimensioni di qualità.Per la valutazione a livello di turno, tutti gli analizzatori predefiniti, ad eccezione di
builtin.document_retrievale del deprecatobuiltin.quality_grader, supportano il formato di inputmessages. I valutatori di Azure OpenAIlabel_model,python_grader,string_check,score_modeletext_similaritynon supportano il formato di inputmessages.
Errori comuni
| Error | Cause | Soluzione |
|---|---|---|
| Il valutatore viene ignorato | Uso evaluation_level="conversation" con un analizzatore che non supporta la valutazione a livello di conversazione |
Usa un valutatore a livello di conversazione o passa a evaluation_level="turn" se hai bisogno di quel valutatore |
Preparare i dati della conversazione
Creare un file JSONL in cui ogni riga contiene una conversazione completa nel messages campo. Ogni messaggio deve includere un role (utente, assistente o sistema) e content. Per un esempio completo, consulta gli esempi di valutazione delle conversazioni nell’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?"}]}
È anche possibile includere definizioni di strumenti e chiamate agli strumenti se l'agente usa strumenti:
{"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."}]}
Definire lo schema dei dati e gli analizzatori
Specificare lo schema per i dati della tua conversazione e selezionare i valutatori progettati per la valutazione a livello di conversazione. Eseguire il mapping di messages a ogni valutatore. Per i valutatori che valutano il comportamento degli strumenti, eseguire anche il mapping di tool_definitions Gli analizzatori a livello di conversazione valutano l'intera interazione anziché i singoli turni.
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}}"},
),
]
Creare una valutazione ed eseguire
Scaricare sample_data_multiturn_conversations.jsonl prima di eseguire l'esempio.
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"},
)
Per eseguire il polling per il completamento e interpretare i risultati, vedere Ottenere i risultati della valutazione cloud.
Per un esempio completo eseguibile, consulta sample_multiturn_conversation_evaluation.py su GitHub.
Passaggi successivi
- Per eseguire il polling per il completamento e interpretare i risultati, vedere Ottenere i risultati della valutazione cloud.
- Per valutare le tracce di produzione, vedere Valutare le conversazioni tra modelli e agenti distribuiti.
- Per generare conversazioni sintetiche dai test case, vedere Simulare le conversazioni degli agenti.
- Per generare conversazioni sintetiche da un prompt dell'agente, vedere Generare conversazioni sintetiche.