Recall@K Là Gì?

Recall@K là chỉ số đo lường khả năng tìm kiếm của hệ thống: trong top K kết quả trả về, hệ thống bắt được bao nhiêu phần trăm các kết quả thực sự liên quan. Ví dụ bạn tìm kiếm vector và có 20 tài liệu thực sự đúng, hệ thống trả về top 10 kết quả mà chứa 16 trong số đó thì Recall@10 = 80%. Chỉ số này cực kỳ quan trọng khi đánh giá chất lượng của các thuật toán tìm kiếm xấp xỉ như HNSW hay IVF.
Vì Sao Recall@K Quan Trọng Trong Tìm Kiếm Vector?
Khi dữ liệu lớn, không ai duyệt qua hàng triệu vector để tìm chính xác hàng xóm gần nhất cả. Thay vào đó, các hệ thống như vector database dùng tìm kiếm xấp xỉ (ANN) để đổi một chút độ chính xác lấy tốc độ.
Recall@K chính là thước đo cho “một chút độ chính xác” đó. Nó trả lời câu hỏi: so với kết quả chính xác tuyệt đối (ground truth), thuật toán xấp xỉ của mình hụt bao nhiêu?
Theo kinh nghiệm của mình, đây là con số bạn phải nhìn đầu tiên khi chọn tham số cho index. Tốc độ mà thiếu recall thì kết quả trả về sai, mà người dùng không hề biết mình đang thấy kết quả thiếu.
Cách Tính Recall@K Như Thế Nào?
Công thức rất đơn giản: Recall@K = (số kết quả đúng trong top K) / (tổng số kết quả đúng cần tìm).
Ví dụ cụ thể: bạn có một câu truy vấn, và biết chắc chắn (tính bằng brute-force) rằng 10 tài liệu liên quan nhất là A, B, C… J. Hệ thống ANN của bạn trả về top 10 nhưng thiếu 2 tài liệu, thay bằng 2 tài liệu khác kém liên quan hơn. Vậy Recall@10 = 8/10 = 0.8.
Trên thực tế, người ta thường tính trung bình Recall@K trên hàng nghìn truy vấn khác nhau để có con số ổn định, tránh trường hợp một truy vấn may mắn kéo cả chỉ số lên.
Recall@K Khác Precision Ở Điểm Nào?
Nhiều bạn hay nhầm hai chỉ số này. Cách phân biệt nhanh:
- Recall@K hỏi: trong những kết quả đúng cần tìm, mình bắt được bao nhiêu?
- Precision@K hỏi: trong K kết quả mình trả về, bao nhiêu kết quả là đúng?
Trong tìm kiếm vector, recall thường được quan tâm hơn vì ground truth thường định nghĩa là “top K chính xác”. Khi đó Recall@K về bản chất đo tỷ lệ trùng khớp giữa top K của thuật toán xấp xỉ và top K lý tưởng.
Trade-off Giữa Recall@K Và Tốc Độ?
Đây là phần thực tế nhất nếu bạn đang vận hành hệ thống. Recall@K và độ trễ (latency) luôn kéo nhau theo hướng ngược lại:
- Tăng ef_search trong HNSW hoặc nprobe trong IVF thì recall tăng, nhưng truy vấn chậm hơn.
- Giảm các tham số này thì truy vấn nhanh hơn, but dễ hụt kết quả.
- Nén vector bằng Product Quantization cũng làm giảm recall, đổi lấy bộ nhớ nhỏ hơn.
Một điểm cân bằng phổ biến trong thực tế: Recall@10 ở mức 0.9 đến 0.95 với độ trễ dưới 10ms. Nếu hệ thống của bạn chấp nhận được recall 0.85 mà nhanh gấp đôi, đó vẫn là lựa chọn hợp lý, tùy bài toán.
Cách Nâng Cao Recall@K?
Mấy cách mình thấy hiệu quả nhất theo thứ tự nên thử:
- Tăng tham số tìm kiếm (ef_search, nprobe) trước tiên, đơn giản nhất.
- Dùng index chất lượng hơn: HNSW với M lớn hơn cho recall cao hơn nhưng tốn bộ nhớ.
- Giảm mất mát khi nén: nếu dùng PQ, cân nhắc rescoring tinh chỉnh lại top kết quả bằng vector gốc.
- Chọn K lớn hơn lúc truy xuất rồi cắt lại sau bằng reranking, ví dụ lấy top 100 rồi rerank xuống top 10.
Kết Luận
Recall@K là chỉ số bắt buộc phải theo dõi nếu bạn làm việc với tìm kiếm vector, RAG hay hệ thống gợi ý. Nó cho bạn biết hệ thống xấp xỉ của mình đang “hụt” bao nhiêu kết quả đúng so với chuẩn mực lý tưởng. Nhớ nguyên tắc: luôn đo recall trước khi tối ưu tốc độ, vì một hệ thống nhanh mà trả về thiếu kết quả thì người dùng vẫn thấy hệ thống kém.