Penilaian

Kerangka Kerja Agen mencakup kerangka kerja evaluasi bawaan yang memungkinkan Anda mengukur kualitas, keamanan, dan kebenaran agen. Anda dapat menjalankan pemeriksaan lokal cepat selama pengembangan, menggunakan evaluator berbasis cloud Azure AI Foundry untuk penilaian tingkat produksi, atau menggabungkan keduanya dalam satu eksekusi evaluasi.

Kerangka kerja evaluasi dirancang di sekitar beberapa prinsip utama:

  • Bebas Penyedia (Provider-agnostic) — Jenis evaluasi inti dan fungsi orkestrasi berfungsi dengan penyedia evaluasi mana pun.
  • Nol gesekan — Mulai dari "Saya memiliki agen" ke "Saya memiliki hasil evaluasi" dengan kode minimal.
  • Pengungkapan progresif — Skenario sederhana memerlukan kode hampir nol. Skenario tingkat lanjut dibangun pada primitif yang sama.

Konsep inti

Kerangka kerja evaluasi dibangun di atas tiga jenis:

Tipe Kegunaan
EvalItem Satu item untuk dievaluasi — membungkus seluruh percakapan dan memperoleh kueri/respons melalui strategi pemisahan.
Evaluator Penyedia layanan yang memberikan skor item — pemeriksaan lokal, Azure AI Foundry, atau implementasi kustom apa pun.
EvalResults Hasil agregat dari eksekusi evaluasi — jumlah pass/fail, detail per item, dan tautan portal opsional.

Dalam .NET, kerangka kerja evaluasi dibangun pada Microsoft. Extensions.AI.Evaluation. Para evaluator mengimplementasikan IAgentEvaluator antarmuka, dan penyelarasan disediakan melalui metode ekstensi pada AIAgent dan Run.

Jenis inti hidup di namespace Microsoft.Agents.AI:

using Microsoft.Agents.AI;

Dalam Python, kerangka kerja evaluasi adalah bagian dari paket inti agent_framework. Para evaluator menerapkan protokol Evaluator, dan orkestrasi disediakan melalui fungsi evaluate_agent() dan evaluate_workflow().

from agent_framework import (
    evaluate_agent,
    evaluate_workflow,
    EvalItem,
    EvalResults,
    LocalEvaluator,
)

Evaluator lokal

LocalEvaluator menjalankan pemeriksaan secara lokal tanpa panggilan API — ideal untuk pengembangan perulangan dalam, pengujian asap CI, dan perulangan cepat. Ini menerima sejumlah fungsi pemeriksaan dan menerapkan masing-masing untuk setiap item.

Pemeriksaan bawaan

Rangka Kerja Agen dilengkapi dengan pemeriksaan bawaan untuk skenario umum.

using Microsoft.Agents.AI;

var local = new LocalEvaluator(
    EvalChecks.KeywordCheck("weather", "temperature"),  // Response must contain these keywords
    EvalChecks.ToolCalledCheck("get_weather")            // Agent must have called this tool
);

Evaluator fungsi kustom

Gunakan FunctionEvaluator.Create() untuk membungkus fungsi apa pun sebagai pemeriksaan evaluasi. Beberapa kelebihan beban tersedia tergantung pada data apa yang Anda butuhkan:

using Microsoft.Agents.AI;

var local = new LocalEvaluator(
    // Simple: check only the response text
    FunctionEvaluator.Create("is_concise",
        (string response) => response.Split(' ').Length < 500),

    // With expected output: compare against ground truth
    FunctionEvaluator.Create("mentions_city",
        (string response, string? expectedOutput) =>
            expectedOutput != null && response.Contains(expectedOutput, StringComparison.OrdinalIgnoreCase)),

    // Full context: access the complete EvalItem
    FunctionEvaluator.Create("used_search",
        (EvalItem item) => item.Conversation.Any(m =>
            m.Text?.Contains("search", StringComparison.OrdinalIgnoreCase) == true))
);

