"Chạy thử vài câu thấy ổn" không phải đánh giá. Trước khi cho toàn công ty dùng, bạn cần một bộ đo (evaluation harness) để biết agent đúng bao nhiêu phần trăm và hỏng ở đâu.
Bước 1: Xây bộ câu hỏi vàng (golden set)
Thu 30–100 câu hỏi thật kèm đáp án đúng và nguồn mong đợi:
[
{"q": "Nhân viên chính thức được bao nhiêu ngày phép?",
"expected": "14 ngày/năm",
"expected_doc": "hr-handbook-2026", "page": 5},
{"q": "Công ty có hỗ trợ học phí không?",
"expected": "KHÔNG CÓ TRONG TÀI LIỆU"}
]
Nhớ đưa cả câu không có đáp án để đo khả năng nói "không biết".
Bước 2: Tách hai loại lỗi
RAG hỏng ở hai chỗ, phải đo riêng:
- Lỗi retrieval: chunk đúng có được lấy về không? Đo bằng Recall@k — tỷ lệ câu mà chunk đúng nằm trong top-k.
- Lỗi generation: có chunk đúng rồi, LLM trả lời có đúng và có trích dẫn không? Đo bằng faithfulness (câu trả lời có neo vào chunk không) và answer correctness.
Bước 3: Các chỉ số cốt lõi
- Recall@k: chunk đúng có trong top-k? (đo retrieval)
- Faithfulness: mọi khẳng định có nguồn chống lưng? (đo bịa)
- Answer correctness: khớp đáp án mong đợi?
- Abstention accuracy: có nói "không biết" đúng lúc?
- Citation validity: trích dẫn có trỏ đúng nguồn?
Bước 4: Chấm điểm — con người + LLM-as-judge
Chấm tay 30 câu để có chuẩn. Muốn mở rộng, dùng LLM-as-judge: đưa câu hỏi + đáp án agent + đáp án vàng cho một LLM chấm.
JUDGE = """Chấm câu trả lời so với đáp án chuẩn.
Tiêu chí: (1) đúng sự thật, (2) có trích dẫn hợp lệ.
Trả JSON: {"correct": true/false, "grounded": true/false, "reason": "..."}"""
def judge(q, answer, gold):
return llm.generate(JUDGE + f"\nHỏi:{q}\nĐáp:{answer}\nChuẩn:{gold}")
Cẩn trọng: LLM-judge cũng sai; hãy đối chiếu định kỳ với chấm tay.
Khung tư duy: vòng lặp cải thiện
Đo golden set → tìm lỗi tệ nhất
→ retrieval kém? sửa chunk/k/hybrid
→ generation kém? sửa prompt/nguồn
→ chạy lại golden set → so số trước/sau
Mọi thay đổi phải so điểm trước/sau trên cùng bộ vàng, đừng sửa mù.Ví dụ chẩn đoán
Agent trả lời sai câu "số ngày phép". Kiểm tra:
- Chunk đúng có trong top-5 không? → Không ⇒ lỗi retrieval. Chunk bị cắt ngang, thiếu heading "Nghỉ phép". Sửa chunking, Recall@5 tăng từ 0.7 → 0.9.
- Nếu chunk có mà vẫn sai ⇒ lỗi prompt: LLM lấy nhầm con số từ chunk khác. Siết prompt, thêm re-rank.
Checklist đánh giá
- [ ] Có golden set ≥30 câu, gồm cả câu "không có đáp án".
- [ ] Đo tách retrieval (Recall@k) và generation (faithfulness/correctness).
- [ ] Có ngưỡng chấp nhận trước khi lên production (ví dụ correctness ≥85%).
- [ ] Ghi lại điểm mỗi lần thay đổi để so sánh.
- [ ] Đối chiếu LLM-judge với chấm tay định kỳ.
Sai lầm thường gặp
- Đánh giá bằng cảm giác vài câu → mù về lỗi thật.
- Gộp chung retrieval và generation → không biết sửa ở đâu.
- Quên đo abstention → không phát hiện agent bịa khi thiếu dữ liệu.
- Tin tuyệt đối LLM-judge → bỏ sót lỗi judge cũng mắc phải.
- Sửa nhiều thứ cùng lúc → không rõ thay đổi nào giúp/hại.
Mẹo: đánh giá là tài sản dài hạn
Golden set không chỉ dùng một lần trước khi ra mắt. Mỗi khi người dùng báo lỗi (bài 7), hãy thêm câu đó vào golden set. Dần dần bộ vàng phản ánh đúng những gì người dùng thật sự hỏi và những chỗ agent hay sai. Trước mỗi lần thay đổi chunking, đổi model, hay re-index lớn, chạy lại toàn bộ golden set và so điểm — đây là lưới an toàn giúp bạn cải tiến mà không vô tình làm hỏng những câu đang chạy tốt (tránh regression).
Bài 7: đưa lên vận hành thật và giữ cho tài liệu luôn cập nhật.