Bài 3 giúp bạn đẩy recall lên. Nhưng recall cao mà đưa quá nhiều nhiễu vào context sẽ hại generation. Bài này giải hai vấn đề: xếp hạng lại (re-ranking) để chọn tinh, và giữ index luôn mới (freshness) để không trả lời bằng dữ liệu cũ.
Re-ranking — hai tầng để vừa rộng vừa tinh
Ý tưởng: retrieve rộng, re-rank tinh.
- Tầng 1 — Retrieve (recall-first): dùng vector/hybrid search lấy nhanh top-N lớn (ví dụ 50 chunk). Mục tiêu: đảm bảo chunk đúng nằm đâu đó trong 50 cái này (recall cao).
- Tầng 2 — Re-rank (precision-first): một cross-encoder / reranker đọc kỹ từng cặp (câu hỏi, chunk) và chấm điểm liên quan chính xác hơn, rồi chọn ra top-k nhỏ (ví dụ 5) để đưa vào context.
Ví dụ
Câu hỏi: "Chính sách hoàn tiền cho đơn hàng quốc tế?" Vector search trả về 50 chunk, trong đó có cả "hoàn tiền nội địa" (gần về ý nghĩa nhưng sai ngữ cảnh). Reranker đọc kỹ, đẩy chunk "hoàn tiền quốc tế" lên #1 và dìm chunk nội địa xuống. Kết quả: context sạch hơn, câu trả lời đúng hơn, ít token hơn.
Khi nào cần reranker
- Khi recall@N cao nhưng recall@k (k nhỏ) thấp → tức chunk đúng có trong danh sách nhưng bị xếp hạng thấp. Đây là dấu hiệu kinh điển cần reranker.
- Khi context bị nhiễu làm mô hình lạc hướng.
- Cân nhắc chi phí/độ trễ: reranker thêm một chặng inference. Với sản phẩm cần độ trễ thấp, đo kỹ trade-off.
Index freshness — dữ liệu tươi hay ôi
Một sản phẩm RAG trả lời bằng những gì có trong index. Nếu index cũ, câu trả lời sẽ đúng cú pháp nhưng sai sự thật.
Các khía cạnh freshness
- Độ trễ cập nhật (indexing lag): từ lúc tài liệu thay đổi đến lúc vào index mất bao lâu? Chính sách giá đổi hôm nay mà index cập nhật sau 1 tuần là thảm họa cho chatbot bán hàng.
- Xóa/ẩn tài liệu hết hiệu lực: tài liệu bị thu hồi phải bị gỡ khỏi index, nếu không hệ thống trích dẫn nguồn đã chết.
- Phiên bản hóa (versioning): khi tài liệu có nhiều phiên bản, đảm bảo truy hồi đúng bản hiện hành; giữ metadata ngày hiệu lực.
- Re-index khi đổi mô hình embedding hoặc chiến lược chunking: nếu không, dữ liệu cũ và mới không đồng nhất.
Ví dụ
Bệnh viện dùng RAG tra phác đồ. Phác đồ cập nhật liều thuốc, nhưng bản cũ vẫn nằm trong index và không có metadata ngày. Reranker vô tình chọn bản cũ. Hệ thống trả liều sai — kèm citation trông rất đáng tin. Đây là rủi ro nghiêm trọng: freshness không chỉ là kỹ thuật, mà là an toàn.
Khung tư duy: retrieval là một pipeline có SLA
Coi retrieval như một dây chuyền có cam kết dịch vụ (SLA):
- Recall SLA: recall@k tối thiểu chấp nhận được.
- Freshness SLA: tài liệu mới phải vào index trong vòng X giờ.
- Latency SLA: tổng thời gian retrieve + rerank + generate.
Checklist vận hành
- [ ] Đo indexing lag thực tế, đặt ngưỡng cảnh báo.
- [ ] Có quy trình gỡ tài liệu hết hiệu lực khỏi index.
- [ ] Lưu metadata ngày hiệu lực / phiên bản cho mỗi chunk.
- [ ] Thử reranker và đo delta recall@k, precision, độ trễ.
- [ ] Kiểm tra định kỳ: câu trả lời có đang trích nguồn còn hiệu lực không?
Sai lầm thường gặp
- Thêm reranker trước khi biết vấn đề là ranking hay recall. Nếu chunk đúng còn chẳng có trong top-N, reranker vô dụng — hãy sửa retrieval trước.
- Quên chuyện gỡ tài liệu cũ. Index chỉ biết thêm, không biết quên, cho đến khi có người dùng bị thông tin sai.
- Không có metadata ngày/phiên bản, khiến hệ thống trộn lẫn bản cũ và mới.
- Bỏ qua độ trễ của reranker, làm sản phẩm chậm đến mức người dùng bỏ đi.
- Coi index là "làm một lần". Freshness là công việc liên tục, cần cron và giám sát.