5.3 Điểm của reranker nghĩa là gì (và vì sao đừng đặt ngưỡng cứng lên nó)
Reranker trả về một số cho mỗi cặp (câu hỏi, tài liệu). Mục này về việc con số
đó thực sự là gì — vì hiểu sai nó gây ra một loại sự cố production rất khó truy:
hệ thống im lặng trả về rỗng sau một lần nâng cấp model.
Con số đó ra từ đâu
Phần tiêu đề “Con số đó ra từ đâu”Một cross-encoder là một transformer với một đầu phân loại gắn lên vector [CLS]:
[CLS] câu hỏi [SEP] tài liệu [SEP] │ ▼ N lớp transformervector [CLS] ──► một lớp linear ──► logit (một số thực, không chặn) │ └─► sigmoid ──► 0…1Hai chi tiết quyết định mọi thứ:
- Cái model xuất ra nguyên bản là một logit — số thực bất kỳ, có thể
−9,3hoặc+11,7. Thang này không có đơn vị. - Sigmoid biến nó thành 0…1, nhưng đó không phải xác suất đã hiệu chuẩn.
0,9không có nghĩa “đúng 90% số lần”. Nó chỉ có nghĩa “cao hơn0,8”.
Điểm này được huấn luyện để so sánh, không phải để đọc trực tiếp. Xem 5.5 — mục tiêu huấn luyện là xếp đúng thứ tự trong một danh sách, không phải dự đoán đúng một xác suất.
Điều này an toàn, điều kia không
Phần tiêu đề “Điều này an toàn, điều kia không”| Việc bạn làm với điểm | An toàn? | Vì sao |
|---|---|---|
Sắp xếp giảm dần, lấy n đầu | An toàn | Đúng thứ model được huấn luyện để làm |
| So hai tài liệu trong cùng một truy vấn | An toàn | Cùng câu hỏi, cùng model, cùng thang |
| So điểm giữa hai truy vấn khác nhau | Rủi ro | Thang trôi theo độ khó và độ dài của câu hỏi |
Đặt ngưỡng cứng score > 0,5 | Rủi ro cao | Xem phần dưới |
| Giữ ngưỡng cũ sau khi đổi model | Gần như chắc sai | Thang hoàn toàn khác nhau giữa các model |
| Cộng điểm reranker với điểm BM25 | Sai | Hai thang không cùng đơn vị. Muốn trộn thì RRF |
Vì sao về mặt toán học điểm không thể hiệu chuẩn
Phần tiêu đề “Vì sao về mặt toán học điểm không thể hiệu chuẩn”Đây không phải một thiếu sót của các model hiện nay, nó là hệ quả của hàm loss.
Các hàm loss ranking hiệu quả (pairwise, listwise — 5.5) bất biến với phép dịch chuyển: cộng cùng một hằng số vào điểm của mọi tài liệu thì thứ tự không đổi, nên loss cũng không đổi.
điểm = (2,1; 0,4; −1,3) → thứ tự: d1 > d2 > d3điểm+5= (7,1; 5,4; 3,7) → thứ tự: d1 > d2 > d3 ← loss Y HỆTNghĩa là quá trình huấn luyện không có bất kỳ áp lực nào buộc điểm nằm ở một thang cụ thể. Model được xác định “chỉ tới một hằng số cộng thêm”. Nhà nghiên cứu gọi tính chất này là không hiệu chuẩn theo thang (scale calibration), và nó là lý do cấu trúc để đừng đọc điểm như một xác suất.
Và đó cũng là một sự đánh đổi có thật, không phải một lỗi cần sửa: loss hồi quy pointwise cho bạn điểm hiệu chuẩn (cần cho những chỗ như đấu giá quảng cáo theo pCTR) nhưng ranking tệ hơn. Model ranking tốt thì điểm không đọc được; model điểm đọc được thì ranking tệ hơn. Bạn không được cả hai.
Nhà cung cấp model cũng nói thẳng điều này. Model card của bge-reranker-base ghi:
“reranker được tối ưu theo cross-entropy loss, nên điểm liên quan không bị chặn trong
một khoảng cụ thể”.
Thêm một lý do nữa để ngưỡng không chuyển được giữa các model: ba họ model lấy điểm ra
từ ba chỗ khác nhau (5.5) — logit của một lớp phân
loại (monoBERT), logit của token true (monoT5), hoặc hiệu logit của token yes và
no (Qwen3-Reranker). Ba cơ chế, ba phân phối, không có tỷ lệ chuyển đổi nào.
Vì sao ngưỡng cứng là một cái bẫy
Phần tiêu đề “Vì sao ngưỡng cứng là một cái bẫy”Đặt ngưỡng nghe rất hợp lý: “chỉ đưa vào prompt các đoạn có điểm > 0,5, để LLM không phải đọc rác”. Vấn đề là 0,5 không phải một hằng số của tự nhiên, nó là một tính chất của model bạn đang chạy hôm nay:
model A: điểm của tài liệu đúng thường rơi 0,85–0,99 → ngưỡng 0,5 hợp lýmodel B: điểm của tài liệu đúng thường rơi 0,25–0,60 → ngưỡng 0,5 CẮT MẤT NỬAKịch bản sự cố kinh điển, và nó không sinh ra exception nào:
- Bạn hiệu chỉnh ngưỡng
0,5trên model A, chạy tốt sáu tháng. - Bạn nâng cấp lên model mới hơn, tốt hơn thật (nDCG cao hơn).
- Model mới xuất điểm ở thang thấp hơn. Mọi tài liệu bị lọc sạch.
- Người dùng thấy: agent trả lời “tôi không tìm thấy thông tin” cho mọi câu hỏi.
- Log không có lỗi gì. Metric retrieval không đổi. Chất lượng model tăng.
Đây là biến thể của lỗi im lặng mà cẩm nang gặp ở tokenizer (Tầng 0 — tokenizer đổi 20,8%): hệ thống không hỏng, nó chỉ đơn giản là trả về ít hơn.
Hai nhà cung cấp nói ngược nhau — và đó chính là bài học
Phần tiêu đề “Hai nhà cung cấp nói ngược nhau — và đó chính là bài học”Đọc tài liệu chính thức của hai nhà cung cấp reranker lớn, về đúng câu hỏi “điểm có so được giữa các truy vấn không”:
| Nói gì | |
|---|---|
| Elastic | Cross-encoder “xuất ra điểm nhất quán giữa các truy vấn. Điều này cho phép bạn đặt một ngưỡng điểm tối thiểu cho mọi truy vấn” — và họ đối chiếu với bi-encoder, nơi điểm phụ thuộc truy vấn nên “không thể đặt cutoff dùng chung” |
| Cohere | Về chính reranker của họ: “Điểm phụ thuộc truy vấn, và có thể cao hơn hoặc thấp hơn tuỳ theo truy vấn và các đoạn được gửi vào” — kèm cảnh báo đừng cho rằng điểm 0,91 “liên quan gấp đôi” điểm 0,04 |
Hai phát biểu này không thể cùng đúng cho mọi cross-encoder. Và đó là kết luận nên mang đi:
“Điểm có so được giữa các truy vấn không” là thuộc tính của từng model, không phải thuộc tính của kiến trúc cross-encoder.
Nên đừng suy từ “nó là cross-encoder” ra “tôi đặt ngưỡng được”. Đo phân phối điểm trên chính dữ liệu của bạn, với chính model bạn dùng.
Cohere còn đưa một quy trình hiệu chỉnh cụ thể, và nó là cách làm đúng nếu bạn thật cần ngưỡng: gom 30–50 truy vấn tiêu biểu của miền bạn, với mỗi truy vấn đưa vào các tài liệu liên quan ở mức ranh giới, chạy rerank, rồi lấy trung bình điểm thu được làm mốc cho cutoff. Chạy lại quy trình đó mỗi lần nâng cấp model.
Ba cách thay ngưỡng cứng
Phần tiêu đề “Ba cách thay ngưỡng cứng”| Cách | Công thức | Khi nào dùng |
|---|---|---|
| Top-n tuyệt đối | luôn lấy n đoạn đầu | Mặc định. Chi phí prompt xác định trước, không bao giờ rỗng |
| Khoảng cách tương đối | giữ khi score ≥ score_1 − δ, hoặc score ≥ α · score_1 | Khi muốn context ngắn lại khi câu trả lời rõ ràng |
| Phân vị đo trên chính dữ liệu của bạn | ngưỡng = phân vị p của phân phối điểm đo trên golden set | Khi thật cần abstention. Phải đo lại mỗi lần đổi model |
Cách thứ hai đáng nói thêm: nó dùng hình dạng của phân phối chứ không dùng giá trị
tuyệt đối, nên nó chịu được việc đổi model tốt hơn nhiều. Nếu đoạn số một được 9,1
và đoạn số hai được 2,0, khoảng cách lớn đó tự nói rằng chỉ có một tài liệu liên quan.
Dùng điểm reranker để từ chối trả lời
Phần tiêu đề “Dùng điểm reranker để từ chối trả lời”Đây là ứng dụng bị bỏ sót nhưng có giá trị cao — và nó nối trực tiếp vào lớp D của golden set cẩm nang (truy vấn mà câu trả lời đúng là “không hỗ trợ” / “đã ngừng”).
Nếu tất cả k ứng viên đều nhận điểm thấp, đó là tín hiệu mạnh rằng corpus của bạn
không chứa câu trả lời. Lúc đó việc đúng là abstention — trả lời “không có thông
tin này trong tài liệu” — chứ không phải nhồi 5 đoạn không liên quan vào prompt và
mời LLM bịa (Tầng 8).
Nhưng làm việc này thì phải làm tử tế:
1. Chạy reranker trên golden set của bạn, gồm cả các truy vấn KHÔNG có đáp án.2. Vẽ hai phân phối điểm: (có đáp án) và (không có đáp án).3. Chỗ hai phân phối chồng nhau ít nhất → ngưỡng.4. GHIM ngưỡng đó vào config cạnh TÊN MODEL, không phải một hằng số rời.5. Đổi model → làm lại từ bước 1. Không có ngoại lệ.Bước 4 là chỗ mọi người quên. Ngưỡng là một thuộc tính của cặp (model, dữ liệu), không phải một hằng số của hệ thống.
→ Nên áp dụng vào AI Agent: mặc định dùng top-n tuyệt đối. Chỉ chuyển sang ngưỡng khi bạn cần abstention thật, và khi đó lưu ngưỡng cùng phiên bản model trong cùng một dòng config, kèm một test tự động fail khi phân phối điểm dịch quá xa mốc đã hiệu chỉnh.