Đánh giá chất lượng RAG

“Thử vài câu thấy ổn” không phải là đánh giá. Bài này xây một quy trình đo được, lặp lại được, để mỗi thay đổi về chunk, mô hình hay prompt đều có số liệu chứng minh.

Hai tầng cần đo

Đo riêng từng tầng để biết lỗi nằm ở đâu:

TầngCâu hỏi cần trả lờiChỉ số
Truy xuấtĐoạn chứa đáp án có được lấy về, và ở thứ hạng cao không?Recall@k, Precision@k, MRR, nDCG
SinhCâu trả lời có trung thực với nguồn, đúng và đúng trọng tâm không?Faithfulness, answer relevance, correctness, tỉ lệ trích dẫn đúng

Bộ câu hỏi vàng (golden set)

Mỗi mục gồm câu hỏi, đáp án chuẩn và (các) đoạn tài liệu chứa đáp án:

{
  "question": "Hạn nộp chứng từ hoàn ứng là bao lâu?",
  "reference_answer": "30 ngày kể từ ngày phát sinh chi phí.",
  "relevant_chunks": ["finance-reimburse-v3#7"],
  "type": "tra-cuu-du-kien"
}

Chỉ số truy xuất

Recall@k = số đoạn liên quan nằm trong top-k / tổng số đoạn liên quan
MRR = trung bình trên các câu hỏi của 1 / (thứ hạng của đoạn liên quan đầu tiên)
nDCG@k = trung bình trên các câu hỏi của 1 / log2(thứ hạng + 1)  (liên quan nhị phân, một đoạn đúng)

Bốn câu hỏi, mỗi câu đúng một đoạn liên quan — chính giả thiết này làm ba công thức so sánh được trực tiếp với nhau:

Câu hỏi   Đoạn đúng ở hạng        Recall@5   1/rank   1/log2(rank+1)
Q1        1                       1          1.0000   1.0000
Q2        3                       1          0.3333   0.5000
Q3        không có trong top-5    0          0.0000   0.0000
Q4        2                       1          0.5000   0.6309

Recall@5 = 3/4 = 0.7500     MRR = 0.4583     nDCG@5 = 0.5327

Ba con số lệch nhau vì mỗi công thức chiết khấu thứ hạng một kiểu. Ở hạng 2, 1/rank đã cắt một nửa còn 0,5000 trong khi 1/log₂(rank+1) vẫn cho 0,6309; tới hạng 5 là 0,2000 so với 0,3869. Vậy MRR là chỉ số khắt khe nhất với mọi thứ không đứng đầu — cũng là chỉ số nhúc nhích mạnh nhất khi bạn thêm một tầng rerank.

Recall trước, precision sau Với RAG, recall@k ở tầng truy xuất quan trọng hơn: đoạn đúng không được lấy về thì prompt tốt tới đâu cũng vô ích. Rerank giúp đẩy precision lên sau đó.

Chỉ số câu trả lời

Chấm các chỉ số này ở quy mô lớn thường dùng LLM làm giám khảo (LLM-as-judge) với rubric rõ ràng. Hãy chấm tay một mẫu nhỏ để kiểm tra giám khảo có đồng thuận với người không, trước khi tin vào con số. Các thư viện như RAGAS, DeepEval, TruLens cung cấp sẵn nhiều chỉ số kiểu này.

Quy trình đánh giá

  1. Cố định bộ câu hỏi vàng và phiên bản dữ liệu.
  2. Chạy cấu hình hiện tại, lưu kết quả làm baseline.
  3. Thay đổi một yếu tố (kích thước chunk, mô hình embedding, rerank, prompt…).
  4. Chạy lại, so từng chỉ số và xem các câu bị tệ đi — không chỉ nhìn trung bình.
  5. Giữ thay đổi nếu tốt hơn; đưa việc chạy đánh giá vào CI để tránh thụt lùi.
Vì sao bước 4 nói “không chỉ nhìn trung bình” Hai cấu hình, cùng bốn câu hỏi, mỗi câu một đoạn đúng:
A xếp đoạn đúng ở hạng 1, –, 2, 2.   B xếp ở hạng 2, 2, 1, –.
Cả hai đều cho Recall@5 = 0,75, MRR = 0,500, nDCG@5 = 0,5655 — ba số tổng hợp trùng nhau tới bốn chữ số thập phân. Nhưng A hỏng câu Q2 còn B hỏng câu Q4. Chuyện đó có nghiêm trọng hay không hoàn toàn phụ thuộc vào việc người dùng thật sự hỏi câu nào, và không con số trung bình nào nói cho bạn biết. Hãy giữ bảng theo từng câu, và so bảng.

Theo dõi trên production

Tín hiệuÝ nghĩa khi xấu đi
Tỉ lệ “không tìm thấy thông tin”Tăng: thiếu tài liệu, index lỗi, hoặc câu hỏi mới ngoài phạm vi
Phản hồi 👍/👎 và câu hỏi lại ngay sau đóNgười dùng không hài lòng với câu trả lời
Điểm liên quan của top-1Giảm dần: dữ liệu và câu hỏi đang lệch nhau
Độ trễ p95, token mỗi câu hỏiChi phí và trải nghiệm
Độ tươi của indexTài liệu mới chưa được lập chỉ mục

Lưu lại (có kiểm soát quyền riêng tư) câu hỏi, các đoạn đã truy xuất và câu trả lời. Những câu bị 👎 là nguồn tốt nhất để bổ sung bộ câu hỏi vàng.

Tự kiểm tra

Faithfulness cao nhưng correctness thấp nghĩa là gì? Mô hình trung thành với ngữ cảnh, nhưng ngữ cảnh sai hoặc thiếu — lỗi nằm ở truy xuất hoặc dữ liệu (vd. tài liệu cũ), không phải ở bước sinh.
Recall@5 = 0.95 nhưng người dùng vẫn phàn nàn câu trả lời sai. Kiểm tra gì tiếp? Tầng sinh: faithfulness, prompt, thứ tự ngữ cảnh, việc mô hình có dùng đúng đoạn không. Cũng kiểm tra bộ câu hỏi vàng có đại diện cho câu hỏi thật không.
Vì sao bộ câu hỏi vàng cần các câu không có đáp án? Để đo và ngăn hệ thống bịa khi thiếu thông tin. Nếu thiếu loại câu này, một hệ thống luôn “tự tin trả lời” vẫn có thể đạt điểm cao.