7.14 Formula, grouping, facet
Ba tính năng ở tầng trên cùng của truy vấn. Chúng không thay đổi cái gì được tìm thấy — chúng thay đổi cái gì được trả về và theo thứ tự nào. Vì vậy chúng cũng là ba chỗ dễ làm hỏng chất lượng nhất mà không ai nhận ra.
Formula — ranking theo nghiệp vụ
Phần tiêu đề “Formula — ranking theo nghiệp vụ”Có từ v1.14 (Qdrant gọi là score boosting). Ý tưởng: kết quả cuối không nhất thiết phải xếp theo độ giống. Bạn muốn tài liệu mới hơn được ưu tiên, sản phẩm còn hàng lên trước, cửa hàng gần hơn được cộng điểm.
Một formula xây từ bốn thành phần:
| Thành phần | Là gì |
|---|---|
$score | Điểm từ prefetch — độ giống, hoặc điểm đã gộp từ fusion |
| Trường payload | Số lấy thẳng từ payload (luot_xem, gia, …) |
| Điều kiện | Một filter dùng như biểu thức đúng/sai để cộng thêm |
| Hàm decay | Ánh xạ mượt một giá trị về [0, 1] |
Ba hàm decay
Phần tiêu đề “Ba hàm decay”Đây là phần đáng học kỹ, vì chọn sai hàm cho ra hành vi rất khác:
| Hàm | Hình dạng | Chạm 0? |
|---|---|---|
lin_decay | tuyến tính | Có — đây là hàm duy nhất thật sự về 0 |
exp_decay | tụt nhanh lúc đầu, chậm dần sau midpoint | Không |
gauss_decay | tụt chậm và mượt tới midpoint, rồi tăng tốc | Không |
Hai tham số: midpoint (mặc định 0,5) và scale (mặc định 1,0).
Cách chọn, diễn đạt bằng bài toán “ưu tiên tài liệu mới”:
gauss_decay— “tài liệu trong vòng một tháng gần như tương đương nhau, cũ hơn thì giảm nhanh.” Vùng phẳng ở đầu là thứ bạn muốn khi độ tươi chỉ quan trọng sau một ngưỡng.exp_decay— “mới hơn một chút cũng đáng giá.” Phạt ngay từ đầu.lin_decay— “quá 90 ngày thì coi như không liên quan.” Dùng khi có một mốc cứng thật sự.
⚠️ Bẫy độ lớn (nhắc lại, vì nó rất hay xảy ra)
Phần tiêu đề “⚠️ Bẫy độ lớn (nhắc lại, vì nó rất hay xảy ra)”$score từ RRF là tổng của các 1/(k + hạng) — rất nhỏ. Hàm decay trả về giá trị trong
[0, 1]. Cộng thẳng thì:
Thành phần nghiệp vụ nuốt chửng thành phần liên quan. Bạn sẽ có một hệ thống ranking theo độ mới, kèm một chút gợi ý về nội dung.
Phải nhân decay với một hệ số nhỏ, và phải đo lại nDCG sau khi thêm formula. Đây là loại thay đổi làm chất lượng tụt mà kết quả vẫn “trông hợp lý” — dạng lỗi tệ nhất.
Formula là Learning-to-Rank làm bằng tay. Nó rẻ và không cần dữ liệu huấn luyện, nhưng nó cũng là các hệ số bạn tự đặt. Mọi hệ số tự đặt đều phải đo trên golden set, không phải trên vài truy vấn bạn nghĩ ra (Phần 2 — 6).
Grouping — chống một tài liệu chiếm hết top-k
Phần tiêu đề “Grouping — chống một tài liệu chiếm hết top-k”Có từ v1.11. Vấn đề nó giải rất quen với ai làm RAG:
Truy vấn: "chính sách hoàn tiền"Top-5 trả về: 1. tai_lieu_A, chunk 12 ← cùng 2. tai_lieu_A, chunk 13 ← một 3. tai_lieu_A, chunk 11 ← tài 4. tai_lieu_A, chunk 14 ← liệu 5. tai_lieu_B, chunk 3Bạn nhồi 5 chunk vào LLM và bốn trong số đó là cùng một trang. Đa dạng bằng không, và các tài liệu khác có thể trả lời tốt hơn thì không có cơ hội.
Ba tham số:
| Tham số | Nghĩa |
|---|---|
group_by | Trường payload để gom (ví dụ tai_lieu_id) |
limit | Số nhóm trả về |
group_size | Số điểm tối đa trong mỗi nhóm |
limit: 4, group_size: 2 nghĩa là: 4 tài liệu khác nhau, mỗi tài liệu tối đa 2 chunk.
Điều này gắn thẳng với Tầng 8 — Context assembly: ngân sách context của bạn có hạn, và tiêu nó vào bốn chunk liền nhau của cùng một trang thường là lựa chọn tệ.
Lưu ý. Gom nhóm diễn ra sau khi tìm. Nếu tầng 1 chỉ trả về chunk của một tài liệu duy nhất thì gom nhóm không sinh ra đa dạng từ hư không — nó chỉ cắt bớt. Muốn có đa dạng thật,
limitcủa tầng 1 phải đủ rộng (7.11).
Facet — đếm theo giá trị
Phần tiêu đề “Facet — đếm theo giá trị”Có từ v1.12. Về bản chất là GROUP BY ... COUNT(*) trên một trường payload: trả về các
giá trị khác nhau của trường đó kèm số điểm mang mỗi giá trị, sắp giảm dần theo số đếm.
Ba công dụng, xếp theo mức hữu ích thực tế:
- Giao diện lọc. “Kế toán (1.204) · Nhân sự (876) · Kỹ thuật (302)” — kiểu bộ lọc thường thấy ở trang thương mại điện tử.
- Chẩn đoán filter. Trước khi đổ lỗi cho recall, hãy facet trên trường bạn đang lọc. Nếu giá trị bạn lọc chỉ có 12 điểm, thì vấn đề không nằm ở HNSW — xem 7.8.
- Kiểm tra chất lượng dữ liệu. Facet trên
ngon_nguhoặcphong_banthường phơi ra ngay các giá trị viết sai chính tả, trùng lặp, hoặc rỗng.
Hai tham số cần nhớ: limit mặc định là 10, và kết quả mặc định là xấp xỉ — đặt
exact: true khi cần con số đúng (đắt hơn).
Công dụng thứ hai là thứ tôi khuyên bạn tập thành phản xạ: khi truy vấn có filter cho kết quả kỳ lạ, facet trước, suy đoán sau.
Bảng gộp
Phần tiêu đề “Bảng gộp”| Bạn muốn | Dùng | Có từ | Rủi ro chính |
|---|---|---|---|
| Ưu tiên mới / gần / phổ biến | formula + decay | v1.14 | Độ lớn lấn át $score |
| Không để một tài liệu chiếm top-k | group_by | v1.11 | Không tạo ra đa dạng nếu tầng 1 hẹp |
| Đếm theo giá trị, dựng bộ lọc UI | facet | v1.12 | Mặc định xấp xỉ |
Và một câu chung cho cả ba: mỗi tính năng ở đây đều thay đổi kết quả cuối cùng, nên mỗi tính năng đều phải đo lại. Chúng nằm sau tầng ranking, nên chúng có toàn quyền phá thứ mà tầng ranking vừa làm đúng.