Bỏ qua để đến nội dung
Search & RAG

5.13 Khi nào reranker làm tệ hơn

Phần lớn tài liệu về reranking dừng ở “nó cải thiện chất lượng”. Mục này về nửa còn lại, và nửa còn lại có bằng chứng đo được. Đọc mục này trước khi triển khai, không phải sau khi có sự cố.

Bằng chứng trung tâm: k càng lớn không càng tốt

Phần tiêu đề “Bằng chứng trung tâm: k càng lớn không càng tốt”

Một nghiên cứu đã đo đúng câu hỏi này — tăng k (số ứng viên đưa vào rerank) rồi xem recall@10 cuối cùng đi đâu — trên cả tập học thuật (BRIGHT, BIRCO, BEIR scifact) và tập doanh nghiệp thật (FinanceBench, ManufacturingQA, DocumentationQA), với bốn reranker đang được dùng nhiều trong production.

Ba con số của họ, đọc theo thứ tự:

Kết quảHọc thuậtDoanh nghiệp
Reranker cải thiện recall@10 so với retrieval ở ít nhất một giá trị k85,0%88,9%
Nhưng: tăng k lên dẫn tới recall@10 tệ hơn cả retrieval một mình53,3%44,4%
Cross-encoder pointwise bền khi tăng kchỉ 23,3%chỉ 22,2%

Đọc dòng thứ hai lần nữa: trong khoảng một nửa số trường hợp, đưa nhiều ứng viên hơn vào reranker làm kết quả tệ hơn là không rerank gì cả.

Và cơ chế hỏng có tên: phantom hits — reranker chấm điểm cao cho tài liệu không có liên hệ nào với truy vấn, không lexical, không ngữ nghĩa. Ví dụ cụ thể trong bài báo: một truy vấn về acetylation của protein, và một tài liệu về máy rửa bát được reranker xếp hạng 3, trong khi retriever xếp nó hạng 4615.

Đây không phải “reranker hiểu sai một chút”. Đây là reranker tự tin đề bạt rác, và càng nhiều ứng viên thì càng nhiều cơ hội cho một mẩu rác ăn điểm cao ngẫu nhiên.

Một chi tiết nữa của cùng bài báo, và nó ngược với trực giác: reranker listwise bằng LLM lại cải thiện đều khi k tăng. Tác giả cho rằng vì nó không bị fine-tune chuyên cho xếp hạng nên không mắc kiểu quên thảm khốc mà các cross-encoder đã fine-tune mắc phải. Họ cũng nói thẳng cách đó “latency cao và không thực tế” — nó là bằng chứng tồn tại, không phải khuyến nghị.

Và đây là lời giải thích từ phía huấn luyện

Phần tiêu đề “Và đây là lời giải thích từ phía huấn luyện”

Hai kết quả sau đến từ hai nơi khác nhau và khớp nhau đến mức đáng chú ý. Hướng dẫn huấn luyện reranker của HuggingFace ghi một cảnh báo:

Nếu bạn chỉ dùng hard negative, model có thể tệ đi một cách bất ngờ ở các trường hợp dễ. Cụ thể: rerank top-200 của stage 1 có thể cho top-10 tệ hơn là rerank top-100.

Đó chính xác là hiện tượng ở phần trên, nhìn từ phía nguyên nhân. Reranker được huấn luyện toàn bằng ứng viên khó nên nó chưa từng học cách nói “cái này chả liên quan gì” một cách đáng tin — và khi bạn đưa cho nó những ứng viên rất xa từ đuôi danh sách top-200, nó không có cơ sở nào để loại chúng.

Hệ quả hành động: k không phải một tham số hiệu năng. Nó là một siêu tham số chất lượng phải được điều chỉnh bằng số đo, y như k1/b của BM25 (3.14 — tinh chỉnh k1,b chỉ được +2,4%). Đo recall@10 cuối cùng tại k = 25, 50, 100, 200chọn theo số, đừng chọn k = 100 vì đọc thấy ở đâu đó.

Một số đo trên BEIR (nhóm tập Q&A, nDCG@10, rerank top-100) cho thấy hình dạng rất rõ:

Retriever stage 1Chỉ retrieval+ rerankerMức tăng
retriever yếu hơn0,61000,7529+0,143
retriever trung bình0,60830,7486+0,140
retriever mạnh0,71730,7694+0,052

Cùng một reranker, cùng dữ liệu. Stage 1 càng tốt, reranker mua được càng ít — đúng như 5.4 nói bằng lý thuyết.

Và ở đầu mút của xu hướng đó, nó đổi dấu. Một benchmark do nhà cung cấp thực hiện (số của nhà cung cấp, có xung đột lợi ích — đọc như một tín hiệu, không như một hằng số) báo cáo: với một retriever dense mạnh làm nền (nDCG@10 = 81,58%), reranker chuyên dụng đưa lên 83,02%, nhưng hai LLM đa dụng dùng làm reranker kéo xuống 80,63% và 79,49% — tức thấp hơn cả việc không rerank. Và càng tăng số ứng viên từ 10 lên 200 thì càng tụt.

→ Đây là lý do 5.12 đòi bạn báo nDCG@5 trước rerank. Không có mốc đó thì bạn không thể biết mình đang cải thiện hay đang phá.

Khoảng cách tổng quát hoá: benchmark nói dối theo thời gian

Phần tiêu đề “Khoảng cách tổng quát hoá: benchmark nói dối theo thời gian”

