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

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.

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 transformer
vector [CLS] ──► một lớp linear ──► logit (một số thực, không chặn)
└─► sigmoid ──► 0…1

Hai chi tiết quyết định mọi thứ:

  1. Cái model xuất ra nguyên bản là một logit — số thực bất kỳ, có thể −9,3 hoặc +11,7. Thang này không có đơn vị.
  2. Sigmoid biến nó thành 0…1, nhưng đó không phải xác suất đã hiệu chuẩn. 0,9 không có nghĩa “đúng 90% số lần”. Nó chỉ có nghĩa “cao hơn 0,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.

Việc bạn làm với điểmAn toàn?Vì sao
Sắp xếp giảm dần, lấy n đầuAn 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ấnAn toànCùng câu hỏi, cùng model, cùng thang
So điểm giữa hai truy vấn khác nhauRủi roThang trôi theo độ khó và độ dài của câu hỏi
Đặt ngưỡng cứng score > 0,5Rủi ro caoXem phần dưới
Giữ ngưỡng cũ sau khi đổi modelGần như chắc saiThang hoàn toàn khác nhau giữa các model
Cộng điểm reranker với điểm BM25SaiHai 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ỆT

Nghĩ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 yesno (Qwen3-Reranker). Ba cơ chế, ba phân phối, không có tỷ lệ chuyển đổi nào.

Đặ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ỬA

Kịch bản sự cố kinh điển, và nó không sinh ra exception nào:

  1. Bạn hiệu chỉnh ngưỡng 0,5 trên model A, chạy tốt sáu tháng.
  2. Bạn nâng cấp lên model mới hơn, tốt hơn thật (nDCG cao hơn).
  3. Model mới xuất điểm ở thang thấp hơn. Mọi tài liệu bị lọc sạch.
  4. 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.
  5. 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ì
ElasticCross-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”
CohereVề 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.

CáchCông thứcKhi nào dùng
Top-n tuyệt đốiluôn lấy n đoạn đầuMặc định. Chi phí prompt xác định trước, không bao giờ rỗng
Khoảng cách tương đốigiữ khi score ≥ score_1 − δ, hoặc score ≥ α · score_1Khi 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ạnngưỡng = phân vị p của phân phối điểm đo trên golden setKhi 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.

Phần 5 — Reranker