Utvärdera distribuerade agent- och modellinteraktioner

Important

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Utvärdera lagrade svar eller OpenTelemetry-spårningar från distribuerade agenter och modeller utan att spela upp de ursprungliga begärandena igen.

Förutsättningar

  • Slutför kraven för molnutvärderingen och klientkonfigurationen.
  • ID:n för lagrade svar för svarsutvärdering eller en Application Insights-resurs som är ansluten till ditt Foundry-projekt för spårutvärdering.
  • OpenTelemetry-intervall som uppfyller kraven för spårningsdata när du utvärderar spårningar.

I exemplen används SDK-klienten som konfigurerats i Konfigurera SDK-klienten.

Utvärdera interaktioner efter svars-ID

Hämta och utvärdera Foundry-agentsvar med svars-ID:t med hjälp av azure_ai_responses datakällans typ. Använd det här scenariot för att utvärdera specifika agentinteraktioner när de inträffar.

Tips/Råd

Slutför klientkonfigurationen innan du börjar.

Ett svars-ID är en unik identifierare som returneras varje gång en Foundry-agent genererar ett svar. Du kan samla in svars-ID:n från agentinteraktioner med hjälp av svars-API :et eller från programmets spårningsloggar. Ange ID:na direkt i filinnehållet.

Important

Utvärderingar av agents svar (azure_ai_responses) stöder endast file_content för att ange svars-ID:n. Källtypen file_id stöds inte och returnerar ett 400 Bad Request fel.

Samla in svar-ID:n

Varje anrop till svars-API:et returnerar ett svarsobjekt med ett unikt id fält. Samla in dessa ID:er från ditt programs interaktioner eller generera dem direkt:

# 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

Du kan också samla in svars-ID:er från agentinteraktioner i programmets spårningsloggar eller övervakningspipeline. Varje svars-ID identifierar unikt ett lagrat svar som utvärderingstjänsten kan hämta.

Skapa utvärdering och kör

from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

data_source_config = {"type": "azure_ai_source", "scenario": "responses"}

testing_criteria = [
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="coherence",
        evaluator_name="builtin.coherence",
        initialization_parameters={"model": model_deployment_name},
    ),
    TestingCriterionAzureAIEvaluator(
        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,
)

Ett fullständigt körbart exempel finns i sample_agent_response_evaluation.py på GitHub. Om du vill kontrollera om processen är slutförd och tolka resultaten, se Hämta resultat för molnutvärdering.

Utvärdera spårningar (förhandsversion)

Utvärdera agentinteraktioner som Application Insights redan har samlat in. Använd datakällans azure_ai_traces typ. Det här scenariot är användbart för utvärdering efter distributionen av verklig produktionstrafik. Du väljer spår från ditt övervakningsflöde och kör utvärderare på dem utan att köra om några förfrågningar.

Important

Spårningsutvärdering är den rekommenderade metoden för att utvärdera agenter som inte skapats med Microsoft Foundry Agent Service – inklusive LangChain och anpassade ramverk. Så länge din agent genererar OpenTelemetry-intervall efter GenAI-semantiska konventioner till Application Insights kan spårningsutvärderingen utvärdera dess interaktioner med hjälp av samma utvärderare som är tillgängliga för Foundry-agenter.

Spårningsutvärdering stöder två lägen:

  • Med spårnings-ID :n – Utvärdera specifika agentinteraktioner genom att ange deras operation_Id värden från Application Insights.
  • Efter agentfilter – Identifiera och utvärdera de senaste spårningarna automatiskt för en viss agent, utan att manuellt samla in spårnings-ID:t.

Tips/Råd

Slutför klientkonfigurationen innan du börjar. Det här scenariot kräver också en Application Insights-resurs som är ansluten till ditt Foundry-projekt.

Intelligent insamling

Spårningsutvärdering stöder intelligent sampling, som väljer en representativ delmängd av spårningar för utvärdering i stället för att utvärdera varje samlad spårning. Aktivera växlingsreglaget Intelligent sampling i Foundry-portalen när du konfigurerar en körning för spårningsutvärdering. Intelligent sampling minskar utvärderingskostnaden samtidigt som spårningsdiversitet bevaras – vilket säkerställer att gränsfall, felsökvägar och olika konversationsmönster ingår i den utvärderade uppsättningen.

