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

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.

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ầnLà gì
$scoreĐiểm từ prefetch — độ giống, hoặc điểm đã gộp từ fusion
Trường payloadSố lấy thẳng từ payload (luot_xem, gia, …)
Điều kiệnMộ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]

Đây là phần đáng học kỹ, vì chọn sai hàm cho ra hành vi rất khác:

HàmHình dạngChạm 0?
lin_decaytuyến tính — đây là hàm duy nhất thật sự về 0
exp_decaytụt nhanh lúc đầu, chậm dần sau midpointKhông
gauss_decaytụt chậm và mượt tới midpoint, rồi tăng tốcKhô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 3

Bạ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_byTrường payload để gom (ví dụ tai_lieu_id)
limitSố nhóm trả về
group_sizeSố đ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, limit của tầng 1 phải đủ rộng (7.11).

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ế:

  1. 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ử.
  2. 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.
  3. Kiểm tra chất lượng dữ liệu. Facet trên ngon_ngu hoặc phong_ban thườ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ạn muốnDùngCó từRủi ro chính
Ưu tiên mới / gần / phổ biếnformula + decayv1.14Độ lớn lấn át $score
Không để một tài liệu chiếm top-kgroup_byv1.11Không tạo ra đa dạng nếu tầng 1 hẹp
Đếm theo giá trị, dựng bộ lọc UIfacetv1.12Mặ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.

Phần 7 — Qdrant