Pemeriksaan bawaan

Rangka Kerja Agen dilengkapi dengan pemeriksaan bawaan untuk skenario umum.

Periksa Apa fungsinya
keyword_check(*keywords) Respons harus berisi semua kata kunci yang ditentukan
tool_called_check(*tool_names) Agen harus memanggil alat yang ditentukan
tool_calls_present Semua expected_tool_calls nama muncul dalam percakapan (tidak diurutkan, ekstra diperbolehkan)
tool_call_args_match Panggilan alat yang diharapkan harus cocok berdasarkan nama dan argumen (kecocokan subset pada argumen)
from agent_framework import (
    LocalEvaluator,
    keyword_check,
    tool_called_check,
    tool_calls_present,
    tool_call_args_match,
)

local = LocalEvaluator(
    keyword_check("weather", "temperature"),  # Response must contain these keywords
    tool_called_check("get_weather"),          # Agent must have called this tool
    tool_calls_present,                        # All expected tool call names were made
    tool_call_args_match,                      # Expected tool calls match on name + args
)

Evaluator fungsi kustom

@evaluator Gunakan dekorator untuk membungkus fungsi apa pun sebagai pemeriksaan evaluator. Nama parameter fungsi menentukan data apa yang diterimanya dari EvalItem:

from agent_framework import evaluator, LocalEvaluator

@evaluator
def is_concise(response: str) -> bool:
    """Check response is under 500 words."""
    return len(response.split()) < 500

@evaluator
def mentions_city(response: str, expected_output: str) -> bool:
    """Check response contains the expected city name."""
    return expected_output.lower() in response.lower()

@evaluator
def used_tools(conversation: list, tools: list) -> float:
    """Score based on tool usage. Returns 0.0–1.0 (>= 0.5 passes)."""
    tool_calls = [c for m in conversation for c in (m.contents or []) if c.type == "function_call"]
    return min(len(tool_calls) / max(len(tools), 1), 1.0)

local = LocalEvaluator(is_concise, mentions_city, used_tools)

Nama parameter yang didukung: query, , responseexpected_output, expected_tool_calls, conversation, tools, context.

Jenis pengembalian: bool, float (≥ 0,5 = pass), dict dengan score atau passed kunci, atau CheckResult. Fungsi asinkron ditangani secara otomatis.

Evaluator Azure AI Foundry

FoundryEvals terhubung ke layanan evaluasi Azure AI Foundry untuk evaluasi berbasis cloud dengan LLM sebagai penilai. Hasil dapat dilihat di portal Foundry dengan dasbor dan tampilan perbandingan.

using Microsoft.Agents.AI.AzureAI;

var foundry = new FoundryEvals(chatConfiguration, FoundryEvals.Relevance, FoundryEvals.Coherence);
from agent_framework.foundry import FoundryEvals

evals = FoundryEvals(
    project_client=project_client,
    model="gpt-4o",
    evaluators=[FoundryEvals.RELEVANCE, FoundryEvals.COHERENCE],
)

Secara default, FoundryEvals menjalankan relevansi, koherensi, dan evaluator kepatuhan tugas . Saat item berisi definisi alat, item secara otomatis menambahkan akurasi panggilan alat.

Evaluator yang tersedia

FoundryEvals menyediakan konstanta untuk semua nama evaluator bawaan:

Kategori Evaluator
Perilaku agen intent_resolution,task_adherence,task_completion,task_navigation_efficiency
Penggunaan alat tool_call_accuracy, tool_selection, tool_input_accuracy, tool_output_utilization, tool_call_success
Kualitas coherence, fluency, relevance, groundedness, response_completeness, similarity
Safety violence,sexual,self_harm,hate_unfairness

Nota

FoundryEvals memerlukan proyek Azure AI Foundry dengan penyebaran model AI. Parameter model menentukan model mana yang akan digunakan sebagai hakim LLM.

Mengevaluasi agen

