Bắt đầu bằng phân bố nguyên nhân: khoảng 70% lỗi RAG nằm ở chunking và retrieval, 20% ở prompt và cách ghép ngữ cảnh, 10% ở model. Đừng nhảy vào đổi model trước — đó là chỗ ít khả năng gây lỗi nhất.
Nguyên tắc: tách pipeline thành từng chặng và kiểm riêng từng chặng. Sửa nhiều thứ cùng lúc thì không biết cái nào có tác dụng.
Bước 1 — gom 20–50 ca lỗi thật rồi phân loại. Chỉ nhìn một ca thì sửa được một ca và làm hỏng ca khác. Các nhóm cần tách bạch:
- Tài liệu đúng không nằm trong top-K → lỗi retrieval.
- Tài liệu đúng có mặt nhưng xếp hạng thấp → lỗi rerank.
- Ngữ cảnh đúng nhưng model bịa → lỗi generation.
- Ngữ cảnh có thông tin mà model vẫn nói không biết → prompt quá thủ thế.
- Model nói "không biết" khi ngữ cảnh thật sự không có — đây không phải lỗi, đừng gộp vào.
Bước 2 — khoanh vùng bằng một chỉ số duy nhất. Với mỗi ca, log truy vấn gốc, truy vấn đã viết lại, top-K kèm điểm, ngữ cảnh cuối, câu trả lời, và tài liệu đúng do người gán. Rồi tính recall@K — tỉ lệ ca có tài liệu đúng trong top-K. Recall@K bằng 0 nghĩa là generation vô can, mọi công sửa prompt sẽ vô ích.
Bước 3 — sửa đúng chặng:
- Không lọt vào top-K: xem lại cỡ chunk (thử 256/512/1024) và độ chồng lấn; kiểm tra chunk có bị cắt ngang đoạn quan trọng không; nâng K lên 20–50 rồi mới rerank; thêm hybrid search với BM25 — cứu rõ rệt với từ viết tắt, mã sản phẩm, từ hiếm mà vector đánh trượt; kiểm tra bộ lọc metadata có loại nhầm không.
- Có nhưng xếp thấp: thêm reranker — thường là thay đổi cho cải thiện lớn nhất trên mỗi công bỏ ra. Nếu chunk quá nhỏ khiến một ý bị xé lẻ thì dùng chunk cha–con.
- Bịa dù ngữ cảnh đúng: siết chỉ dẫn ("chỉ trả lời dựa trên ngữ cảnh, thiếu thì nói không biết"), bắt trích dẫn theo từng ý, đặt temperature = 0, và cắt bớt ngữ cảnh — nhồi quá nhiều đoạn gây hiện tượng bỏ quên phần giữa, giữ 3–5 đoạn tốt nhất thường hơn hẳn giữ 20 đoạn.
- Nói không biết dù có thông tin: thường do nhiễu quá nhiều đoạn không liên quan, hoặc system prompt nghiêng hẳn về từ chối.
Bước 4 — nghiệm thu trên bộ eval, không nghiệm thu trên ca vừa sửa. Chạy lại toàn bộ 100–500 ca chuẩn để chắc không làm hỏng chỗ khác; so recall@K và faithfulness trước/sau.
Bước 5 — hỏi vì sao, đừng chỉ vá. Dạng truy vấn nào luôn trượt thì thêm vào bộ eval và xử lý riêng; loại tài liệu nào khó index thì cần parser riêng. Và có khi câu trả lời đúng là kho tri thức đang thiếu nội dung, không phải pipeline sai.
Lỗi hay gặp khi debug: đổi nhiều thứ cùng lúc; không có bộ eval nên không đo được cải thiện; đổi embedding model mà quên chỉnh lại chunking và prompt.