Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Gerar conversas simuladas a partir de descrições de cenários e avaliá-las ao nível da conversa. Use este cenário para testar o comportamento do seu agente em situações controladas antes da implantação. O serviço gera conversas realistas com base nas descrições dos seus cenários e depois avalia-as.
Pré-requisitos
- Complete os pré-requisitos de avaliação cloud e a configuração do cliente.
- Uma implementação de modelos para simular utilizadores.
- Um alvo de agente para avaliar.
- Dados de cenários que descrevem as interações a simular.
Os exemplos utilizam o cliente SDK configurado em Configurar o cliente SDK.
Compreender a simulação de conversa
Esta abordagem é útil para:
- Testes pré-implementação: Validar o comportamento dos agentes em vários cenários sem tráfego real de utilizadores.
- Cobertura de casos extremos: Cenários de teste que raramente ocorrem naturalmente, mas são importantes de gerir bem.
- Testes de regressão: Garantir que as atualizações dos agentes não degradam o desempenho em cenários conhecidos.
- Testes à escala: Gere rapidamente muitas conversas para pôr à prova as capacidades do agente.
A simulação de conversa segue estes passos:
- Pode fornecer descrições de cenários sob a forma de dados JSONL ou casos de teste em linha com tipagem forte. Cada caso de teste descreve uma situação que o utilizador simulado tenta realizar.
- O serviço utiliza um modelo simulador para desempenhar o papel do utilizador, interagindo com o seu agente com base no cenário.
- Cada cenário gera uma ou mais conversas completas.
- Os avaliadores de nível de conversa avaliam as conversas geradas.
- O seu projeto armazena os resultados da avaliação. Pode, opcionalmente, persistir todas as conversas geradas como um conjunto de dados versionado do Foundry.
A execução utiliza a fonte de dados azure_ai_user_conversation_simulation. Coloque as definições que se aplicam a todos os casos de teste em default_simulation_configuration. Um caso de teste pode redefinir definições individuais da conversa nas suas simulation_configuration; as definições que não redefine continuam a usar as predefinições da execução.
Preparar os dados dos cenários
Sugestão
Em vez de criar cenários manualmente, gere-os através do tipo de tarefa Semente de simulação (múltiplos turnos). Antes de usar um conjunto de dados gerado existente com esta API, normalize id para test_case_id e mova-se desired_num_turns para simulation_configuration. Consulte Gerar um conjunto de dados inicial de simulação.
Fornece casos de teste utilizando um destes tipos de fonte:
-
file_idoufile_contentpara cenários JSONL. -
inline_user_conversation_simulationpara casos de teste fortemente tipados no pedido de execução. Inclua pelo menos um caso de teste.
Para JSONL, use os nomes canónicos das propriedades mostrados no exemplo seguinte. Inclua o objetivo do utilizador, o contexto e as restrições comportamentais em test_case_description. A descrição pode conter de 1 a 2.500 caracteres.
{"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 os dados JSONL usam estes nomes canónicos, omita data_mapping. Se usar nomes diferentes, mapeie esses atributos para test_case_id, test_case_description, e simulation_configuration. Não utilizes data_mapping com uma origem inline_user_conversation_simulation.
Cada caso de teste inline ou JSONL suporta estas propriedades:
| Property | Descrição |
|---|---|
test_case_id |
Identificador opcional. O serviço gera um identificador quando o omite. |
test_case_description |
Cenário, objetivo do utilizador e restrições comportamentais que orientam a conversa simulada. |
simulation_configuration |
Definições opcionais que substituem as predefinições correspondentes da execução para este caso de teste. |
Configurar o utilizador simulado
Use o model_configuration objeto para configurar o modelo que reproduz o utilizador simulado. Este modelo é separado do target modelo ou agente que está a ser avaliado.
| Property | Obrigatório | Descrição |
|---|---|---|
model |
Sim | Implementação do simulador no formato {connectionName}/{modelDeploymentName}. O encaminhador de modelos não é compatível como modelo do simulador; apenas pode ser um alvo de avaliação. |
sampling_params |
No | Parâmetros de amostragem aplicados quando o simulador gera turnos de utilizador. |
voice_model |
No | Converte texto simulado do utilizador para fala através do endpoint Voice Live. Omita esta propriedade para simulação apenas de texto. |
Para simulação de voz, voice_model.type deve ser azure-standard. Defina name como um nome de voz neural padrão do Azure. Também pode definir temperature de 0 a 1; quando omitido, aplica-se o padrão do modelo de voz subjacente.
Configurar conversas
Defina valores para toda a execução em default_simulation_configuration. Os controlos de conversa audio_effects, user_behavior, simulation_configuration, desired_num_turns e conversation_repetitions também podem aparecer em max_num_turns de um caso de teste para substituir as predefinições de execução correspondentes. As propriedades enable_conversation_dataset_generation de geração de conjuntos de dados e output_conversation_dataset_name são válidas apenas em default_simulation_configuration e não podem ser anuladas por caso de teste.
| Property | Âmbito | Predefinição | Descrição |
|---|---|---|---|
max_num_turns |
Execução ou caso de teste | 20 |
Limite rígido de turnos em cada conversa. Deve ser pelo menos 1. |
conversation_repetitions |
Execução ou caso de teste | 1 |
Número de conversas independentes geradas para cada caso de teste. Deve ser pelo menos 1. |
desired_num_turns |
Execução ou caso de teste | None | Extensão pretendida da conversa. Não pode exceder o efetivo max_num_turns. Quando omitido, o simulador determina a duração com base no cenário. |
audio_effects |
Execução ou caso de teste | None | Efeitos aplicados à simulação de voz. Ignorado numa simulação apenas de texto. |
user_behavior |
Execução ou caso de teste | None | Comportamento simulado do utilizador, como interrupção. |
enable_conversation_dataset_generation |
Executar apenas | false |
Persiste todas as conversas geradas para um conjunto de dados Foundry versionado. |
output_conversation_dataset_name |
Executar apenas | Gerado por serviços | Nome do conjunto de dados usado quando a geração de conjuntos de dados de conversa está ativada. |
Configurar condições de voz e interrupções
Coloque audio_effects e user_behavior dentro de default_simulation_configuration para os aplicar a todos os casos de teste. Para substituir qualquer uma das definições para um caso de teste, coloque-a dentro do simulation_configuration desse caso de teste.
Use audio_effects para testar como o alvo se comporta em condições realistas de escuta. Adicionar um ou mais efeitos: street_traffic, crowd_chatter, background_tv, metro_station, ou telephonic_voice. Define volume_percentage de 1 a 100 para controlar o volume combinado. A predefinição é 15. Os efeitos áudio são ignorados em simulações apenas de texto.
Use user_behavior.interruption para testar como o alvo lida com um utilizador a falar enquanto o alvo responde. Defina o respetivo type como default para ativar interrupções simuladas. Omita interruption quando as interrupções não fizerem parte do teste.
{
"default_simulation_configuration": {
"audio_effects": {
"effects": ["street_traffic", "telephonic_voice"],
"volume_percentage": 20
},
"user_behavior": {
"interruption": {
"type": "default"
}
}
}
}
Definir avaliadores
Selecione avaliadores concebidos para avaliação ao nível da conversação. As conversas simuladas são automaticamente associadas aos avaliadores.
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}}"},
),
]
Crie a avaliação e execute
Guarde as linhas canónicas JSONL de Preparar dados do cenário como 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"},
)
Use casos de teste em linha
Para definir cenários diretamente no pedido de execução, defina data_source.source para uma inline_user_conversation_simulation fonte. Fontes inline requerem pelo menos um caso de teste e não usam 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}
Obtenha conversas geradas
Verifique periodicamente a execução até esta atingir um estado terminal, conforme descrito em Obter resultados de avaliação na nuvem. Quando enable_conversation_dataset_generation é true, uma execução concluída inclui uma entrada output_datasets como esta:
{
"type": "simulated_user_conversations",
"dataset": {
"id": "dataset_123",
"name": "support-simulations",
"version": "1"
}
}
Use o conjunto de dados iddevolvido , name, e version para recuperar ou reutilizar as conversas geradas. Se a geração de conjuntos de dados estiver desativada, output_datasets é omitida.
Passos seguintes
- Para verificar periodicamente a conclusão e interpretar os resultados, consulte Obter os resultados da avaliação na nuvem.
- Para um exemplo completo executável, veja sample_multiturn_conversation_simulation.py sobre GitHub.
- Para avaliar conversas armazenadas, consulte Avaliar conjuntos de dados de conversa.
- Para avaliar os rastreios de produção, consulte Avaliar o modelo implementado e as conversas de agentes.