Skenario evaluasi paling sederhana menjalankan agen terhadap kueri pengujian dan menilai respons. Berikan beberapa kueri yang beragam untuk evaluasi yang bermakna secara statistik.

using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;

var foundry = new FoundryEvals(chatConfiguration, FoundryEvals.Relevance, FoundryEvals.Coherence);

AgentEvaluationResults results = await agent.EvaluateAsync(
    new[]
    {
        "What's the weather in Seattle?",
        "Plan a weekend trip to Portland",
        "What restaurants are near Pike Place?",
    },
    foundry);

results.AssertAllPassed();  // Throws if any item failed

EvaluateAsync adalah metode ekstensi pada AIAgent. Ini menjalankan agen sekali per kueri, mengonversi setiap interaksi menjadi EvalItem, dan meneruskan batch ke evaluator.

from agent_framework import evaluate_agent
from agent_framework.foundry import FoundryEvals

evals = FoundryEvals(
    project_client=project_client,
    model="gpt-4o",
    evaluators=[FoundryEvals.RELEVANCE, FoundryEvals.COHERENCE],
)

results = await evaluate_agent(
    agent=my_agent,
    queries=[
        "What's the weather in Seattle?",
        "Plan a weekend trip to Portland",
        "What restaurants are near Pike Place?",
    ],
    evaluators=evals,
)

for r in results:
    print(f"{r.provider}: {r.passed}/{r.total}")
    r.raise_for_status()  # Raises EvalNotPassedError if any item failed

evaluate_agent menjalankan agen sekali per kueri, mengonversi setiap interaksi menjadi EvalItem, dan meneruskan batch ke evaluator. Ini mengembalikan satu EvalResults untuk setiap penyedia evaluator.

Mengukur konsistensi dengan pengulangan

Jalankan setiap kueri beberapa kali untuk mendeteksi perilaku non-deterministik:

AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { "What's the weather in Seattle?" },
    foundry,
    numRepetitions: 3);  // Each query runs 3 times independently
// Results contain 3 items (1 query × 3 repetitions)
results = await evaluate_agent(
    agent=my_agent,
    queries=["What's the weather in Seattle?"],
    evaluators=evals,
    num_repetitions=3,  # Each query runs 3 times independently
)
# Results contain 3 items (1 query × 3 repetitions)

Evaluasi dengan output yang diharapkan

Berikan jawaban yang diharapkan sebagai kebenaran dasar untuk mengevaluasi ketepatan. Output yang diharapkan dipasangkan secara posisional dengan kueri:

AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { "What's 2+2?", "Capital of France?" },
    foundry,
    expectedOutput: new[] { "4", "Paris" });

Anda juga dapat menentukan panggilan alat yang diharapkan:

AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { "What's the weather in NYC?" },
    new LocalEvaluator(EvalChecks.ToolCalledCheck("get_weather")),
    expectedToolCalls: new[]
    {
        new[] { new ExpectedToolCall("get_weather") },
    });
from agent_framework import evaluate_agent, ExpectedToolCall

results = await evaluate_agent(
    agent=my_agent,
    queries=["What's 2+2?", "Capital of France?"],
    expected_output=["4", "Paris"],
    evaluators=evals,
)

Anda juga dapat menentukan panggilan alat yang diharapkan:

results = await evaluate_agent(
    agent=my_agent,
    queries=["What's the weather in NYC?"],
    expected_tool_calls=[ExpectedToolCall("get_weather", {"location": "NYC"})],
    evaluators=local,
)

Mengevaluasi respons yang sudah ada sebelumnya

Ketika Anda sudah memiliki respons agen dari log atau eksekusi sebelumnya, evaluasi secara langsung tanpa menjalankan kembali agen:

var response = await agent.RunAsync(new[] { new ChatMessage(ChatRole.User, "What's the weather?") });

AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { response },
    new[] { "What's the weather?" },
    foundry);
from agent_framework import Message, evaluate_agent

response = await agent.run([Message("user", ["What's the weather?"])])

