Hướng dẫn toàn diện về đánh giá AI agent: độ chính xác dùng tool, hiệu quả trajectory, hội thoại đa-turn, và điểm tự phản hồi — kèm code ví dụ.
Với một lệnh gọi LLM thông thường, bạn chỉ kiểm tra phản hồi cuối cùng. Nhưng với một agent, điều đó là không đủ — nó có thể đạt được kết quả đúng nhưng qua một đường đi tệ hại (dùng sai tool, vòng lặp không cần thiết, v.v.).
Bạn cần ba cấp độ đánh giá:
Năm 2026, đánh giá không còn là một "checkbox nghiên cứu" — nó là cổng kiểm soát sản xuất. Bất cứ ai cũng có thể kết nối LLM với cơ sở dữ liệu vector. Rất ít người xây dựng được hệ thống AI đo lường được và đáng tin cậy.
Điều này đánh giá chính xác cách agent tương tác với các hệ thống bên ngoài — không chỉ là kết quả cuối cùng nó trả về.
from deepeval.metrics import BaseMetric
class ToolUseCorrectnessMetric(BaseMetric):
name = "Độ Chính Xác Dùng Tool"
def evaluate(self, agent_trace, expected_trajectory):
"""
Agent trace: [{"tool_name": "get_diff", "args": {}}, ...]
Expected trajectory: ["get_diff", "check_style", "suggest_fix"]
"""
actual_tools = [step["tool_name"] for step in agent_trace]
# 1. Kiểm tra xem tất cả tool bắt buộc đã được gọi chưa
missing = set(expected_trajectory) - set(actual_tools)
# 2. Kiểm tra xem có tool nào gọi thừa không (lãng phí chi phí)
extra = set(actual_tools) - set(expected_trajectory)
# 3. Kiểm tra tính hợp lệ của schema gọi tool
for step in agent_trace:
if not self._validate_schema(step["tool_name"], step["args"]):
return False, "Đối số tool không hợp lệ"
return len(missing) == 0 and len(extra) <= 1
def _validate_schema(self, tool_name, args):
"""JSON schema validation cho đối số mong đợi của mỗi tool."""
# ... code thực tế sẽ dùng jsonschema.validate()...
return TrueKhi kết quả cuối cùng đúng, agent của bạn vẫn có thể đi một đường tốn kém, chậm chạp hoặc lặp vòng. Điều này đánh giá hiệu quả — mọi thứ về chi phí và học hỏi.
from collections import Counter
def evaluate_trajectory_efficiency(agent_trace, max_iterations=10):
"""Đánh giá xem trajectory của agent có hiệu quả không."""
tool_history = [step["tool_name"] for step in agent_trace]
# Phát hiện gọi tool lặp lại (hành vi vòng lặp)
tool_counts = Counter(tool_history)
redundant_calls = sum(c - 1 for c in tool_counts.values() if c > 2)
iterations_used = len(agent_trace)
is_efficient = iterations_used <= max_iterations and redundant_calls == 0
cost_score = max(0, 1.0 - (redundant_calls / max_iterations))
return {
"is_efficient": is_efficient,
"iterations_used": iterations_used,
"redundant_calls": redundant_calls,
"cost_score": round(cost_score, 2)
}
# Kết quả ví dụ:
# Agent A (tốt): {"is_efficient": True, "iterations_used": 4, "redundant_calls": 0, "cost_score": 1.0}
# Agent B (xấu): {"is_efficient": False, "iterations_used": 15, "redundant_calls": 8, "cost_score": 0.3}Agent thực có nhiều lượt hội thoại. Một đánh giá single-turn bỏ qua việc mang theo ngữ cảnh, làm rõ, sửa lỗi, và phục hồi lỗi.
# Test case cho agent hỗ trợ khách hàng:
test_multi_turn = [
{
"user_query": "Tôi cần đặt lại mật khẩu. Email của tôi là test@example.com",
"agent_response": "Tôi sẽ giúp bạn đặt lại mật khẩu. Gửi link đến test@example.com",
"tool_calls": [{"name": "send_password_reset", "args": {"email": "test@example.com"}}]
},
{
"user_query": "Thực ra, email của tôi đã thay đổi. Bây giờ là lktinh@gmail.com",
"agent_response": "Đã cập nhật email của bạn thành lktinh@gmail.com. Gửi link đặt lại ở đó.",
"tool_calls": [{"name": "update_email", "args": {"email": "lktinh@gmail.com"}}]
},
{
"user_query": "Gửi lại đi",
"agent_response": "Đang gửi đặt lại mật khẩu đến lktinh@gmail.com", # ✅ Đã nhớ!
"tool_calls": [{"name": "send_password_reset", "args": {"email": "lktinh@gmail.com"}}]
}
]
# Expected: memory_score=2, error_recovery=True, is_coherent=TrueMột agent tốt không chỉ tìm ra câu trả lời đúng — nó cũng biết khi nào nó đang mắc sai lầm và tự sửa. Đây là điểm tự phản hồi.
Mẫu này đặc biệt quan trọng cho các ứng dụng rủi ro cao như review code, ngân hàng, hoặc y tế — khi "đủ tốt" không phải là đủ.
Trong sản xuất, bạn chạy tất cả bốn mẫu cùng nhau như một điểm tổng hợp. Đây là những gì bạn sẽ làm trong CI/CD pipeline của mình:
def evaluate_agent_full(agent, test_case):
"""Đánh giá agent đầy đủ — chạy tất cả 4 mẫu trên một test case."""
result = agent.run(test_case["question"])
trace = result.trace
evaluations = {
"tool_use": evaluate_tool_use_correctness(trace, test_case.expected_tools),
"trajectory": evaluate_trajectory_efficiency(trace),
"multi_turn": evaluate_multi_turn_conversation(trace.turns, test_case.memory),
"reflection": evaluate_reflection(trace, test_case.failure_point),
"final_answer": evaluate_final_output(result.output, test_case.expected_answer),
}
composite = (
0.25 * evaluations["tool_use"]["score"] +
0.20 * evaluations["trajectory"]["cost_score"] +
0.20 * evaluations["multi_turn"]["memory_score"] +
0.15 * evaluations["reflection"]["score"] +
0.20 * evaluations["final_answer"]["score"]
)
return {
"composite_score": round(composite, 3),
"passed": composite >= 0.7
}Điểm tổng hợp này cho phép bạn xem agent của bạn mạnh ở đâu và yếu ở đâu — không chỉ là "đạt hoặc trượt".
1. Đánh Giá Retrieval Trước Generation — Nếu retrieval thất bại, generation không thể phục hồi.
2. Đánh Giá Groundedness — Câu trả lời có được hỗ trợ bởi các tài liệu truy xuất, hay mô hình đang hallucinating?
3. Đánh Giá Hành Vi Agent, Không Chỉ Kết Quả Cuối Cùng — agent có chọn đúng tool không? nó có gọi các tools không cần thiết không?
4. Đo Lường Độ Trễ và Chi Phí — Chỉ độ chính xác là không đủ.
5. Kiểm Tra Các Kịch Bản Lỗi — xảy ra gì nếu một tool API thất bại?
6. Sử Dụng Bộ Test Có Cấu Trúc — không chỉ dựa vào testing thủ công.
7. Đánh Giá Liên Tục Trong Sản Xuất — dữ liệu thay đổi, hành vi người dùng thay đổi.
Năm 2026, xây dựng các hệ thống agent AI không còn đáng khen. Đánh giá chúng đúng cách mới là điều đáng khen. Bất cứ ai cũng có thể kết nối LLM với cơ sở dữ liệu vector. Rất ít người xây dựng được hệ thống AI đo lường được và đáng tin cậy.
Nếu bạn muốn tìm hiểu thêm về đánh giá agent, hãy xem bài mở rộng của chúng tôi về MLFlow Evaluation và DeepEval — PyTest-style Agent Testing.