Một nghiên cứu 2025 đánh giá 22 phương pháp / 40 biến thể trên các benchmark chuẩn, rồi đánh giá lại trên một tập truy vấn mới, chưa từng tồn tại lúc các model được huấn luyện:

Phát hiệnSố
Mức tụt khi chuyển sang truy vấn mới, mọi nhóm phương pháp5–15%
Listwise tụt ít nhất~8%
Pointwise~12%
Pairwise tụt nhiều nhất~15%

Câu kết luận của họ đáng ghim: các tuyên bố về “khả năng tổng quát hoá” dựa trên benchmark chuẩn có thể đang bị nói quá. Cùng nghiên cứu ghi nhận các thất bại thảm khốc ngoài miền — một model listwise tụt xuống 9,72 trên tập truy vấn mới, trong khi các model khác giữ khoảng 60.

Cộng thêm phần này: các reranker công khai thường được huấn luyện trên đúng loại dữ liệu mà các benchmark phổ biến lấy mẫu từ đó (5.5). Nhà cung cấp benchmark mới nhất thậm chí phải giữ kín một nửa tập dữ liệu để phát hiện overfit — họ gọi hiện tượng này là “khoảng cách tổng quát hoá”.

Một minh hoạ nhỏ và rất sạch, ngay trên dữ liệu tiếng Việt: trên cùng tập mMARCO-vi dev, ViRanker thắng ở NDCG@3 (0,6815 so với 0,6625) nhưng PhoRanker thắng ở NDCG@10 (0,7422 so với 0,7302). “Reranker nào tốt hơn” đổi chiều theo cutoff bạn chọn. Nếu chỉ đọc một con số, bạn sẽ chọn sai một nửa số lần.

Chế độ hỏngBiểu hiệnCách phát hiệnCách chữa
k quá lớnrecall@10 cuối tệ hơn không rerankQuét k = 25/50/100/200, đo recall@10Giảm k. Xem phần đầu mục
Phantom hitsTài liệu vô liên quan nằm trong top-3Đọc tay top-3 của 20 truy vấnGiảm k; thêm sàn điểm stage 1; xem xét đổi model
Hỏng lớp lexicalTruy vấn chứa mã định danh (E2003) tệ hơn sau rerankĐo tách theo lớp truy vấnBỏ qua rerank cho các truy vấn đó (5.11)
Cắt chuỗi im lặngĐiểm thấp cho tài liệu chứa đúng câu trả lời ở cuốiSo max_seq của model với độ dài chunk thật, tính bằng tokenizer của chính modelChunk nhỏ hơn, hoặc cửa sổ + max-pool (5.9)
Sai ngôn ngữChất lượng “cứ tệ” mà không rõ vì saoKiểm model có nêu tên tiếng Việt tường minhĐổi model. Cảnh giác với endpoint mặc định của search engine (5.8)
Trôi phân phối điểm sau nâng cấpHệ thống trả rỗng / “không tìm thấy” hàng loạtTest tự động so phân phối điểm với mốc lúc hiệu chỉnhBỏ ngưỡng cứng (5.3)
Degrade âm thầmChất lượng tụt về stage 1, không ai biếtMetric riêng cho tỷ lệ degradeAlert khi tỷ lệ degrade > 1% (5.11)
Đầu ra LLM sai định dạngThứ tự bị bỏ qua, hoặc mất tài liệuLog tỷ lệ parse lỗiParser phòng thủ + fallback. Với listwise ở k = 100, khoảng 5% phản hồi bị lỗi định dạng
Prompt injectionTài liệu chứa chỉ dẫn tự đẩy mình lên đầuĐo với tài liệu tấn công có chủ đíchRủi ro thật của LLM reranker; cross-encoder không nhận chỉ dẫn nên không mắc
Vượt giới hạn cứng của APILỗi runtime ở tải caoĐọc tài liệu giới hạnVí dụ: một API báo lỗi nếu nhận quá 10.000 tài liệu một lượt

Dòng thứ ba xứng đáng được nói rõ, vì nó áp đúng vào corpus của cẩm nang: lớp A (lexical/exact) đã đạt nDCG 0,971 với BM25 thuần (baseline đã đo). Một reranker chung chung ở đó chỉ có thể làm hỏng — nó ưu tiên đoạn văn xuôi “đọc thấy hợp” hơn đoạn chứa đúng mã lỗi. Nếu bạn chỉ báo một con số tổng, mức sụt đó bị lớp B che đi hoàn toàn.

Một quyết định “không dùng” có số đo, từ production

Phần tiêu đề “Một quyết định “không dùng” có số đo, từ production”

Đáng đọc vì nó là ví dụ về việc đo rồi từ chối: một đội vận hành reranker bằng LLM trong sản phẩm thật đã thử chuyển sang listwise và báo cáo kết quả là +40% latency, +15% chi phí, và không có lợi ích chất lượng nào. Họ giữ nguyên cách cũ.

Đó là hình dạng của một quyết định kỹ thuật tốt: không phải “listwise tốt hơn theo paper”, mà “trên hệ của tôi, với dữ liệu của tôi, nó không mua được gì”.

Nên áp dụng vào AI Agent: thêm ba thứ vào hệ thống cùng lúc với reranker, không phải sau: (1) một bảng đo tách theo lớp truy vấn, (2) một metric tỷ lệ degrade, (3) một test tự động fail khi phân phối điểm dịch quá xa mốc hiệu chỉnh. Cả ba đều rẻ, và cả ba đều là thứ bạn sẽ ước mình đã có vào lần sự cố đầu tiên.

Phần 5 — Reranker