Symulowanie konwersacji przy użyciu zestawu SDK Microsoft Foundry (wersja zapoznawcza)

Important

Elementy oznaczone jako (wersja zapoznawcza) w tym artykule są aktualnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą nie być obsługiwane lub mogą mieć ograniczone możliwości. Aby uzyskać więcej informacji, zobacz Warunki dodatkowe korzystania z testowych wersji Microsoft Azure.

Generowanie symulowanych konwersacji na podstawie opisów scenariuszy i ocenianie ich na poziomie konwersacji. Użyj tego scenariusza, aby przetestować zachowanie agenta w kontrolowanych sytuacjach przed wdrożeniem. Usługa generuje realistyczne konwersacje na podstawie opisów scenariuszy, a następnie je ocenia.

Wymagania wstępne

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

Omówienie symulacji konwersacji

Takie podejście jest przydatne w następujących celach:

  • Testowanie przed wdrożeniem: zweryfikuj zachowanie agenta w różnych scenariuszach bez rzeczywistego ruchu użytkowników.
  • Uwzględnienie przypadków brzegowych: scenariusze testowe, które rzadko zdarzają się w praktyce, ale ważne jest, aby były prawidłowo obsługiwane.
  • Testowanie regresji: Upewnij się, że aktualizacje agenta nie obniżają wydajności w znanych scenariuszach.
  • Testowanie skalowalności: Szybko generuj wiele rozmów, aby przetestować możliwości agenta pod obciążeniem.

Symulacja konwersacji jest zgodna z następującymi krokami:

  1. Podajesz opisy scenariuszy jako dane JSONL lub ściśle typowane przypadki testowe osadzone bezpośrednio w kodzie. Każdy przypadek testowy opisuje sytuację, w której symulowany użytkownik próbuje osiągnąć określony cel.
  2. Usługa używa modelu symulatora do odgrywania roli użytkownika, interakcji z agentem w oparciu o scenariusz.
  3. Każdy scenariusz generuje co najmniej jedną pełną konwersację.
  4. Ewaluatorzy na poziomie konwersacji oceniają wygenerowane konwersacje.
  5. Projekt przechowuje wyniki oceny. Opcjonalnie możesz zapisywać wszystkie wygenerowane rozmowy jako wersjonowany zbiór danych Foundry.

Uruchomienie korzysta ze źródła danych azure_ai_user_conversation_simulation_preview. Umieść ustawienia, które mają zastosowanie do każdego przypadku testowego w pliku default_simulation_configuration. Przypadek testowy może nadpisać ustawienia poszczególnych rozmów w swoim elemencie simulation_configuration; ustawienia, których nie nadpisuje, nadal korzystają z domyślnych ustawień uruchomienia.

Przygotowywanie danych scenariusza

Napiwek

Zamiast tworzyć scenariusze ręcznie, generuj je za pomocą typu zadania Ziarno symulacji (wieloturowe). Przed użyciem istniejącego wygenerowanego zestawu danych z użyciem tego interfejsu API znormalizuj id do test_case_id i przenieś desired_num_turns do simulation_configuration. Zobacz Wygeneruj początkowy zestaw danych symulacji.

Podaj przypadki testowe przy użyciu jednego z następujących typów źródeł:

  • file_id lub file_content w przypadku scenariuszy JSONL.
  • inline_user_conversation_simulation dla ściśle typowanych przypadków testowych w żądaniu uruchomienia. Uwzględnij co najmniej jeden przypadek testowy.

W przypadku formatu JSONL użyj nazw właściwości kanonicznych pokazanych w poniższym przykładzie. Uwzględnij ograniczenia dotyczące celu, kontekstu i zachowania użytkownika w programie test_case_description. Opis może zawierać od 1 do 2500 znaków.

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

Gdy dane JSONL używają tych nazw kanonicznych, pomiń element data_mapping. Jeśli używa różnych nazw, zamapuj te atrybuty na test_case_id, test_case_descriptioni simulation_configuration. Nie używaj data_mapping z inline_user_conversation_simulation źródłem.

Każdy wbudowany przypadek testowy lub przypadek testowy w formacie JSONL obsługuje następujące właściwości:

Majątek Opis
test_case_id Opcjonalny identyfikator. Usługa generuje identyfikator, gdy go pominiesz.
test_case_description Scenariusz, cel użytkownika i ograniczenia behawioralne prowadzące do symulowanej konwersacji.
simulation_configuration Opcjonalne ustawienia, które zastępują odpowiadające im domyślne ustawienia uruchomienia dla tego przypadku testowego.

Konfigurowanie symulowanego użytkownika

model_configuration Użyj obiektu , aby skonfigurować model, który odtwarza symulowanego użytkownika. Ten model jest oddzielony od ocenianego target modelu lub agenta.

Majątek Required Opis
model Yes Wdrożenie symulatora w formacie {connectionName}/{modelDeploymentName}. Router modeli nie jest obsługiwany w roli modelu symulatora; może być jedynie celem oceny.
sampling_params No Parametry próbkowania stosowane podczas generowania tur użytkownika przez symulator.
voice_model No Konwertuje symulowany tekst użytkownika na mowę za pośrednictwem punktu końcowego Voice Live. Pomiń tę właściwość dla symulacji tylko tekstu.