Så här fungerar intelligent sampling

Urvalsalgoritmen använder en MinHash-baserad farthest-first-metod för diversitet som utförs i flera steg:

  1. Exakt deduplicering – Tar bort duplicerade spårningar från poolen.
  2. Hårda filter – Tar bort brutna sessioner, trunkerade spårningar och felformade verktygsanrop som inte är lämpliga för utvärdering.
  3. Sammansättning – Kombinerar spårningsnivåsignaler till en enhetlig representation.
  4. MinHash farthest-first-urval – Beräknar lokalitetskänsliga hashvärden (MinHash-signaturer) för användartext för att uppskatta likheten mellan spår, och väljer sedan iterativt det minst liknande spåret ur den återstående mängden. Varje efterföljande val maximerar avståndet från alla tidigare valda spårningar.

Denna metod ger betydligt högre lexikal mångfald och bredare vokabulärtäckning jämfört med slumpmässig sampling, vilket innebär att den utvärderade uppsättningen bättre representerar hela utbudet av agentinteraktioner - inklusive sällsynta, hårda och nya fall som slumpmässig sampling tenderar att missa.

Intelligent sampling är särskilt effektivt för:

  • Utvärdering och riktmärken – Maximerar täckningen av indatafördelningen så att utvärderingspoängen återspeglar verklig mångfald.
  • Generering av kriterier – Ger mer fokuserade och användbara kriterier genom att exponera olika konversationsmönster.
  • Finjustering av datamängdskuration – Väljer spårningar som hjälper modeller att lära sig mer effektivt.

Algoritmen körs helt på lokal beräkning utan extra API-anrop, så det medför inte extra kostnader för modellinferens utöver själva utvärderingen.

Exempel på intelligent sampling

# 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
)

Krav för spårningsdata

Spårningsutvärdering kräver att din agent genererar intervall som följer OpenTelemetry-semantiska konventioner för generativ AI. Mer specifikt läser utvärderingstjänsten intervall från Application Insights och extraherar konversationsdata från deras attribut.

Följande span-attribut används:

Attribute Obligatoriskt Description
gen_ai.operation.name Yes Måste vara lika med "invoke_agent". Tjänsten ignorerar alla andra intervall.
gen_ai.agent.id För agentfilterläge Unik agentidentifierare (format: agent-name:version).
gen_ai.agent.name För agentfilterläge Mänskligt läsbart agentnamn.
gen_ai.input.messages För att utvärderare ska kunna söka uppgifter JSON-matris med indatameddelanden efter GenAI-semantikkonventionernas meddelandeformat. Meddelanden med rollen user eller system mappas till query. Meddelanden med rollen assistant eller tool mappas till response.
gen_ai.output.messages För att utvärderare ska kunna söka uppgifter JSON-matris med modellgenererade utdatameddelanden. Alla utdatameddelanden mappas till response. Om utdata också innehåller type: tool_result eller type: tool_call, mappas det till tool_calls.
gen_ai.tool.definitions Valfritt JSON-matris med verktygsscheman som är tillgängliga för agenten. Om den saknas försöker tjänsten härleda verktygsdefinitioner från verktygsanropsmeddelanden, men härledda scheman kan vara ofullständiga.
gen_ai.conversation.id Valfritt Konversationsidentifierare, skickas vidare till utvärderingsresultat för korrelation.

Note

Om gen_ai.input.messages och gen_ai.output.messages är tomma eller saknas returnerar kvalitetsbedömare (koherens, fluens, relevans, avsiktsidentifiering) score=None. Säkerhetsutvärderingar (våld, självskadebeteende, sexuellt, hat/orättvisa) kan fortfarande producera poäng med partiella data, men de kanske inte ger meningsfulla resultat.

För Python-agenter som skapats med Azure AI Agent Server SDK lägger du till [tracing] extra för att aktivera automatisk emission av span.

