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.
Generare conversazioni simulate dalle descrizioni degli scenari e valutarle a livello di conversazione. Usare questo scenario per testare il comportamento dell'agente in situazioni controllate prima della distribuzione. Il servizio genera conversazioni realistiche in base alle descrizioni degli scenari e quindi le valuta.
Prerequisiti
- Completare i prerequisiti di valutazione cloud e la configurazione del client.
- Una distribuzione modello per simulare utenti.
- Un obiettivo dell'agente da valutare.
- Dati dello scenario che descrivono le interazioni da simulare.
Gli esempi usano il client SDK configurato in Configurare il client SDK.
Informazioni sulla simulazione della conversazione
Questo approccio è utile per:
- Test di pre-distribuzione: convalidare il comportamento dell'agente in diversi scenari senza traffico utente reale.
- Copertura dei casi limite: scenari di test che si verificano raramente, ma che è importante gestire correttamente.
- Test di regressione: assicurarsi che gli aggiornamenti dell'agente non degradino le prestazioni in scenari noti.
- Test di scala: Genera rapidamente numerose conversazioni per mettere alla prova le capacità degli operatori.
La simulazione di conversazioni segue questa procedura:
- Fornisci le descrizioni degli scenari sotto forma di dati JSONL o di casi di test inline fortemente tipizzati. Ogni test case descrive una situazione che l'utente simulato tenta di eseguire.
- Il servizio usa un modello di simulatore per svolgere il ruolo dell'utente, interagendo con l'agente in base allo scenario.
- Ogni scenario genera una o più conversazioni complete.
- I valutatori a livello di conversazione valutano le conversazioni generate.
- Il progetto archivia i risultati della valutazione. Facoltativamente, è possibile rendere persistenti tutte le conversazioni generate come set di dati Foundry con controllo delle versioni.
L'esecuzione usa l'origine dati azure_ai_user_conversation_simulation. Inserire le impostazioni che si applicano a ogni test case in default_simulation_configuration. Un test case può eseguire l'override delle singole impostazioni di conversazione nel relativo simulation_configuration; le impostazioni che non eseguono l'override continuano a usare le impostazioni predefinite di esecuzione.
Preparare i dati dello scenario
Suggerimento
Anziché creare gli scenari manualmente, generarli utilizzando il tipo di attività Seed di simulazione (multi-turno) Prima di usare un set di dati già generato con questa API, normalizzare id in test_case_id e spostare desired_num_turns in simulation_configuration. Vedere Generare un set di dati di inizializzazione della simulazione.
Fornire test case usando uno di questi tipi di origine:
-
file_idofile_contentper gli scenari JSONL. -
inline_user_conversation_simulationper test case fortemente tipizzati nella richiesta di esecuzione. Includi almeno un caso di test.
Per JSONL, usare i nomi di proprietà canonici illustrati nell'esempio seguente. Includere l'obiettivo, il contesto e i vincoli comportamentali dell'utente in test_case_description. La descrizione può contenere da 1 a 2.500 caratteri.
{"test_case_id":"contoso_refund_timeline","test_case_description":"Customer returned an item five days ago and wants to know when the refund will arrive.","simulation_configuration":{"desired_num_turns":10}}
{"test_case_id":"contoso_store_hours_lookup","test_case_description":"Customer wants today's closing time and might need to clarify the store location.","simulation_configuration":{"desired_num_turns":3,"conversation_repetitions":2}}
Quando i dati JSONL usano questi nomi canonici, omettere data_mapping. Se usa nomi diversi, eseguire il mapping di tali attributi a test_case_id, test_case_descriptione simulation_configuration. Non usare data_mapping con un'origine inline_user_conversation_simulation .
Ogni test case inline o JSONL supporta queste proprietà:
| Proprietà | Descrizione |
|---|---|
test_case_id |
Identificatore facoltativo. Il servizio genera un identificatore se non viene specificato. |
test_case_description |
Scenario, obiettivo utente e vincoli comportamentali che guidano la conversazione simulata. |
simulation_configuration |
Impostazioni facoltative che eseguono l'override delle impostazioni predefinite di esecuzione corrispondenti per questo test case. |
Configurare l'utente simulato
Usare l'oggetto model_configuration per configurare il modello che riproduce l'utente simulato. Questo modello è separato dal modello o dall'agente target da valutare.
| Proprietà | Obbligatorio | Descrizione |
|---|---|---|
model |
Yes | Distribuzione del simulatore in formato {connectionName}/{modelDeploymentName}. Il router del modello non è supportato come modello del simulatore; può essere usato solo come obiettivo di valutazione. |
sampling_params |
No | Parametri di campionamento applicati quando il simulatore genera turni utente. |
voice_model |
No | Converte il testo dell'utente simulato in voce tramite l'endpoint Voice Live. Ometti questa proprietà per la simulazione di solo testo. |
Per la simulazione vocale, voice_model.type deve essere azure-standard. Impostare name su un nome di voce neurale standard Azure. È anche possibile impostare temperature da 0 a 1. Se omesso, viene applicato il valore predefinito del modello vocale sottostante.
Configurare le conversazioni
Impostare valori a livello di esecuzione in default_simulation_configuration. I controlli di conversazione max_num_turns, desired_num_turns, conversation_repetitions, audio_effects e user_behavior possono anche comparire nel simulation_configuration di un test case per sovrascrivere i valori predefiniti di esecuzione corrispondenti. Le proprietà enable_conversation_dataset_generation di generazione del set di dati e output_conversation_dataset_name sono valide solo in default_simulation_configuration e non possono essere sottoposte a override per ogni test case.
| Proprietà | Scope | Predefinito | Descrizione |
|---|---|---|---|
max_num_turns |
Esecuzione o test case | 20 |
Limite rigido per gli turni in ogni conversazione. Deve essere almeno 1. |
conversation_repetitions |
Esecuzione o test case | 1 |
Numero di conversazioni indipendenti generate per ogni test case. Deve essere almeno 1. |
desired_num_turns |
Esecuzione o test case | None | Lunghezza obiettivo della conversazione Non può superare l'effettivo max_num_turns. Se omesso, il simulatore determina la lunghezza dello scenario. |
audio_effects |
Esecuzione o test case | None | Effetti applicati alla simulazione vocale. Ignorato per la simulazione di solo testo. |
user_behavior |
Esecuzione o test case | None | Comportamento dell'utente simulato, ad esempio un'interruzione. |
enable_conversation_dataset_generation |
Esegui solo | false |
Salva tutte le conversazioni generate in un dataset Foundry versionato. |
output_conversation_dataset_name |
Esegui solo | Generato dal servizio | Nome del set di dati usato quando la generazione del set di dati di conversazione è abilitata. |
Configurare le condizioni vocali e le interruzioni
Inserire audio_effects e user_behavior all'interno di default_simulation_configuration per applicarli a ogni caso di test. Per sovrascrivere una delle due impostazioni per un singolo test case, inserirla invece all'interno del simulation_configuration di quel test case.
Utilizzare audio_effects per verificare le prestazioni del target in condizioni di ascolto realistiche. Aggiungere uno o più effetti: street_traffic, crowd_chatter, background_tv, metro_stationo telephonic_voice. Impostare volume_percentage da 1 a 100 per controllare il volume combinato. Il valore predefinito è 15. Gli effetti audio vengono ignorati nelle simulazioni di solo testo.
Usare user_behavior.interruption per verificare come il sistema di destinazione gestisce il caso in cui un utente parli mentre il sistema di destinazione sta rispondendo. Imposta type su default per abilitare le interruzioni simulate. Omettere interruption quando le interruzioni non fanno parte del test.
{
"default_simulation_configuration": {
"audio_effects": {
"effects": ["street_traffic", "telephonic_voice"],
"volume_percentage": 20
},
"user_behavior": {
"interruption": {
"type": "default"
}
}
}
}
Definire gli analizzatori
Seleziona i valutatori progettati per valutare conversazioni. Le conversazioni simulate vengono automaticamente associate ai valutatori.
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, PromptAgentDefinition
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"]
simulator_model = os.environ["AZURE_AI_SIMULATOR_MODEL"]
agent_name = os.environ.get("FOUNDRY_AGENT_NAME", "")
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
project_client.get_openai_client() as openai_client,
):
# Simulation uses the same "custom" eval group type as dataset evaluation (S1),
# since the generated conversations follow the same messages schema.
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 la valutazione ed eseguire
Salvare le righe JSONL canoniche da Preparare i dati dello scenario come simulation_scenarios.jsonl.
# Create (or update) an agent to simulate against
agent = project_client.agents.create_version(
agent_name=agent_name,
definition=PromptAgentDefinition(
model=model_deployment_name,
instructions="You are a helpful customer service agent. Be empathetic and solution-oriented.",
),
)
# Upload scenario data
scenarios_id = project_client.datasets.upload_file(
name="simulation-scenarios",
version="1",
file_path="./simulation_scenarios.jsonl",
).id
# Create the evaluation
eval_object = openai_client.evals.create(
name="Multi-turn Conversation Simulation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
# Create a simulation run. AZURE_AI_SIMULATOR_MODEL uses the format
# {connectionName}/{modelDeploymentName}.
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="conversation-simulation-run",
data_source={
"type": "azure_ai_user_conversation_simulation",
"source": {
"type": "file_id",
"id": scenarios_id,
},
"target": {
"type": "azure_ai_agent",
"name": agent.name,
"version": agent.version,
},
"model_configuration": {
"model": simulator_model,
"sampling_params": {
"temperature": 0.7,
"top_p": 1.0,
"max_completion_tokens": 800,
},
},
"default_simulation_configuration": {
"max_num_turns": 8,
"conversation_repetitions": 2,
"desired_num_turns": 5,
"enable_conversation_dataset_generation": True,
"output_conversation_dataset_name": "support-simulations",
},
},
extra_body={"evaluation_level": "conversation"},
)
Usare casi di test in linea
Per definire gli scenari direttamente nella richiesta di esecuzione, impostare data_source.source su un'origine inline_user_conversation_simulation. Le sorgenti inline richiedono almeno un caso di test e non usano data_mapping.
inline_source = {
"type": "inline_user_conversation_simulation",
"test_cases": [
{
"test_case_id": "refund-delay",
"test_case_description": "A frustrated customer wants an update on a delayed refund.",
"simulation_configuration": {
"desired_num_turns": 6,
},
}
],
}
# In the run request:
# data_source={..., "source": inline_source}
Ottenere conversazioni generate
Interrogare periodicamente l'esecuzione finché non raggiunge uno stato finale, come descritto in Ottenere i risultati della valutazione nel cloud. Quando enable_conversation_dataset_generation è true, un'esecuzione completata include una voce output_datasets come la seguente:
{
"type": "simulated_user_conversations",
"dataset": {
"id": "dataset_123",
"name": "support-simulations",
"version": "1"
}
}
Usare il set di dati idrestituito , namee version per recuperare o riutilizzare le conversazioni generate. Se la generazione del set di dati è disabilitata, output_datasets viene omessa.
Passaggi successivi
- 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_simulation.py su GitHub.
- Per valutare le conversazioni archiviate, vedere Valutare i set di dati delle conversazioni.
- Per valutare le tracce di produzione, vedere Valutare le conversazioni tra modelli e agenti distribuiti.