W przypadku symulacji głosowej voice_model.type musi mieć wartość azure-standard. Ustaw name na standardową nazwę neuronowego głosu Azure. Można również ustawić temperature na wartość od 0 do 1; jeśli parametr zostanie pominięty, zastosowana zostanie wartość domyślna bazowego modelu głosu.

Konfigurowanie konwersacji

Ustaw wartości dla całego przebiegu w pliku default_simulation_configuration. Elementy sterujące konwersacją max_num_turns, conversation_repetitions, desired_num_turns, audio_effects i user_behavior mogą również pojawić się w elemencie simulation_configuration przypadku testowego, aby zastąpić odpowiednie domyślne ustawienia uruchomienia. Właściwości generowania zestawu danych enable_conversation_dataset_generation i output_conversation_dataset_name są prawidłowe tylko w default_simulation_configuration i nie można ich przesłonić w poszczególnych przypadkach testowych.

Majątek Scope Wartość domyślna Opis
max_num_turns Uruchamianie lub przypadek testowy 20 Sztywny limit liczby wypowiedzi w każdej konwersacji. Musi być co najmniej 1.
conversation_repetitions Uruchomienie lub przypadek testowy 1 Liczba niezależnych konwersacji generowanych dla każdego przypadku testowego. Musi być co najmniej 1.
desired_num_turns Uruchomienie lub przypadek testowy Żadne Długość konwersacji docelowej. Nie może ono przekraczać obowiązującego max_num_turns. Jeśli zostanie pominięty, symulator określi długość na podstawie scenariusza.
audio_effects Uruchomienie lub przypadek testowy Żadne Efekty stosowane do symulacji głosowej. Ignorowane w symulacji tekstowej.
user_behavior Uruchomienie lub przypadek testowy Żadne Symulowane zachowanie użytkownika, takie jak przerwa.
enable_conversation_dataset_generation Uruchom tylko false Zapisuje wszystkie wygenerowane rozmowy do wersjonowanego zbioru danych Foundry.
output_conversation_dataset_name Tylko uruchom Wygenerowane przez usługę Nazwa zestawu danych używana, gdy generowanie zestawu danych konwersacji jest włączone.

Konfigurowanie warunków i przerw w działaniu głosu

Umieść audio_effects i user_behavior wewnątrz default_simulation_configuration , aby zastosować je do każdego przypadku testowego. Aby nadpisać dowolne z tych ustawień dla konkretnego przypadku testowego, umieść je zamiast tego wewnątrz znacznika simulation_configuration tego przypadku testowego.

Użyj audio_effects, aby sprawdzić, jak urządzenie docelowe działa w rzeczywistych warunkach odsłuchowych. Dodaj co najmniej jeden efekt: street_traffic, , background_tvcrowd_chatter, metro_stationlub telephonic_voice. Ustaw volume_percentage od 1 do 100, aby kontrolować ich łączny wolumin. Wartość domyślna to 15. Efekty dźwiękowe są ignorowane w symulacjach tylko tekstowych.

Użyj user_behavior.interruption, aby sprawdzić, jak obiekt docelowy radzi sobie z sytuacją, gdy użytkownik mówi, podczas gdy obiekt docelowy odpowiada. Ustaw element type na default, aby włączyć symulowane przerwania. Pomiń interruption , gdy przerwy nie są częścią testu.

{
  "default_simulation_configuration": {
    "audio_effects": {
      "effects": ["street_traffic", "telephonic_voice"],
      "volume_percentage": 20
    },
    "user_behavior": {
      "interruption": {
        "type": "default"
      }
    }
  }
}

Definiowanie ewaluatorów

Wybierz ewaluatory przeznaczone do oceny całych konwersacji. Symulowane rozmowy są automatycznie przypisywane do ewaluatorów.

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"},
            },
            "required": ["messages"],
        },
        include_sample_schema=False,
    )

    testing_criteria = [
        TestingCriterionAzureAIEvaluator(
            type="azure_ai_evaluator",
            name="customer_satisfaction",
            evaluator_name="builtin.customer_satisfaction",
            initialization_parameters={"model": model_deployment_name},
            data_mapping={"messages": "{{item.messages}}"},
        ),
    ]

Utwórz ocenę i uruchom

Zapisz kanoniczne wiersze JSONL z sekcji Przygotowywanie danych scenariusza jako 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_preview",
        "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"},
)

Używanie wbudowanych przypadków testowych

Aby zdefiniować scenariusze bezpośrednio w żądaniu uruchomienia, ustaw inline_user_conversation_simulation jako źródło data_source.source. Źródła wbudowane wymagają co najmniej jednego przypadku testowego i nie używają znacznika 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}

Pobieranie wygenerowanych konwersacji

Sonduj przebieg, dopóki nie osiągnie stanu terminalu zgodnie z opisem w temacie Uzyskiwanie wyników oceny chmury. Gdy parametr enable_conversation_dataset_generation ma wartość true, zakończone uruchomienie zawiera wpis output_datasets, taki jak ten:

{
  "type": "simulated_user_conversations",
  "dataset": {
    "id": "dataset_123",
    "name": "support-simulations",
    "version": "1"
  }
}

Użyj zwróconego zestawu danych id, namei version , aby pobrać lub ponownie użyć wygenerowanych konwersacji. Jeśli generowanie zestawu danych jest wyłączone, output_datasets zostanie pominięte.


Następne kroki