results = await evaluate_agent(
    agent=agent,
    responses=response,
    queries="What's the weather?",
    evaluators=evals,
)

Strategi pemisahan percakapan

Percakapan multi-giliran harus dibagi menjadi bagian permintaan dan tanggapan untuk evaluasi. Cara Anda memisahkan menentukan apa yang Anda evaluasi.

Strategi Perilaku Paling cocok untuk
Giliran terakhir (default) Pisahkan pada pesan pengguna terakhir. Semuanya sebelum itu adalah konteks permintaan; semuanya setelahnya adalah respons. Kualitas respons pada titik tertentu
Penuh Pesan pengguna pertama adalah kueri; seluruh sisanya adalah respons. Penyelesaian tugas dan lintasan keseluruhan
Per giliran Setiap pertukaran antara pengguna dan asisten dinilai secara independen dengan mempertimbangkan konteks kumulatif. Analisis mendetail
// Full conversation as context
AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { "Plan a 3-day trip to Paris" },
    foundry,
    splitter: ConversationSplitters.Full);

// Per-turn: each exchange scored independently
var items = EvalItem.PerTurnItems(conversation);
var perTurnResults = await evaluator.EvaluateAsync(items);

Anda juga dapat menerapkan pemisah kustom dengan menerapkan IConversationSplitter:

public class SplitBeforeToolCall : IConversationSplitter
{
    public (IReadOnlyList<ChatMessage> QueryMessages, IReadOnlyList<ChatMessage> ResponseMessages) Split(
        IReadOnlyList<ChatMessage> conversation)
    {
        // Custom split logic
        for (int i = 0; i < conversation.Count; i++)
        {
            if (conversation[i].Text?.Contains("tool_call") == true)
                return (conversation.Take(i).ToList(), conversation.Skip(i).ToList());
        }
        return ConversationSplitters.LastTurn.Split(conversation);
    }
}
from agent_framework import evaluate_agent, ConversationSplit

# Full conversation as context
results = await evaluate_agent(
    agent=agent,
    queries=["Plan a 3-day trip to Paris"],
    evaluators=evals,
    conversation_split=ConversationSplit.FULL,
)

# Per-turn: each exchange scored independently
from agent_framework import EvalItem

items = EvalItem.per_turn_items(conversation)
# Pass items directly to an evaluator
per_turn_results = await evaluator.evaluate(items)

Anda juga dapat menyediakan pemisah kustom — pemanggil apa pun yang mengambil percakapan dan mengembalikan (query_messages, response_messages):

def split_before_memory(conversation):
    """Split just before a memory-retrieval tool call."""
    for i, msg in enumerate(conversation):
        for c in msg.contents or []:
            if c.type == "function_call" and c.name == "retrieve_memory":
                return conversation[:i], conversation[i:]
    # Fallback to default
    return EvalItem._split_last_turn_static(conversation)

results = await evaluate_agent(
    agent=agent,
    queries=queries,
    evaluators=evals,
    conversation_split=split_before_memory,
)

Mengevaluasi alur kerja

Mengevaluasi alur kerja multi-agen dengan perincian per agen. Kerangka kerja mengekstrak interaksi setiap sub-agen dan mengevaluasinya satu per satu, bersama dengan output keseluruhan alur kerja.

using Microsoft.Agents.AI;
using Microsoft.Agents.AI.AzureAI;

Run run = await workflowRunner.RunAsync(workflow, "Plan a trip to Paris");

AgentEvaluationResults results = await run.EvaluateAsync(
    new FoundryEvals(chatConfiguration, FoundryEvals.Relevance));

Console.WriteLine($"Overall: {results.Passed}/{results.Total}");

// Per-agent breakdown
if (results.SubResults != null)
{
    foreach (var (name, sub) in results.SubResults)
    {
        Console.WriteLine($"  {name}: {sub.Passed}/{sub.Total}");
    }
}

results.AssertAllPassed();
from agent_framework import evaluate_workflow
from agent_framework.foundry import FoundryEvals

