Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Konten terkait
- Observabilitas
- Keamanan Agen
- gambaran umum evaluasi Azure AI Foundry