Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto článku se dozvíte, jak spustit vyhodnocení v cloudu pro testování předem připravených testovacích datových sad.
Pro většinu scénářů používejte vyhodnocení cloudu – zejména při testování ve velkém měřítku, integraci vyhodnocení do kanálů kontinuální integrace a průběžného doručování (CI/CD) nebo provádění předběžného testování. Spouštění vyhodnocení v cloudu eliminuje nutnost spravovat místní výpočetní infrastrukturu a podporuje rozsáhlé automatizované testovací pracovní postupy. Můžete také naplánovat, aby se hodnocení spouštěla opakovaně, nebo můžete nastavit průběžné hodnocení , aby se automaticky vyhodnocovaly vzorkované odpovědi agenta v produkčním prostředí.
Výsledky vyhodnocení cloudu se ukládají do projektu Foundry. Výsledky můžete zkontrolovat na portálu, načíst je prostřednictvím sady SDK nebo je směrovat do Application Insights, pokud jsou připojené. Cloudové hodnocení podporuje všechny Microsoftem kurátorované vestavěné hodnotitele a vaše vlastní vlastní hodnotitele. Vyhodnocovače se spravují v katalogu vyhodnocovačů se stejným řízením přístupu na základě role v oboru projektu.
Tip
Kompletní spustitelné příklady najdete v ukázkách Python SDK pro vyhodnocení na GitHub.
Jak funguje vyhodnocení cloudu
Vyhodnocení cloudu má tři kroky:
- Definujte, co se má vyhodnotit. Popište svou datovou strukturu (
data_source_config) a hodnotitele (kritéria testování), kteří ji hodnotí. - Vytvořte vyhodnocení. Odešlete definici pomocí .
openai_client.evals.create() - Spusťte ho a přečtěte si výsledky. Spusťte běh pomocí
openai_client.evals.runs.create(), opakovaně zjišťujte jeho stav, dokud se nedokončí, a přečtěte si ohodnocené výsledky. Viz Získání výsledků pro schéma výsledků.
Zbývající část této části vás provede vstupy ke kroku 1: vyberte scénář a pak zvolte vyhodnocovače.
Výběr výchozího bodu
Existující datová sada
Tuto možnost použijte, pokud už máte dotazy a odpovědi uložené v souboru (nebo dotazy plus ground truth) a chcete jen, aby je Foundry vyhodnotil. JSONL podporuje jak řádky na úrovni jednotlivých tahů, tak vstupy na úrovni celé konverzace; CSV podporuje pouze úroveň jednotlivých tahů.
| Scénář | Kdy použít | Typ zdroje dat |
|---|---|---|
| Vyhodnocení datové sady na úrovni jednotlivých tahů | Každý řádek tvoří jednu dvojici query/response, případně s context nebo ground_truth. |
jsonl Nebo csv |
| Vyhodnocení datové sady na úrovni konverzace (Preview) | Každý řádek je konverzace vyjádřená messages jako pole. |
jsonl |
Data v Foundry nebo Application Insights
Tuto cestu použijte, když už je agent spuštěný a chcete vyhodnotit, co se skutečně stalo. Místo přesunu dat nasměrujete Foundry na data, která už existují – podle ID odpovědi Foundry nebo pomocí trasování Application Insights nebo ID konverzace.
| Scénář | Kdy použít | Typ zdroje dat |
|---|---|---|
| Vyhodnocení odpovědi agenta | Váš agent běží ve Foundry a máte k dispozici ID odpovědí k vyhodnocení. | azure_ai_responses |
| Vyhodnocení trasování na úrovni jednotlivých tahů (verze Preview) | Váš agent odesílá trasování OpenTelemetry do Application Insights, včetně frameworků mimo Foundry, jako je LangChain, nebo vlastních agentů instrumentovaných pomocí OpenTelemetry. Každá stopa je hodnocena nezávisle. | azure_ai_trace_data_source_preview |
| Vyhodnocení trasování na úrovni konverzace (náhled) | Stejné zdroje trasování, ale skóre úplných konverzací – podle ID konverzace nebo podle filtru agenta s vzorkováním | azure_ai_trace_data_source_preview |
Vstupy bez odpovědí
Tuto cestu použijte, pokud máte vstupy, ale zatím žádné odpovědi. Foundry vygeneruje odpovědi na model nebo cíl agenta v době vyhodnocení a pak je vyhodnotí. Vyberte řádek podle toho, zda váš vstup tvoří dotazy (odesílané jako jednotlivé tahy) nebo popisy scénářů (používané pro řízení interakce na úrovni celé konverzace).
| Scénář | Kdy použít | Zdroj dat / cíl |
|---|---|---|
| Dokončení cíle modelu | Máte dotazy a chcete vyhodnotit odpovědi z nasazení modelu. |
azure_ai_target_completions → azure_ai_model |
| Dokončení cílů agenta | Máte dotazy a chcete vyhodnotit odpovědi od agenta Foundry. |
azure_ai_target_completions → azure_ai_agent |
| Simulace konverzací (Preview) | Máte popisy scénářů (žádné dotazy); Foundry simuluje uživatele, který řídí interakci na úrovni konverzace s agentem. |
azure_ai_target_completions → azure_ai_agent |
Zatím žádná data
Tuto cestu použijte, když vytváříte nový model nebo agenta a neshromažďujete žádné vstupy. Foundry generuje testovací data úplně od začátku – zvolte syntetické dotazy pro široké pokrytí kvality nebo nežádoucí výzvy k testování bezpečnosti.
| Scénář | Kdy použít | Zdroj dat / cíl |
|---|---|---|
| Vyhodnocení syntetických dat (Preview) | Chcete mít kvalitní pokrytí nad rámec toho, co byste napsali ručně. Foundry generuje testovací dotazy, odesílá je do cíle a vyhodnotuje odpovědi. |
azure_ai_synthetic_data_gen_preview
azure_ai_model→ neboazure_ai_agent |
| Vyhodnocení červeného týmu | Chcete automatizované adverzariální testování – Foundry generuje jailbreaky a prompty se škodlivým obsahem a vyhodnocuje, jak cílový systém reaguje. |
azure_ai_red_team
azure_ai_model→ neboazure_ai_agent |
Výběr vyhodnocovačů
Každý scénář spojuje vyhodnocovače s poli v datech prostřednictvím mapování sloupců. Dostupná pole závisí na zdroji dat. Scénáře datových sad zpřístupňují pole vlastních položek, zatímco cílové vygenerované scénáře také zveřejňují odpověď modelu nebo agenta prostřednictvím ukázkového schématu. Pododdíly pro jednotlivé scénáře dále v tomto článku ukazují mapování sloupců pro každý případ.
Přehled dostupných vyhodnocovačů a informace o tom, jak je vybrat, najdete v článcích předdefinované vyhodnocovače a vlastní vyhodnocovače.
Požadavky
Nasazení OpenAI Azure s modelem GPT, který podporuje dokončování chatu (například
gpt-5-mini).Role uživatele Foundry v projektu Foundry.
Důležité
Nedávno byly přejmenovány role Foundry RBAC. Foundry User, Foundry Owner, Foundry Account Owner a Foundry Project Manager se dříve nazývaly Uživatel Azure AI, Vlastník Azure AI, Vlastník účtu Azure AI a Správce projektů Azure AI. Během zavádění přejmenování se stále můžou zobrazovat předchozí názvy na některých místech. ID rolí a základní oprávnění se při přejmenování nezmění.
Volitelně můžete ke spuštění vyhodnocení použít vlastní účet úložiště .
Poznámka
Některé funkce vyhodnocení mají regionální omezení. Podrobnosti najdete v podporovaných oblastech .
Začínáme
Nainstalujte sadu SDK a nastavte klienta:
pip install "azure-ai-projects>=2.2.0"
import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from openai.types.eval_create_params import DataSourceConfigCustom
from openai.types.evals.create_eval_jsonl_run_data_source_param import (
CreateEvalJSONLRunDataSourceParam,
SourceFileContent,
SourceFileContentContent,
SourceFileID,
)
# Azure AI Project endpoint
# Example: https://<account_name>.services.ai.azure.com/api/projects/<project_name>
endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]
# Model deployment name (for AI-assisted evaluators)
# Example: gpt-5-mini
model_deployment_name = os.environ.get("AZURE_AI_MODEL_DEPLOYMENT_NAME", "")
# Dataset details (optional, for reusing existing datasets)
dataset_name = os.environ.get("DATASET_NAME", "")
dataset_version = os.environ.get("DATASET_VERSION", "1")
# Create the project client
project_client = AIProjectClient(
endpoint=endpoint,
credential=DefaultAzureCredential(),
)
# Get the OpenAI client for evaluation API
openai_client = project_client.get_openai_client()
Příprava vstupních dat
Většina scénářů vyhodnocení vyžaduje vstupní data. Data můžete poskytnout dvěma způsoby:
Nahrání datové sady (doporučeno)
Nahrajte soubor JSONL nebo CSV a vytvořte ve svém projektu Foundry datovou sadu s verzí. Datové sady podporují správu verzí a opakované použití napříč několika testovacími běhy. Tento přístup použijte pro produkční testování a pracovní postupy CI/CD.
Připravte soubor JSONL s jedním objektem JSON na řádek obsahující pole, která vaši vyhodnocovače potřebují:
{"query": "What is machine learning?", "response": "Machine learning is a subset of AI.", "ground_truth": "Machine learning is a type of AI that learns from data."}
{"query": "Explain neural networks.", "response": "Neural networks are computing systems inspired by biological neural networks.", "ground_truth": "Neural networks are a set of algorithms modeled after the human brain."}
Nebo připravte soubor CSV se záhlavími sloupců odpovídajícími polím vyhodnocovače:
query,response,ground_truth
What is machine learning?,Machine learning is a subset of AI.,Machine learning is a type of AI that learns from data.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are a set of algorithms modeled after the human brain.
# Upload a local JSONL file. Skip this step if you already have a dataset registered.
data_id = project_client.datasets.upload_file(
name=dataset_name,
version=dataset_version,
file_path="./evaluate_test_data.jsonl",
).id
Vložení dat do textu
Pro rychlé experimentování s malými testovacími sadami nebo pro scénáře, které vyžadují vložená data, jako je vyhodnocení odpovědi agenta, poskytují data přímo v žádosti o vyhodnocení pomocí file_content. Pro vyhodnocení odpovědí agenta file_content je jediným podporovaným typem zdroje.
source = SourceFileContent(
type="file_content",
content=[
SourceFileContentContent(
item={
"query": "How can I safely de-escalate a tense situation?",
"ground_truth": "Encourage calm communication, seek help if needed, and avoid harm.",
}
),
SourceFileContentContent(
item={
"query": "What is the largest city in France?",
"ground_truth": "Paris",
}
),
],
)
Při vytváření procesu zadejte source jako pole "source" v konfiguraci zdroje dat. Oddíly scénáře, které následují, používají file_id jako výchozí nastavení.
Podpora typu zdroje podle scénáře
Ne všechny scénáře podporují oba typy zdrojů. Následující matice ukazuje, jaký typ zdroje každý scénář podporuje.
| Scénář | file_id |
file_content |
|---|---|---|
Datová sada (jsonl) |
Ano | Ano |
CSV (csv) |
Ano | Ano |
| Model nebo cíl agenta | Ano | Ano |
Odpověď agenta (azure_ai_responses) |
Ne | Ano |
Trasování (azure_ai_traces) |
N/A | N/A |
| Syntetická data (ve verzi Preview) | N/A | N/A |
Vyhodnocení datové sady
Vyhodnoťte předem vypočítané odpovědi v souboru JSONL pomocí jsonl typu zdroje dat. Tento scénář je užitečný, pokud už máte výstupy modelu a chcete posoudit jejich kvalitu.
Tip
Než začnete, dokončete začínáme a připravte vstupní data.
Definování schématu dat a vyhodnocovačů
Zadejte schéma, které odpovídá vašim polím JSONL, a vyberte vyhodnocovače (testovací kritéria) ke spuštění. Pomocí parametru data_mapping připojte pole ze vstupních dat k vyhodnocovačovým parametrům pomocí {{item.field}} syntaxe. Vždy zahrňte data_mapping do požadovaných vstupních polí každého vyhodnocovače. Názvy polí se musí shodovat s názvy polí v souboru JSONL — například, pokud vaše data mají "question" místo "query", použijte v mapování "{{item.question}}". Požadované parametry na vyhodnocovače najdete v předdefinovaných vyhodnocovacích nástrojích.
data_source_config = DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": {
"query": {"type": "string"},
"response": {"type": "string"},
"ground_truth": {"type": "string"},
},
"required": ["query", "response", "ground_truth"],
},
)
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"initialization_parameters": {
"model": model_deployment_name
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"initialization_parameters": {
"model": model_deployment_name
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "f1",
"evaluator_name": "builtin.f1_score",
"data_mapping": {
"response": "{{item.response}}",
"ground_truth": "{{item.ground_truth}}",
},
},
]
Vytvořit vyhodnocení a spustit
Vytvořte vyhodnocení, a pak spusťte test nad vaší nahranou datovou sadou. Spuštění provede každý vyhodnocovací objekt na každém řádku datové sady.
# Create the evaluation
eval_object = openai_client.evals.create(
name="dataset-evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
# Create a run using the uploaded dataset
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="dataset-run",
data_source=CreateEvalJSONLRunDataSourceParam(
type="jsonl",
source=SourceFileID(
type="file_id",
id=data_id,
),
),
)
Úplný příklad, jak ho spustit, najdete v souboru sample_evaluations_builtin_with_dataset_id.py na GitHubu. Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Vyhodnocení datové sady CSV
Pomocí typu zdroje dat vyhodnoťte předem vypočtené odpovědi v souboru csv CSV. Tento scénář funguje stejně jako vyhodnocení datové sady , ale přijímá soubory CSV místo JSONL. Použijte CSV, pokud jsou vaše data již v tabulkovém nebo tabulkovém formátu.
Tip
Než začnete, dokončete začínáme a připravte vstupní data.
Příprava souboru CSV
Vytvořte soubor CSV se záhlavími sloupců, které odpovídají polím, která vaše vyhodnocovače potřebují. Každý řádek představuje jeden testovací případ.
query,response,context,ground_truth
What is cloud computing?,Cloud computing delivers computing services over the internet.,Cloud computing is a technology for on-demand resource delivery.,Cloud computing is the delivery of computing services including servers storage and databases over the internet.
What is machine learning?,Machine learning is a subset of AI that learns from data.,Machine learning is a branch of artificial intelligence.,Machine learning is a type of AI that enables computers to learn from data without being explicitly programmed.
Explain neural networks.,Neural networks are computing systems inspired by biological neural networks.,Neural networks are used in deep learning.,Neural networks are a set of algorithms modeled after the human brain designed to recognize patterns.
Nahrání a spuštění
Nahrajte soubor CSV jako datovou sadu. Pak vytvořte vyhodnocení pomocí csv typu zdroje dat. Definice schématu a konfigurace vyhodnocovače jsou stejné jako pro vyhodnocení JSONL. Jediný rozdíl je v "type": "csv" ve zdroji dat.
# Upload the CSV file
data_id = project_client.datasets.upload_file(
name="eval-csv-data",
version="1",
file_path="./evaluation_data.csv",
).id
# Define the schema matching your CSV columns
data_source_config = DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": {
"query": {"type": "string"},
"response": {"type": "string"},
"context": {"type": "string"},
"ground_truth": {"type": "string"},
},
"required": [],
},
include_sample_schema=True,
)
# Define evaluators with data mappings to CSV columns
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
},
"initialization_parameters": {"model": model_deployment_name},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
},
"initialization_parameters": {"model": model_deployment_name},
},
{
"type": "azure_ai_evaluator",
"name": "f1",
"evaluator_name": "builtin.f1_score",
},
]
# Create the evaluation
eval_object = openai_client.evals.create(
name="CSV evaluation with built-in evaluators",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
# Create a run using the CSV data source type
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="csv-evaluation-run",
data_source={
"type": "csv",
"source": {
"type": "file_id",
"id": data_id,
},
},
)
Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Vyhodnocení cíle modelu
Odesílání dotazů do nasazeného modelu za běhu Vyhodnoťte odpovědi pomocí azure_ai_target_completions typu zdroje dat s azure_ai_model cílem. Vstupní data obsahují dotazy. Model generuje odpovědi, které pak vyhodnotíte.
Tip
Než začnete, dokončete začínáme a připravte vstupní data.
Definování šablony zprávy a cíle
Šablona input_messages řídí způsob odesílání dotazů do modelu. Slouží {{item.query}} k odkazování na pole ze vstupních dat. Zadejte model pro vyhodnocení a volitelné parametry vzorkování:
input_messages = {
"type": "template",
"template": [
{
"type": "message",
"role": "user",
"content": {
"type": "input_text",
"text": "{{item.query}}"
}
}
]
}
target = {
"type": "azure_ai_model",
"model": "gpt-5-mini",
"sampling_params": {
"top_p": 1.0,
"max_completion_tokens": 2048,
},
}
Nastavení vyhodnocovačů a mapování dat
Když model generuje odpovědi během zpracování, použijte {{sample.output_text}} v data_mapping k odkazování na výstup modelu. Slouží {{item.field}} k odkazování na pole ze vstupních dat.
data_source_config = DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": {
"query": {"type": "string"},
},
"required": ["query"],
},
include_sample_schema=True,
)
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"initialization_parameters": {
"model": model_deployment_name,
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
]
Vytvořit vyhodnocení a spustit
eval_object = openai_client.evals.create(
name="Model Target Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
data_source = {
"type": "azure_ai_target_completions",
"source": {
"type": "file_id",
"id": data_id,
},
"input_messages": input_messages,
"target": target,
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="model-target-evaluation",
data_source=data_source,
)
Úplný příklad s možností spuštění najdete v tématu sample_model_evaluation.py na GitHub. Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Tip
Pokud chcete přidat další zkušební spuštění, použijte stejný kód.
Vyhodnocení cíle agenta
Odešlete dotazy do agenta Foundry za běhu a vyhodnoťte odpovědi pomocí azure_ai_target_completions typu zdroje dat s azure_ai_agent cílem. Tento scénář funguje pro okamžité agenty i hostované agenty.
Tip
Než začnete, dokončete začínáme a připravte vstupní data.
Tip
Hostovaní agenti, kteří používají protokol odpovědí, pracují se stejnými vzorovými kódy, které jsou zde uvedené. U hostovaných agentů, kteří používají invokační protokol, je formát input_messages jiný. Podrobnosti najdete v protokolu vyvolání hostovaného agenta .
Definování šablony zprávy a cíle
Šablona input_messages určuje, jak se dotazy odesílají agentovi. Slouží {{item.query}} k odkazování na pole ze vstupních dat. Zadejte agenta, který se má vyhodnotit podle názvu:
input_messages = {
"type": "template",
"template": [
{
"type": "message",
"role": "developer",
"content": {
"type": "input_text",
"text": "You are a helpful assistant. Answer clearly and safely."
}
},
{
"type": "message",
"role": "user",
"content": {
"type": "input_text",
"text": "{{item.query}}"
}
}
]
}
target = {
"type": "azure_ai_agent",
"name": "my-agent",
"version": "1" # Optional. Uses latest version if omitted.
}
Nastavení vyhodnocovačů a mapování dat
Když agent generuje odpovědi za běhu, použijte {{sample.*}} proměnné data_mapping k odkazování na výstup agenta:
| Proměnné | Popis | Použít pro |
|---|---|---|
{{sample.output_text}} |
Odpověď agenta ve formátu prostého textu. | Vyhodnocovače, které očekávají řetězcovou odpověď (například coherence, violence). |
{{sample.output_items}} |
Strukturovaný výstup JSON agenta, včetně volání nástrojů. | Vyhodnocovače, kteří potřebují úplný kontext interakce (například task_adherence). |
{{item.field}} |
Pole ze vstupních dat | Vstupní pole jako query nebo ground_truth. |
Tip
Pole query může obsahovat strukturovaný JSON, včetně systémových zpráv a historie konverzací. Někteří vyhodnocovači agentů, jako task_adherence, používají tento kontext pro přesnější hodnocení. Podrobnosti o formátování dotazů najdete v části vyhodnocovače agentů.
data_source_config = DataSourceConfigCustom(
type="custom",
item_schema={
"type": "object",
"properties": {
"query": {"type": "string"},
},
"required": ["query"],
},
include_sample_schema=True,
)
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"initialization_parameters": {
"model": model_deployment_name,
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "task_adherence",
"evaluator_name": "builtin.task_adherence",
"initialization_parameters": {
"model": model_deployment_name,
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_items}}",
},
},
]
Vytvořit vyhodnocení a spustit
eval_object = openai_client.evals.create(
name="Agent Target Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
data_source = {
"type": "azure_ai_target_completions",
"source": {
"type": "file_id",
"id": data_id,
},
"input_messages": input_messages,
"target": target,
}
agent_eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="agent-target-evaluation",
data_source=data_source,
)
Úplný příklad s možností spuštění najdete v tématu sample_agent_evaluation.py na GitHub. Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Protokol volání hostovaného agenta
Hostovaní agenti , kteří používají protokol vyvolání, podporují stejný azure_ai_agent cílový typ, ale používají volný formát input_messages . Místo strukturovaného formátu šablony zadejte objekt JSON, který se mapuje přímo na text požadavku agenta /invocations . Zástupné {{item.*}} symboly slouží k nahrazení polí ze vstupních dat.
Pokud hostovaný agent podporuje protokoly odpovědí i volání, služba ve výchozím nastavení používá protokol vyvolání.
Definování formátu a cíle zprávy
input_messages = {"message": "{{item.query}}"}
target = {
"type": "azure_ai_agent",
"name": "my-hosted-agent", # Replace with your hosted agent name
"version": "1",
}
Vytvořit vyhodnocení a spustit
eval_object = openai_client.evals.create(
name="Hosted Agent Invocations Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
data_source = {
"type": "azure_ai_target_completions",
"source": {
"type": "file_id",
"id": data_id,
},
"input_messages": input_messages,
"target": target,
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="hosted-agent-invocations-evaluation",
data_source=data_source,
)
Nastavení vyhodnocovače a mapování dat jsou stejné jako při vyhodnocování agenta výzvy. Používá se {{sample.output_text}} pro textovou odpověď agenta a {{sample.output_items}} pro úplný strukturovaný výstup včetně volání nástrojů.
Vyhodnocení odpovědi agenta
Načtěte a vyhodnoťte odpovědi agenta Foundry podle ID odpovědí pomocí azure_ai_responses typu zdroje dat. Tento scénář použijte k vyhodnocení konkrétních interakcí agentů po jejich výskytu.
Tip
Než začnete, dokončete Začínáme.
ID odpovědi je jedinečný identifikátor vrácený pokaždé, když agent Foundry vygeneruje odpověď. ID odpovědí můžete shromažďovat z interakcí agentů pomocí rozhraní API odpovědí nebo z protokolů trasování vaší aplikace. Uveďte ID přímo jako obsah souboru.
Důležité
Vyhodnocení odpovědí agenta (azure_ai_responses) podporují pouze file_content pro poskytování ID odpovědí. Typ file_id zdroje není podporovaný a vrátí 400 Bad Request chybu.
Shromažďování ID odpovědí
Každé volání rozhraní API odpovědi vrátí objekt odpovědi s jedinečným id polem. Shromážděte tato ID z interakcí vaší aplikace nebo je vygenerujte přímo:
# Generate response IDs by calling a model through the Responses API
response = openai_client.responses.create(
model=model_deployment_name,
input="What is machine learning?",
)
print(response.id) # Example: resp_abc123
ID odpovědí můžete shromažďovat také z interakcí agentů v protokolech trasování vaší aplikace nebo v kanálu monitorování. Každé ID odpovědi jednoznačně identifikuje uloženou odpověď, kterou může služba vyhodnocení načíst.
Vytvořit vyhodnocení a spustit
data_source_config = {"type": "azure_ai_source", "scenario": "responses"}
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"initialization_parameters": {
"model": model_deployment_name,
},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
},
]
eval_object = openai_client.evals.create(
name="Agent Response Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
data_source = {
"type": "azure_ai_responses",
"item_generation_params": {
"type": "response_retrieval",
"data_mapping": {"response_id": "{{item.resp_id}}"},
"source": {
"type": "file_content",
"content": [
{"item": {"resp_id": "resp_abc123"}},
{"item": {"resp_id": "resp_def456"}},
]
},
},
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="agent-response-evaluation",
data_source=data_source,
)
Úplný příklad spustitelného příkazu najdete v tématu sample_agent_response_evaluation.py na GitHub. Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Vyhodnocení trasování (Preview)
Vyhodnoťte interakce agenta, které služba Application Insights už zachytila.
azure_ai_traces Použijte typ zdroje dat. Tento scénář je užitečný pro vyhodnocení skutečného produkčního provozu po nasazení. Vyberete stopy z monitorovací pipeline a spustíte na nich evaluátory, aniž byste museli znovu přehrávat jakékoli požadavky.
Důležité
Vyhodnocování trasování je doporučený přístup k hodnocení agentů, kteří nejsou vytvořeni pomocí služby Microsoft Foundry Agent Service – včetně frameworku LangChain a vlastních frameworků. Pokud váš agent odesílá do Application Insights trasovací úseky OpenTelemetry podle sémantických konvencí GenAI, vyhodnocování trasování může posoudit interakce agenta pomocí stejných vyhodnocovačů, které jsou k dispozici pro agenty Foundry.
Vyhodnocení trasování podporuje dva režimy:
-
Podle ID trasování – Vyhodnoťte konkrétní interakce agentů zadáním hodnot
operation_Idz Application Insights. - Podle filtru agenta – Automatické zjišťování a vyhodnocení nedávných trasování pro daného agenta bez ručního shromažďování ID trasování
Tip
Než začnete, dokončete Začínáme. Tento scénář také vyžaduje prostředek Application Insights připojený k vašemu projektu Foundry.
Inteligentní vzorkování
Vyhodnocení trasování podporuje inteligentní vzorkování, které místo vyhodnocení každého zachyceného trasování vybere reprezentativní podmnožinu trasování. Povolte tuto funkci zapnutím přepínače Intelligent sampling na portálu Foundry při konfiguraci běhu vyhodnocení tras. Inteligentní vzorkování snižuje náklady na vyhodnocení a zároveň zachovává rozmanitost tras, čímž zajišťuje, že do vyhodnocované sady budou zahrnuty hraniční případy, chybové cesty a různé typy konverzací.
Jak inteligentní vzorkování funguje
Algoritmus pro výběr vzorků používá přístup MinHash k zajištění rozmanitosti typu farthest-first, který probíhá ve více fázích:
- Přesná deduplikace – Odebere duplicitní stopy z fondu.
- Pevné filtry – Odebere přerušené relace, zkrácené trasování a chybně formátovaná volání nástrojů, která nejsou vhodná pro vyhodnocení.
- Agregace – kombinuje signály na úrovni trasování do sjednocené reprezentace.
- Výběr metodou nejprve nejvzdálenějších pomocí MinHash – Vypočítá haše citlivé na lokalitu (signatury MinHash) z uživatelského textu pro odhad podobnosti mezi trasami a poté iterativně vybírá nejméně podobnou trasu ze zbývající množiny. Každý následný výběr maximalizuje vzdálenost od všech dříve vybraných tras.
Tento přístup vytváří výrazně vyšší lexikální rozmanitost a širší pokrytí slovníku v porovnání s náhodným vzorkováním, což znamená, že vyhodnocená sada lépe představuje celou škálu interakcí s agenty – včetně vzácných, tvrdých a nových případů, které náhodné vzorkování obvykle vynechává.
Inteligentní vzorkování je zvláště účinné pro:
- Hodnocení a srovnávací testy – maximalizuje pokrytí vstupního rozdělení, takže hodnocení skóre odrážejí skutečnou rozmanitost.
- Generování rubrik – vytváří lépe zaměřené a použitelné rubriky tím, že zpřístupňuje různorodé vzory konverzací.
- Kurátorování datové sady pro jemné doladění - Vybírá záznamy, které modelům pomáhají učit se efektivněji.
Algoritmus běží zcela na místních výpočetních prostředcích bez dalších volání rozhraní API, takže neúčtují další náklady na odvozování modelu nad rámec samotného vyhodnocení.
Příklad inteligentního vzorkování
# Eval group for trace-based evaluations
data_source_config = {
"type": "azure_ai_source",
"scenario": "traces",
}
print("Creating trace-based evaluation group")
eval_object = client.evals.create(
name="Trace Evaluation (Agent Smart Filter)",
data_source_config=data_source_config, # type: ignore
testing_criteria=testing_criteria,
)
print(f"Evaluation created (id: {eval_object.id})")
# Compute time window in unix seconds
# Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
now_unix = int(time.time())
end_time = now_unix + 600
start_time = now_unix - (args.lookback_hours * 3600)
# Build trace_source based on mode
trace_source: dict = {
"type": "agent_filter",
"start_time": start_time,
"end_time": end_time,
"max_traces": args.max_traces,
"filter_strategy": "smart_filtering"
}
# Add agent name/version or agent id
trace_source["agent_name"] = agent_name
trace_source["agent_version"] = agent_version
## trace_source["agent_id"] = args.agent_id
data_source = {
"type": "azure_ai_trace_data_source_preview",
"trace_source": trace_source,
}
eval_run = client.evals.runs.create(
eval_id=eval_object.id,
name="trace-evaluation-agent-smart-filter-run",
data_source=data_source, # type: ignore
)
Požadavky na trasování dat
Vyhodnocení tras vyžaduje, aby váš agent generoval spany, které dodržují sémantické konvence OpenTelemetry pro generativní AI. Konkrétně hodnotící služba čte invoke_agent rozpětí z Application Insights a extrahuje z atributů data konverzací.
Používají se následující atributy span:
| Atribut | Požadované | Popis |
|---|---|---|
gen_ai.operation.name |
Ano | Musí být rovno "invoke_agent". Služba ignoruje všechny ostatní úseky. |
gen_ai.agent.id |
Pro režim filtru agenta | Jedinečný identifikátor agenta (formát: agent-name:version). |
gen_ai.agent.name |
Pro režim filtru agenta | Název agenta srozumitelný pro lidi. |
gen_ai.input.messages |
Vstupy dotazů pro vyhodnocovače | Pole JSON vstupních zpráv podle formátu zpráv GenAI semantických konvencí. Zprávy s rolí user nebo system mapou na query; zprávy s rolí assistant nebo tool mapou na response. |
gen_ai.output.messages |
Vstupy dotazů pro vyhodnocovače | Pole JSON výstupních zpráv generovaných modelem Všechny výstupní zprávy se mapují na response. Pokud výstup obsahuje také type: tool_call nebo type: tool_result, odpovídá to tool_calls. |
gen_ai.tool.definitions |
Volitelné | Pole JSON schémat nástrojů dostupných agentům Pokud chybí, služba se pokusí odvodit definice nástrojů ze zpráv o volání nástrojů, ale odvozená schémata mohou být neúplná. |
gen_ai.conversation.id |
Volitelné | Identifikátor konverzace, předávaný do výsledků vyhodnocení pro účely korelace. |
Poznámka
Pokud jsou gen_ai.input.messages a gen_ai.output.messages prázdné nebo chybí, hodnotitele kvality (soudržnost, plynulost, relevance, určení záměru) vrátí score=None. Vyhodnocení bezpečnosti (násilí, sebeškozování, sexuální, nenávist/nespravedlivost) mohou stále vytvářet skóre s částečnými daty, ale nemusí vést k smysluplným výsledkům.
Pro Python agenty vytvořené pomocí sady SDK Azure agenta AI přidejte [tracing] navíc, abyste umožnili automatické emise rozsahu:
pip install "azure-ai-agentserver-core[tracing]"
Předpoklady pro vyhodnocení sledování
Kromě obecných požadavků vyžaduje vyhodnocení trasování:
- Prostředek Application Insights připojený k projektu Foundry Viz Nastavování trasování v Microsoft Foundry.
- Spravovaná identita projektu musí mít roli Log Analytics Reader v prostředku Application Insights i v propojeném Log Analytics pracovním prostoru. Pokud jsou tabulky, které ukládají vaše trasování, chráněné (jejich úroveň ochrany je nastavená na Chráněno), přiřaďte také roli Privilegovaný čtenář dat monitorování ve stejných oborech působnosti, aby služba mohla číst chráněné trasovací tabulky.
- Balíček
azure-monitor-queryPython (pouze pokud shromažďujete identifikátory tras ručně).
pip install "azure-ai-projects>=2.2.0" azure-monitor-query
Nastavte tyto proměnné prostředí:
-
APPINSIGHTS_RESOURCE_ID– ID prostředku Application Insights (například/subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.Insights/components/<resource_name>). -
AGENT_ID— Identifikátor agenta vygenerovaný integrací trasování (gen_ai.agent.idatribut), který se používá k filtrování trasování. Formát:agent-name:version. -
TRACE_LOOKBACK_HOURS– (Volitelné) Počet hodin, o které se má při dotazování tras vrátit zpět. Výchozí je1.
Možnost A: Vyhodnocení podle filtru agenta
Nejjednodušší přístup spočívá v tom, že necháte službu automaticky vyhledat a vyhodnotit nedávné trasy pro konkrétního agenta. Není potřeba žádná kolekce ID ručního trasování.
import os
agent_id = os.environ["AGENT_ID"] # e.g., "my-weather-agent:1"
trace_lookback_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))
# Create the evaluation
data_source_config = {
"type": "azure_ai_source",
"scenario": "traces",
}
eval_object = openai_client.evals.create(
name="Agent Trace Evaluation (by agent)",
data_source_config=data_source_config,
testing_criteria=testing_criteria, # See "Set up evaluators" below
)
# Create a run — the service queries App Insights for matching traces
data_source = {
"type": "azure_ai_traces",
"agent_id": agent_id,
"max_traces": 50, # Maximum number of traces to evaluate
"lookback_hours": trace_lookback_hours,
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="agent-trace-eval-run",
data_source=data_source,
)
print(f"Evaluation run started: {eval_run.id}")
Služba filtruje invoke_agent úseky podle atributu gen_ai.agent.id, vzorkuje až na max_traces jedinečných ID trasování a vyhodnocuje všechny úseky z těchto trasování.
Možnost B: Vyhodnocení podle ID sledování
Pokud chcete mít větší kontrolu, shromážděte konkrétní ID trasování z Application Insights a vyhodnoťte je. Tato metoda je užitečná, když chcete vyhodnotit pečlivě vybranou sadu interakcí, například trasování označená výstrahami nebo vzorky vybrané ke kontrole kvality.
Shromáždit identifikátory tras z Application Insights
Vyhledávejte v Application Insights pro operation_Id hodnoty z trasování agenta. Každá operation_Id představuje úplnou interakci agenta:
import os
from datetime import datetime, timedelta, timezone
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, LogsQueryStatus
appinsights_resource_id = os.environ["APPINSIGHTS_RESOURCE_ID"]
agent_id = os.environ["AGENT_ID"]
trace_query_hours = int(os.environ.get("TRACE_LOOKBACK_HOURS", "1"))
end_time = datetime.now(timezone.utc)
start_time = end_time - timedelta(hours=trace_query_hours)
query = f"""dependencies
| where timestamp between (datetime({start_time.isoformat()}) .. datetime({end_time.isoformat()}))
| extend agent_id = tostring(customDimensions["gen_ai.agent.id"])
| where agent_id == "{agent_id}"
| distinct operation_Id"""
credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
response = logs_client.query_resource(
appinsights_resource_id,
query=query,
timespan=None, # Time range is specified in the query itself
)
trace_ids = []
if response.status == LogsQueryStatus.SUCCESS:
for table in response.tables:
for row in table.rows:
trace_ids.append(row[0])
print(f"Found {len(trace_ids)} trace IDs")
Vytvoření vyhodnocení a spuštění s využitím ID trasování
# Create the evaluation
data_source_config = {
"type": "azure_ai_source",
"scenario": "traces",
}
eval_object = openai_client.evals.create(
name="Agent Trace Evaluation (by trace IDs)",
data_source_config=data_source_config,
testing_criteria=testing_criteria, # See "Set up evaluators" below
)
# Create a run using the collected trace IDs
data_source = {
"type": "azure_ai_traces",
"trace_ids": trace_ids,
"lookback_hours": trace_query_hours,
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="agent-trace-eval-run",
metadata={
"agent_id": agent_id,
"start_time": start_time.isoformat(),
"end_time": end_time.isoformat(),
},
data_source=data_source,
)
print(f"Evaluation run started: {eval_run.id}")
Nastavení vyhodnocovačů a mapování dat
Při vyhodnocování trasování služba automaticky extrahuje data konverzace z atributů OpenTelemetry span. Tyto názvy polí použijte přímo v data_mapping (bez předpon item. ani sample. použitých v jiných scénářích):
| Proměnné | Zdrojový atribut | Popis |
|---|---|---|
{{item.query}} |
gen_ai.input.messages (role uživatele/systému) |
Dotaz uživatele extrahovaný z trasování. |
{{item.response}} |
gen_ai.input.messages (asistent/role nástrojů) + gen_ai.output.messages |
Odpověď agenta extrahovaná ze záznamu. |
{{item.tool_definitions}} |
gen_ai.tool.definitions |
Schémata nástrojů dostupná pro agenta. Vyžaduje se pouze pro evaluátory související s nástroji. |
{{item.tool_calls}} |
Extrahované ze zpráv asistenta v gen_ai.input.messages / gen_ai.output.messages |
Volání nástrojů provedená agentem během interakce. Používá se vyhodnocovači nástrojů. Vyžaduje se pouze pro evaluátory související s nástroji. |
testing_criteria = [
# Quality evaluators — require query and response from trace data
{
"type": "azure_ai_evaluator",
"name": "intent_resolution",
"evaluator_name": "builtin.intent_resolution",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
"tool_definitions": "{{item.tool_definitions}}",
},
"initialization_parameters": {
"model": model_deployment_name,
},
},
# Tool evaluators — assess tool usage quality
{
"type": "azure_ai_evaluator",
"name": "tool_call_accuracy",
"evaluator_name": "builtin.tool_call_accuracy",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
"tool_calls": "{{item.tool_calls}}",
"tool_definitions": "{{item.tool_definitions}}",
},
"initialization_parameters": {
"model": model_deployment_name,
},
},
# Safety evaluators — work even with partial trace data
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{item.response}}",
},
"initialization_parameters": {
"threshold": 4,
},
},
]
Úplný příklad spustitelného příkazu najdete v tématu sample_evaluations_builtin_with_traces.py na GitHub. Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Vyhodnocení syntetických dat (Preview)
azure_ai_synthetic_data_gen_preview Pomocí typu zdroje dat můžete vygenerovat syntetické testovací dotazy, odeslat je do nasazeného modelu nebo agenta Foundry a vyhodnotit odpovědi. Tento scénář použijte, pokud nemáte testovací datovou sadu. Služba generuje dotazy na základě výzvy, kterou zadáte (nebo z pokynů agenta), spustí je proti cíli a vyhodnotí odpovědi.
Tip
Než začnete, dokončete Začínáme.
Jak funguje hodnocení syntetických dat
- Služba generuje syntetické dotazy na základě vašich
prompta volitelných počátečních datových souborů. - Každý dotaz se odešle do zadaného cíle (modelu nebo agenta) a vygeneruje odpověď.
- Vyhodnocovače vyhodnotí jednotlivé odpovědi pomocí vygenerovaného dotazu a odpovědi.
- Vygenerované dotazy se ve vašem projektu ukládají jako datová sada pro opakované použití.
Parametry
| Parametr | Požadované | Popis |
|---|---|---|
samples_count |
Ano | Maximální počet syntetických testovacích dotazů, které se mají vygenerovat. |
model_deployment_name |
Ano | Nasazení modelu, které se použije ke generování syntetických dotazů Podporují se jenom modely s funkcí rozhraní API pro odpovědi. Dostupnost najdete v tématu Dostupnost oblastí rozhraní API odpovědí. |
prompt |
Ne | Pokyny popisující typ dotazů, které se mají vygenerovat. Volitelné, pokud má cíl agenta nakonfigurované pokyny. |
output_dataset_name |
Ne | Název výstupní datové sady, ve které se ukládají vygenerované dotazy. Pokud nezadáte název, služba ho automaticky vygeneruje. |
sources |
Ne | Počáteční datové soubory (podle ID souboru) pro zlepšení relevance vygenerovaných dotazů. V současné době je podporován pouze jeden soubor. |
Nastavení vyhodnocovačů a mapování dat
Generátor syntetických dat vytváří dotazy v {{item.query}} poli. Cíl generuje odpovědi, které jsou k dispozici v {{sample.output_text}}. Namapujte tato pole na vyhodnocovače:
data_source_config = {"type": "azure_ai_source", "scenario": "synthetic_data_gen_preview"}
testing_criteria = [
{
"type": "azure_ai_evaluator",
"name": "coherence",
"evaluator_name": "builtin.coherence",
"initialization_parameters": {
"model": model_deployment_name,
},
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
{
"type": "azure_ai_evaluator",
"name": "violence",
"evaluator_name": "builtin.violence",
"data_mapping": {
"query": "{{item.query}}",
"response": "{{sample.output_text}}",
},
},
]
Vytvořit vyhodnocení a spustit
Cíl modelu
Vygenerujte syntetické dotazy a vyhodnoťte model:
eval_object = openai_client.evals.create(
name="Synthetic Data Evaluation",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
data_source = {
"type": "azure_ai_synthetic_data_gen_preview",
"item_generation_params": {
"type": "synthetic_data_gen_preview",
"samples_count": 5,
"prompt": "Generate customer service questions about returning defective products",
"model_deployment_name": model_deployment_name,
"output_dataset_name": "my-synthetic-dataset",
},
"target": {
"type": "azure_ai_model",
"model": model_deployment_name,
},
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="synthetic-data-evaluation",
data_source=data_source,
)
Volitelně můžete přidat výzvu systému k tvarování chování cílového modelu. Pokud používáte input_messages s generováním syntetických dat, zahrňte pouze system zprávy rolí – služba poskytuje generované dotazy jako uživatelské zprávy automaticky.
data_source = {
"type": "azure_ai_synthetic_data_gen_preview",
"item_generation_params": {
"type": "synthetic_data_gen_preview",
"samples_count": 5,
"prompt": "Generate customer service questions about returning defective products",
"model_deployment_name": model_deployment_name,
},
"target": {
"type": "azure_ai_model",
"model": model_deployment_name,
},
"input_messages": {
"type": "template",
"template": [
{
"type": "message",
"role": "system",
"content": {
"type": "input_text",
"text": "You are a helpful customer service agent. Be empathetic and solution-oriented."
}
}
]
},
}
Cíl agenta
Generování syntetických dotazů a vyhodnocení agenta Foundry:
data_source = {
"type": "azure_ai_synthetic_data_gen_preview",
"item_generation_params": {
"type": "synthetic_data_gen_preview",
"samples_count": 5,
"prompt": "Generate questions about returning defective products",
"model_deployment_name": model_deployment_name,
},
"target": {
"type": "azure_ai_agent",
"name": agent_name,
"version": agent_version,
},
}
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="synthetic-agent-evaluation",
data_source=data_source,
)
Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků. Odpověď obsahuje output_dataset_id vlastnost, která obsahuje ID vygenerované datové sady, kterou můžete použít k načtení nebo opakovanému použití syntetických dat.
Vyhodnocení na úrovni konverzace (náhled)
Vyhodnoťte kompletní konverzace a vyhodnoťte kvalitu agenta napříč všemi interakcemi uživatelů – nejen individuálními odpověďmi. Pomocí hodnocení na úrovni celé konverzace můžete identifikovat problémy s kvalitou, jako jsou neúplné vyřešení úkolu, frustrace uživatelů a regrese při volání nástrojů, které hodnocení na úrovni jednotlivých tahů nezachytí.
Představte si například pracovníka podpory, kdy je uživatel během několika výměn stále frustrovanější:
Turn 1 — User: "I need to reset my password" (Potřebuji resetovat heslo). Agent: "Našel jsem váš účet. Pošlu odkaz pro resetování."
Turn 2 — User: "I didn't get the email" (Nedostal(a) jsem e-mail. Agent: "Přepošli jsem odkaz. Zkontrolujte spam."
Turn 3 — Uživatel: "Pořád nic. Můžete ho jednoduše resetovat přímo?" Agent: "Odeslal(a) jsem jiný odkaz pro resetování.
Hodnoticí mechanismus na úrovni jednotlivých tahů hodnotí pouze poslední odpověď, která je zdvořilá a podniká kroky, takže získá dobré hodnocení. Hodnotitel na úrovni celé konverzace, který v jejím průběhu hodnotí spokojenost zákazníka, upozorní na to, že agent třikrát zopakoval stejný neúspěšný postup, aniž by zkusil alternativu, a problém uživatele tak zůstal nevyřešen.
Hodnocení na úrovni celé konverzace se od hodnocení na úrovni jednotlivých tahů liší v několika ohledech:
| Aspect | Na úrovni replik | Úroveň konverzace |
|---|---|---|
| Scope | Jednotlivé páry odpovědí na dotazy | Kompletní konverzace s více replikami |
| Metrics | Kvalita a bezpečnost každé odpovědi | Výsledky na úrovni konverzace a spokojenost uživatelů |
| Formát dat | JSONL s poli query a response |
JSONL s polem messages obsahujícím úplnou konverzaci |
| Případ použití | Testování odpovědí jednotlivých modelů | Testování kompletních prostředí agentů |
Vyhodnocení na úrovni konverzace podporuje čtyři možnosti zdroje dat:
| Možnost | Kdy použít | Typ zdroje dat |
|---|---|---|
| Z datové sady nebo z vloženého textu | Máte místní záznamy konverzací nebo testovací data. |
jsonl s file_id nebo file_content |
| Podle ID konverzace | Chcete vyhodnotit konkrétní konverzace z App Insights |
azure_ai_trace_data_source_preview s trace_source |
| Podle filtru agenta s vzorkováním | Chcete vyhodnotit celkovou kvalitu agenta napříč vzorkovaným provozním provozem. |
azure_ai_trace_data_source_preview s trace_source |
| Simulované konverzace | Chcete vygenerovat syntetické testovací konverzace. |
azure_ai_target_completions s conversation_gen_preview |
Volba úrovně vyhodnocení
Parametr evaluation_level u běhu určuje, zda hodnotitelé hodnotí jednotlivé tahy konverzace, nebo celé konverzace:
| Value | Chování |
|---|---|
"turn" |
Hodnotitelé hodnotí každý tah nezávisle. |
"conversation" |
Vyhodnocovače hodnotí celou konverzaci jako celek. |
| (vynecháno) | Výchozí je "turn". |
Důležité
Kompatibilita vyhodnocovače: Každý vyhodnocovací nástroj podporuje konkrétní úrovně vyhodnocení. Zkontrolujte pole vyhodnocovače supported_evaluation_levels v katalogu vyhodnocovače.
-
Vyhodnocovače jen pro otáčení (například
fluency,relevance) nelze použít sevaluation_level="conversation". - V současné době podporují všechny vyhodnocovače na úrovni konverzací obě
"turn"úrovně i"conversation"úrovně.
Běžné chyby
| Error | Příčina | Řešení |
|---|---|---|
| Nekompatibilní úroveň vyhodnocení | Použití evaluation_level="conversation" s vyhodnocovačem jen pro otáčení |
Odeberte vyhodnocovač pouze pro otáčení nebo změňte na evaluation_level="turn" |
Příprava dat konverzace
Vytvořte soubor JSONL, ve kterém každý řádek obsahuje úplnou konverzaci v messages poli. Každá zpráva by měla obsahovat role (uživatel, asistent nebo systém) a content. Úplný příklad najdete v ukázkách vyhodnocení konverzací v sadě 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?"}]}
Můžete také zahrnout definice nástrojů a volání nástrojů, pokud váš agent používá nástroje:
{"messages": [{"role": "user", "content": "What is the capital 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."}]}
Definování schématu dat a vyhodnocovačů
Zadejte schéma pro data konverzace, zprávy a výběrové vyhodnocovače navržené pro vyhodnocení na úrovni konverzace. Vyhodnocovače na úrovni konverzací hodnotí celou interakci, nikoli jednotlivé obraty.
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["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_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="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="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}}"},
),
]
Vytvořit vyhodnocení a spustit
Příprava: stáhněte sample_data_multiturn_conversations.jsonl
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"},
)
Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Vyhodnoťte konverzace podle ID z trasování
Vyhodnoťte konkrétní konverzace z Application Insights zadáním ID konverzací. Tuto možnost použijte k původní příčině problémů nebo k ověření oprav konkrétních interakcí. Můžete například prošetřit konverzaci označenou upozorněním nebo ověřit opravu známého problému.
Kde najít ID konverzací
Najděte ID konverzací v:
-
Uživatelské rozhraní trasovacích protokolů Application Insights — Přejděte k zajímavým trasováním a v podrobnostech trasování vyhledejte pole
conversation_id. -
Výstup protokolování vaší aplikace – Pokud explicitně nastavíte
conversation_idpři vytváření odpovědí agenta, načtěte ho z protokolů. -
Kontext trasování OpenTelemetry —
conversation_idmůže být také odvozeno z hlavičky traceparent, pokud váš agent používá standardní propagaci kontextu trasování.
Poznámka
Definice nástrojů jsou automaticky načítány z tras nebo zjišťovány z registru agenta. V požadavku je nemusíte zadávat.
Parametry pro vyhledání ID konverzace
| Parametr | Požadované | Popis |
|---|---|---|
conversation_ids |
Ano | Pole identifikátorů konverzací k vyhodnocení. |
lookback_hours |
Ne | Počet hodin zpětného hledání od end_time. Výchozí hodnota je sedm dní (168 hodin). |
end_time |
Ne | Konec vyhledávacího okna (formát ISO 8601). Ve výchozím nastavení je nastaven aktuální čas. |
import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator
endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
# Provide conversation IDs or trace IDs from App Insights
conversation_ids = ["conversation_1234", "conversation_5678"]
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
project_client.get_openai_client() as openai_client,
):
# Eval group for trace-based evaluations
data_source_config = {
"type": "azure_ai_source",
"scenario": "traces",
}
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}}"},
),
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="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}}"},
),
]
# Create evaluation with traces scenario
eval_object = openai_client.evals.create(
name="Multi-turn Trace Evaluation (by ID)",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
# Run evaluation on specific conversation IDs
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="multiturn-trace-by-id-run",
data_source={
"type": "azure_ai_trace_data_source_preview",
"trace_source": {
"type": "conversation_id_source",
"conversation_ids": conversation_ids,
},
},
extra_body={"evaluation_level": "conversation"},
)
Poznámka
- Příjem dat do Application Insights může způsobit zpoždění mezi okamžikem, kdy jsou trasovací záznamy generovány, a okamžikem, kdy jsou k dispozici pro účely vyhodnocení. Pokud dotaz nenajde trasování, počkejte několik minut a zkuste to znovu.
- Maximální zpětné vyhledávání je 7 dní (168 hodin). Pokud chcete získat přístup ke starším trasováním, použijte
start_timeaend_timev rámci limitů uchovávání informací v App Insights.
Vyhodnocení ukázkových konverzací podle filtru agenta
Vyhodnoťte ukázkovou sadu konverzací z Application Insights filtrováním podle názvu agenta. Pomocí této možnosti můžete posoudit celkovou kvalitu agenta napříč produkčním provozem. Například spusťte pravidelné hodnocení kvality nebo monitorujte snížení kvality v produkčním prostředí.
Agent, který zadáte pro filtrování, může být součástí konverzace s více agenty. Filtr odpovídá jakékoli konverzaci, ve které se tento agent zúčastnil.
Poznámka
Definice nástrojů jsou automaticky načítány z tras nebo zjišťovány z registru agenta. V požadavku je nemusíte zadávat.
Pole identit agenta
Určete agenta, který se má filtrovat pomocí jednoho z těchto formátů:
| Format | Příklad | Popis |
|---|---|---|
agent_name + agent_version |
"agent_name": "my-agent", "agent_version": "1" |
Dvě samostatná pole. Pokud agent_version je vynechán, použijte nejnovější verzi. |
agent_id |
"agent_id": "my-agent:1" |
Jeden řetězec ve formátu "name:version". |
Strategie filtrování
| Strategy | Popis |
|---|---|
random_sampling |
(Výchozí) Rovnoměrně náhodně vzorkujte konverzace max_traces . |
smart_filtering |
Heuristika spravovaná službou, která upřednostňuje „zajímavá“ trasování – konverzace s potenciálními problémy, okrajovými případy nebo anomáliemi. |
Parametry
| Parametr | Požadované | Popis |
|---|---|---|
agent_name |
Ano | Název agenta pro filtrování trasování. |
agent_version |
Ne | Verze agenta. Pokud tento parametr vynecháte, použije se nejnovější verze. |
agent_id |
Ne | Alternativa k agent_name + agent_version. Jeden řetězec ve formátu "name:version". |
start_time |
Ano | Začátek časového intervalu (v sekundách od začátku Unixové epochy, UTC). |
end_time |
Ano | Konec časového intervalu (Unix epoch seconds, UTC). Přidejte rezervu +600 sekund, abyste předešli zpoždění při příjmu dat. |
max_traces |
Ne | Maximální počet konverzací k ukázce Výchozí hodnota je 1 000. |
filter_strategy |
Ne |
"random_sampling" (výchozí) nebo "smart_filtering" (heuristika spravovaná službou, která upřednostňuje zajímavé trasy). |
Důležité
Časové období (end_time - start_time) musí být nejméně 15 minut (900 sekund). Tento požadavek je dán tím, že dotazy na úrovni konverzací uplatňují na každé straně pětiminutový interval nečinnosti, aby se předešlo neúplným konverzacím.
import os
import time
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator
endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
agent_name = os.environ["FOUNDRY_AGENT_NAME"]
agent_version = os.environ.get("FOUNDRY_AGENT_VERSION", "")
with (
DefaultAzureCredential() as credential,
AIProjectClient(endpoint=endpoint, credential=credential) as project_client,
project_client.get_openai_client() as openai_client,
):
# Eval group for trace-based evaluations
data_source_config = {
"type": "azure_ai_source",
"scenario": "traces",
}
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}}"},
),
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="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}}"},
),
]
eval_object = openai_client.evals.create(
name="Multi-turn Trace Evaluation (Agent Filter)",
data_source_config=data_source_config,
testing_criteria=testing_criteria,
)
# Compute time window in unix seconds
# Pad end_time by +600s (10 min) to avoid ingestion-delay edge exclusion
now_unix = int(time.time())
end_time = now_unix + 600
start_time = now_unix - (24 * 3600) # 24 hours lookback
# Build trace_source with agent filter
trace_source = {
"type": "agent_filter",
"agent_name": agent_name,
"start_time": start_time,
"end_time": end_time,
"max_traces": 5,
}
if agent_version:
trace_source["agent_version"] = agent_version
# Run evaluation on sampled agent conversations
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="multiturn-agent-filter-run",
data_source={
"type": "azure_ai_trace_data_source_preview",
"trace_source": trace_source,
},
extra_body={"evaluation_level": "conversation"},
)
Poznámka
Časový interval dotazu App Insights je momentálně omezený na maximálně 7 dnů (168 hodin). Nemůžete získat přístup k trasování starším než 7 dnů bez explicitního poskytnutí start_time a end_time v rámci limitů uchovávání informací v App Insights.
Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Simulace konverzací
Vygenerujte simulované konverzace z popisů scénářů a vyhodnoťte je na úrovni konverzace. Tento scénář použijte k otestování chování agenta v kontrolovaných situacích před nasazením. Služba generuje realistické konverzace na základě popisu scénáře a pak je vyhodnotí.
Tento přístup je užitečný pro:
- Testování před nasazením: Ověřte chování agenta v různých scénářích bez skutečného provozu uživatelů.
- Pokrytí okrajových případů: Testovací scénáře, které se přirozeně vyskytují jen zřídka, ale je důležité je správně ošetřit.
- Regresní testování: Zajistěte, aby aktualizace agenta nezhoršily výkon v známých scénářích.
- Testování škálovatelnosti: Rychle generujte mnoho konverzací, abyste zátěžově otestovali schopnosti agenta.
Jak funguje simulace konverzací
- Zadáte datovou sadu popisů scénářů – každý řádek popisuje situaci, kterou se simulovaný uživatel pokusí provést.
- Služba používá model simulátoru k hraní role uživatele a interakci s vaším agentem na základě scénáře.
- Každý scénář generuje jednu nebo více kompletních konverzací.
- Vyhodnocovače na úrovni konverzací vyhodnotí vygenerované konverzace.
- Váš projekt ukládá jak konverzace, tak výsledky vyhodnocení.
Příprava dat scénáře
Vytvořte soubor JSONL, kde každý řádek popisuje scénář pro simulovaného uživatele. Schéma vyžaduje id, test_case_descriptiona desired_num_turns. Uveďte podrobnosti o cíli, kontextu a omezeních uživatele. Úplný příklad najdete v sadě SDK v ukázkách vyhodnocení konverzací.
{"id": "contoso_refund_timeline", "test_case_description": "Customer returned an item to Contoso Electronics 5 days ago and hasn't received their refund yet. They want to know how long Contoso refunds take.", "desired_num_turns": 10}
{"id": "contoso_store_hours_lookup", "test_case_description": "Customer wants to know what time the Contoso Electronics store closes today. Simple single-fact question with possibly one clarifying turn about which location.", "desired_num_turns": 3}
Parametry
| Parametr | Požadované | Popis |
|---|---|---|
num_conversations |
Ne | Počet konverzací, které se mají vygenerovat v jednotlivých scénářích Výchozí hodnota je 5, limit 5 na straně serveru. |
max_turns |
Ne | Maximální počet replik (výměn) v jedné konverzaci Výchozí hodnota je 10, limit na straně serveru 20. |
model |
Ano | Nasazení modelu, které se má použít k simulaci uživatele. Například: gpt-4.1. |
sampling_params |
Ne | Parametry vzorkování pro model simulátoru, včetně temperature, top_pa max_completion_tokens. |
data_mapping |
Ne | Mapuje pole z vašeho scénáře JSONL na parametry simulace. Společné mapování: test_case_description, id, desired_num_turns. |
Definování vyhodnocovačů
Vyberte vyhodnocovače navržené pro hodnocení na úrovni konverzace. Simulované konverzace se automaticky přiřazují k hodnotitelům.
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["FOUNDRY_PROJECT_ENDPOINT"]
model_deployment_name = os.environ["FOUNDRY_MODEL_NAME"]
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}}"},
),
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="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}}"},
),
]
Vytvořit vyhodnocení a spustit
Příprava: stáhněte si sample_data_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="./sample_data_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
eval_run = openai_client.evals.runs.create(
eval_id=eval_object.id,
name="conversation-simulation-run",
data_source={
"type": "azure_ai_target_completions",
"source": {
"type": "file_id",
"id": scenarios_id,
},
"target": {
"type": "azure_ai_agent",
"name": agent.name,
"version": agent.version,
},
"item_generation_params": {
"type": "conversation_gen_preview",
"model": model_deployment_name,
"num_conversations": 2,
"max_turns": 5,
"sampling_params": {
"temperature": 0.7,
"top_p": 1.0,
"max_completion_tokens": 800,
},
"data_mapping": {
"test_case_description": "test_case_description",
"id": "id",
"desired_num_turns": "desired_num_turns",
},
},
},
extra_body={"evaluation_level": "conversation"},
)
Chcete-li zjistit dokončení a interpretovat výsledky, podívejte se na Získání výsledků.
Získání výsledků
Po dokončení zkušebního spuštění načtěte výsledky se skóre a zkontrolujte je na portálu nebo programaticky.
Hlasování o výsledcích
Procesy vyhodnocení jsou asynchronní. Dotazujte stav spuštění, dokud se neskončí, a pak načtěte výsledky:
import time
from pprint import pprint
while True:
run = openai_client.evals.runs.retrieve(
run_id=eval_run.id, eval_id=eval_object.id
)
if run.status in ("completed", "failed"):
break
time.sleep(5)
print("Waiting for eval run to complete...")
# Retrieve results
output_items = list(
openai_client.evals.runs.output_items.list(
run_id=run.id, eval_id=eval_object.id
)
)
pprint(output_items)
print(f"Report URL: {run.report_url}")
Interpretace výsledků
V jednom příkladu dat vypíše všechny vyhodnocovače následující schéma:
- Popisek: binární popisek "úspěšný" (pass) nebo "neúspěšný" (fail), podobný výstupu jednotkového testu. Pomocí tohoto výsledku můžete usnadnit porovnání mezi vyhodnocovači.
- Skóre: skóre z přirozeného měřítka každého vyhodnocovače. Někteří hodnotitelé používají jemně odstupňovanou rubriku, bodování na 5bodové stupnici (vyhodnocovače kvality) nebo 7bodové měřítko (vyhodnocovače bezpečnosti obsahu). Jiné, například textové vyhodnocovače podobnosti, používají skóre F1, které jsou plovoucí mezi 0 a 1. Libovolné skóre jiné než binární se v poli "label" podle hodnoty "threshold" převede na "pass" nebo "fail".
- Prahová hodnota: Jakékoli nebinární skóre se binarizují na "pass" nebo "fail" na základě výchozí prahové hodnoty, kterou může uživatel přepsat v prostředí sady SDK.
- Důvod: Aby bylo možné zlepšit srozumitelnost, vypíše všechny vyhodnocovací moduly LLM také pole s odůvodněním, které vysvětluje, proč je zadané určité skóre.
- Podrobnosti: (volitelné) U některých vyhodnocovačů, například tool_call_accuracy, může existovat pole podrobností nebo příznaky, které obsahují další informace, které uživatelům pomůžou ladit své aplikace.
Příklad výstupu (jedna položka)
{
"type": "azure_ai_evaluator",
"name": "Coherence",
"metric": "coherence",
"score": 4.0,
"label": "pass",
"reason": "The response is well-structured and logically organized, presenting information in a clear and coherent manner.",
"threshold": 3,
"passed": true
}
Příklad výstupu (agregace)
Pro agregaci výsledků v rámci datových příkladů (datové sady) tvoří průměrný poměr případů označených jako "pass" průběžnou míru pro danou datovou sadu.
{
"eval_id": "eval_abc123",
"run_id": "run_xyz789",
"status": "completed",
"result_counts": {
"passed": 85,
"failed": 15,
"total": 100
},
"per_testing_criteria_results": [
{
"name": "coherence",
"passed": 92,
"failed": 8,
"pass_rate": 0.92
},
{
"name": "relevance",
"passed": 78,
"failed": 22,
"pass_rate": 0.78
}
]
}
Řešení potíží
Úloha běží po dlouhou dobu
Vaše vyhodnocovací úloha může zůstat ve stavu Spuštěno na delší dobu. K tomuto stavu obvykle dochází, když nasazení modelu Azure OpenAI nemá dostatečnou kapacitu, což způsobí, že služba bude požadavky opakovat.
Rozlišení:
- Zrušte aktuální úlohu vyhodnocení pomocí funkce
openai_client.evals.runs.cancel(run_id, eval_id=eval_id). - Zvyšte kapacitu modelu na portálu Azure.
- Znovu spusťte vyhodnocení.
Chyby ověřování
Pokud obdržíte chybu 401 Unauthorized nebo 403 Forbidden, ověřte, že:
- Vaše
DefaultAzureCredentialkonfigurace je správně nakonfigurovaná. Pokud používáte Azure CLI, spusťteaz login. - Váš účet má v projektu Foundry roli uživatele Foundry .
- Adresa URL koncového bodu projektu je správná a obsahuje názvy účtů i projektů.
Chyby formátu dat
Pokud vyhodnocení selže s chybou schématu nebo mapování dat:
- Ověřte, že soubor JSONL obsahuje jeden platný objekt JSON na řádek.
- Ověřte, že názvy polí odpovídají
data_mappingnázvům polí v souboru JSONL přesně (rozlišují se malá a velká písmena). - Zkontrolujte, že
item_schemavlastnosti odpovídají polím v datové sadě.
Chyba HTTP 400 při použití file_id při vyhodnocování odpovědí agenta
Vyhodnocení odpovědí agenta (azure_ai_responses) podporují pouze vložená data prostřednictvím file_content. Pokud zadáte ID odpovědí pomocí file_id, požadavek vrátí 400 Bad Request chybu.
Řešení: Přepněte na file_content a uveďte ID odpovědí přímo v textu.
Chyby omezení rychlosti
Na úrovni tenanta, předplatného a projektu se u vytváření běhů vyhodnocení uplatňují limity četnosti. Pokud obdržíte odpověď 429 Too Many Requests:
- Zkontrolujte hlavičku
retry-afterv odpovědi na doporučenou dobu čekání. - Podrobnosti o limitu rychlosti najdete v textu odpovědi.
- Při opakování neúspěšných požadavků použijte exponenciální zpomalování.
Pokud úloha vyhodnocení selže s chybou 429 během provádění:
- Zmenšete velikost testovací datové sady nebo ji rozdělte do menších dávek.
- Zvyšte kvótu tokenů za minutu (TPM) pro nasazení modelu na portálu Azure.
Chyby nástroje vyhodnocovače agentů
Pokud hodnoticí modul agenta vrátí chybu pro nástroje bez podpory:
- Projděte si podporované nástroje pro vyhodnocovače agentů.
- Jako alternativní řešení zabalte nepodporované nástroje jako uživatelsky definované nástroje funkcí, aby je vyhodnocovací nástroj mohl posoudit.