evals = FoundryEvals(project_client=project_client, model="gpt-4o")
result = await workflow.run("Plan a trip to Paris")

eval_results = await evaluate_workflow(
    workflow=workflow,
    workflow_result=result,
    evaluators=evals,
)

for r in eval_results:
    print(f"{r.provider}: {r.passed}/{r.total}")
    for name, sub in r.sub_results.items():
        print(f"  {name}: {sub.passed}/{sub.total}")

Anda juga dapat meneruskan queries secara langsung dan kerangka kerja akan menjalankan alur kerja untuk Anda:

eval_results = await evaluate_workflow(
    workflow=workflow,
    queries=["Plan a trip to Paris", "Book a flight to London"],
    evaluators=evals,
)

Mencampur beberapa evaluator

Jalankan pemeriksaan lokal dan evaluator berbasis cloud bersama-sama dalam satu evaluasi. Setiap evaluator menghasilkan sendiri EvalResults.

using Microsoft.Agents.AI;
using Microsoft.Agents.AI.AzureAI;

IReadOnlyList<AgentEvaluationResults> results = await agent.EvaluateAsync(
    new[] { "What's the weather in Seattle?" },
    evaluators: new IAgentEvaluator[]
    {
        new LocalEvaluator(
            EvalChecks.KeywordCheck("weather"),
            FunctionEvaluator.Create("is_helpful", (string r) => r.Split(' ').Length > 10)),
        new FoundryEvals(chatConfiguration, FoundryEvals.Relevance, FoundryEvals.Coherence),
    });

// results[0] = local evaluator results
// results[1] = Foundry evaluator results
foreach (var r in results)
{
    Console.WriteLine($"{r.Provider}: {r.Passed}/{r.Total}");
}
from agent_framework import evaluate_agent, evaluator, LocalEvaluator, keyword_check
from agent_framework.foundry import FoundryEvals

@evaluator
def is_helpful(response: str) -> bool:
    return len(response.split()) > 10

foundry = FoundryEvals(
    project_client=project_client,
    model="gpt-4o",
    evaluators=[FoundryEvals.RELEVANCE, FoundryEvals.COHERENCE],
)

results = await evaluate_agent(
    agent=agent,
    queries=["What's the weather in Seattle?"],
    evaluators=[
        LocalEvaluator(is_helpful, keyword_check("weather")),
        foundry,
    ],
)

# results[0] = local evaluator results
# results[1] = Foundry evaluator results
for r in results:
    print(f"{r.provider}: {r.passed}/{r.total}")

Evaluator MEAI

Kerangka kerja evaluasi .NET terintegrasi langsung dengan Microsoft. Extensions.AI.Evaluation evaluator. Evaluator kualitas dan keamanan dari MEAI berfungsi tanpa adaptor apa pun:

using Microsoft.Extensions.AI.Evaluation;
using Microsoft.Extensions.AI.Evaluation.Quality;
using Microsoft.Extensions.AI.Evaluation.Safety;

// Quality evaluators
AgentEvaluationResults results = await agent.EvaluateAsync(
    new[] { "What's the weather?" },
    new CompositeEvaluator(
        new RelevanceEvaluator(),
        new CoherenceEvaluator(),
        new GroundednessEvaluator()),
    chatConfiguration: new ChatConfiguration(evalClient));

// Safety evaluators
AgentEvaluationResults safetyResults = await agent.EvaluateAsync(
    new[] { "What's the weather?" },
    new ContentHarmEvaluator(),
    chatConfiguration: new ChatConfiguration(evalClient));

Tip

Saat menggunakan evaluator MEAI, sediakan parameter chatConfiguration dengan aplikasi obrolan yang telah dikonfigurasi untuk model evaluasi. Pengguna ini digunakan oleh evaluator LLM-as-judge untuk memberi skor respons.

Nota

Dukungan Go untuk fitur ini akan segera hadir. Lihat repositori Agent Framework Go untuk status terbaru.

Langkah berikutnya