Bạn đã bao giờ tìm trên Google và thấy kết quả đầu tiên không liên quan, nhưng kết quả thứ 5 mới đúng thứ mình cần? Trong hệ thống RAG (Retrieval-Augmented Generation), vấn đề này còn nghiêm trọng hơn: nếu context sai được đưa vào, mô hình ngôn ngữ sẽ sinh ra câu trả lời sai. Reranker ra đời để xử lý đúng bài toán này: sắp xếp lại kết quả tìm kiếm và chọn ra những tài liệu thực sự phù hợp nhất.
Bi-encoder: nhanh nhưng thiếu chiều sâu
Bước đầu tiên trong pipeline tìm kiếm thường dùng bi-encoder. Mô hình này mã hóa câu hỏi và tài liệu thành hai vector riêng biệt, sau đó so sánh bằng cosine similarity. Ưu điểm lớn nhất là tốc độ: vector của tài liệu có thể được tính trước và lưu sẵn trong cơ sở dữ liệu, nên khi có truy vấn mới, hệ thống chỉ cần tính vector cho câu hỏi rồi tìm những vector gần nhất. Với hàng triệu tài liệu, bước này chỉ mất vài mili giây. Tuy nhiên, bi-encoder có điểm yếu cốt lõi: câu hỏi và tài liệu không bao giờ "nhìn thấy nhau" trong quá trình mã hóa. Mỗi bên được nén thành một vector duy nhất một cách độc lập, nên những mối liên hệ tinh tế giữa từ trong câu hỏi và từ trong tài liệu dễ bị bỏ qua.
Cross-encoder: chậm nhưng cực kỳ chính xác
Cross-encoder hoạt động theo cách hoàn toàn khác. Thay vì mã hóa riêng, mô hình này ghép câu hỏi và tài liệu thành một chuỗi đầu vào duy nhất rồi đưa qua Transformer để tính điểm tương đồng. Hãy tưởng tượng bi-encoder như việc đọc tóm tắt hai cuốn sách rồi so sánh, còn cross-encoder như việc đọc cả hai cuốn cùng lúc, đối chiếu từng câu một. Kết quả là cross-encoder nắm bắt được ngữ cảnh sâu hơn nhiều, phát hiện được những mối liên hệ mà bi-encoder bỏ lỡ. Nhược điểm là với mỗi cặp câu hỏi - tài liệu, cross-encoder phải chạy lại toàn bộ mô hình Transformer từ đầu. Nếu có 1 triệu tài liệu, bạn cần chạy 1 triệu lần, điều này không khả thi trong thực tế.
Pipeline hai giai đoạn: tận dụng ưu điểm của cả hai
Giải pháp thực tế là pipeline hai giai đoạn. Giai đoạn 1: bi-encoder quét nhanh toàn bộ kho dữ liệu, trả về 50 đến 100 ứng viên có vẻ liên quan. Giai đoạn 2: cross-encoder reranker chấm lại từng ứng viên theo câu hỏi gốc, rồi sắp xếp theo mức độ liên quan thực sự. Kết quả cuối cùng thường chỉ lấy top 3 đến 5 tài liệu để đưa vào prompt cho LLM. Theo Pinecone, cách tiếp cận này giúp tăng độ chính xác hơn 10% so với chỉ dùng bi-encoder, trong khi độ trễ chỉ tăng thêm vài chục mili giây vì reranker chỉ xử lý một tập nhỏ.
ColBERT: giải pháp trung gian với late interaction
Giữa hai thái cực bi-encoder và cross-encoder, ColBERT (Contextualized Late Interaction over BERT) đề xuất một cách tiếp cận thông minh. Thay vì nén toàn bộ tài liệu thành một vector duy nhất, ColBERT giữ lại vector của từng token. Khi so sánh, nó tính điểm MaxSim: với mỗi token trong câu hỏi, tìm token tương đồng nhất trong tài liệu, rồi cộng tất cả lại. Cơ chế này gọi là "late interaction" vì câu hỏi và tài liệu vẫn được mã hóa độc lập, nhanh như bi-encoder, nhưng việc so sánh diễn ra ở cấp độ token thay vì cấp độ tài liệu, nên chính xác hơn đáng kể. ColBERT nhanh hơn cross-encoder đáng kể khi dùng làm reranker, đồng thời chính xác hơn bi-encoder thuần túy.
Độ trễ và độ chính xác: bài toán đánh đổi cốt lõi
Trong thực tế, việc chọn reranker phụ thuộc vào yêu cầu cụ thể. Với ứng dụng chatbot cần phản hồi dưới 200ms, ColBERT là lựa chọn cân bằng tốt. Với hệ thống tìm kiếm tài liệu pháp lý nơi độ chính xác quan trọng hơn tốc độ, cross-encoder mạnh như ms-marco-MiniLM sẽ phù hợp hơn. Một số hệ thống triển khai thực tế còn kết hợp cả hai: ColBERT lọc từ 100 xuống 20, rồi cross-encoder chọn ra 5 kết quả cuối cùng. Quy trình hai giai đoạn không chỉ là một kỹ thuật. Nó đã trở thành kiến trúc tiêu chuẩn cho các hệ thống RAG đòi hỏi độ chính xác cao.