pip install "azure-ai-agentserver-core[tracing]"

Krav för spårningsutvärdering

Förutom de allmänna kraven kräver spårningsutvärdering:

  • En Application Insights-resurs som är ansluten till ditt Foundry-projekt. Se också Ställ in spårning i Microsoft Foundry.
  • Projektets hanterade identitet måste ha rollen Log Analytics Reader på både Application Insights-resursen och dess länkade Log Analytics arbetsyta. Om tabellerna som lagrar dina spårningar är skyddade (deras skyddsnivå är inställd på Skyddad) tilldelar du även rollen Privileged Monitoring Data Reader i samma omfång så att tjänsten kan läsa de skyddade spårningstabellerna.
  • paketet azure-monitor-query Python (behövs bara om du samlar in spårnings-ID manuellt).
pip install "azure-ai-projects>=2.2.0" azure-monitor-query

Ange följande miljövariabler:

  • APPINSIGHTS_RESOURCE_ID – Application Insights-resurs-ID (till exempel /subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.Insights/components/<resource_name>).
  • AGENT_ID — Agentidentifieraren som genereras av spårningsintegreringen (gen_ai.agent.id attributet), som används för att filtrera spårningar. Format: agent-name:version.
  • TRACE_LOOKBACK_HOURS — (Valfritt) Antal timmar att se tillbaka vid spårningsförfrågningar. Standardinställningen är 1.

Alternativ A: Utvärdera efter agentfilter

Den enklaste metoden är att låta tjänsten automatiskt identifiera och utvärdera de senaste spårningarna för en specifik agent. Du behöver inte samla in spårnings-ID manuellt.

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

Tjänsten filtrerar invoke_agent sträckor med gen_ai.agent.id attributet, analyserar upp till max_traces unika spårnings-ID:n och utvärderar alla sträckor från dessa spårningar.

Alternativ B: Utvärdera med spårnings-ID:n

Om du vill ha mer kontroll samlar du in specifika spårnings-ID:t från Application Insights och utvärderar dem. Den här metoden är användbar när du vill utvärdera en kuraterad uppsättning interaktioner, till exempel spårningar som flaggats av aviseringar eller samplats för kvalitetsgranskning.

Samla in spårnings-ID:t från Application Insights

Fråga Application Insights efter operation_Id värden från agentens spårningar. Varje operation_Id representerar en fullständig agentinteraktion.

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")

Skapa utvärdering och köra med spårnings-ID:t

# 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}")

Konfigurera utvärderare och datamappningar

När du utvärderar spårningar extraherar tjänsten automatiskt konversationsdata från attributen OpenTelemetry span. Använd dessa fältnamn direkt i data_mapping (utan de item. prefix eller sample. prefix som används i andra scenarier):

Variabel Källattribut Description
{{item.query}} gen_ai.input.messages (användar-/systemroller) Användarfrågan som extraherats från spårningen.
{{item.response}} gen_ai.input.messages (assistent-/verktygsroller) + gen_ai.output.messages Agentens svar som extraherats från spårningen.
{{item.tool_definitions}} gen_ai.tool.definitions Verktygsscheman som är tillgängliga för agenten. Krävs endast för verktygsrelaterade utvärderare.
{{item.tool_calls}} Extraherade från assistentmeddelanden i gen_ai.input.messages / gen_ai.output.messages Verktygsanrop som agenten gör under interaktionen. Används av verktygsutvärderingar. Krävs endast för verktygsrelaterade utvärderare.
from azure.ai.projects.models import TestingCriterionAzureAIEvaluator

testing_criteria = [
    # Quality evaluators — require query and response from trace data
    TestingCriterionAzureAIEvaluator(
        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
    TestingCriterionAzureAIEvaluator(
        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
    TestingCriterionAzureAIEvaluator(
        type="azure_ai_evaluator",
        name="violence",
        evaluator_name="builtin.violence",
        data_mapping={
            "query": "{{item.query}}",
            "response": "{{item.response}}",
        },
        initialization_parameters={"threshold": 4},
    ),
]

Nästa steg