Filtered Vector Search: What ACORN Fixes, and What Fixes ACORN

Bài tóm tắt Qdrant 2026 3. Quy mô lớn Độ khó: Khó

Qdrant · 2026 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Bài nhà cung cấp, benchmark trên một máy laptop, chạy tuần tự, có bộ tái lập công khai; nên đọc tỉ lệ chứ không đọc mili giây tuyệt đối. Mọi nhận định ghi "theo Qdrant".

Bối cảnh

  • Filter metadata biến đồ thị HNSW thành các đảo rời: với m=16 mặc định, tập 1 triệu điểm có trung bình khoảng 21 cạnh mỗi node ở tầng 0; filter bỏ 96% điểm thì trung bình còn chưa tới 1 cạnh, việc duyệt bị kẹt trước khi tới láng giềng thật.
  • Qdrant có hai cách vá: Filterable HNSW (từ 2019) thêm cạnh lúc dựng index giữa các điểm cùng giá trị ở một trường payload đã index; ACORN-1 (bản nhẹ của paper SIGMOD 2024) lúc tìm thì xét hàng xóm của hàng xóm khi hàng xóm trực tiếp không qua filter, bật theo từng request, không đổi index. Planner của Qdrant chọn giữa ACORN, quét toàn bộ, đọc thẳng payload index, và filterable HNSW.

Thay đổi chính (kết quả benchmark)

  • Chi phí cạnh thêm: dựng HNSW 116 giây không có cạnh thêm, 507–652 giây có cạnh thêm (4,4–5,6 lần).
  • Một filter (ef = 64): đồ thị trơn sụp khi filter hẹp (filter 1%: recall 0,1%). ACORN kéo recall lên với latency gấp 2,1–2,9 lần nhưng chững ở filter 1% (67,7%). Filterable HNSW giữ 94,8–99,8% với latency thấp nhất. Planner + ACORN giữ 99,9–100%.
  • Vì sao có trường không được cạnh thêm: giá trị nào có nhiều điểm hơn một ngưỡng (số điểm trong segment ÷ số cạnh trung bình × 4; ở đây khoảng 190.476 điểm, tức khoảng 19% tập) thì bị bỏ qua vì đồ thị chính được coi là đủ kết nối. Trường 5 giá trị (mỗi giá trị khoảng 20%) vượt ngưỡng 5% nên không có cạnh thêm nào; Qdrant không báo quyết định này, phải suy từ log trace.
  • Filter AND hai trường: cạnh thêm chỉ dựng theo từng trường, không theo tổ hợp, nên giao của hai trường không được phủ. Giao 4%: filterable HNSW 63,7%, ACORN 95,2%. Giao 0,012% (khoảng 120 điểm/triệu): đồ thị không còn là công cụ đúng, planner đọc payload index, recall 100% ở 1,3 ms. Với giao 1%, planner gửi 29/500 query vào đồ thị và 471 vào payload index.
  • Cấu hình mặc định (planner, cạnh thêm, ACORN tắt): hầu hết filter trên 90% recall, nhưng một filter chỉ 39,7% (giao 4% trên hai trường không có cạnh thêm); bật ACORN lên 100% với latency gấp 6,7 lần. Theo Qdrant, một con số recall tổng hợp sẽ che mất trường hợp này.
  • Hai cách vá cộng dồn: ACORN trên đồ thị có cạnh thêm đạt 99,9% so với 95,2% trên đồ thị trơn.

Vì sao

  • Theo Qdrant: cạnh thêm sửa đồ thị trước khi query tới (trả ở lúc dựng); ACORN sửa phần còn hở (trả ở lúc query); planner tránh đồ thị khi filter đủ hẹp để quét trực tiếp.

Bài học cho SWE

  • Đo recall theo từng hình dạng filter đang phục vụ, ưu tiên giá trị phủ khoảng một phần năm tập trở lên và tổ hợp AND của chúng.
  • Quyết định ngầm của engine (ngưỡng bỏ qua cạnh thêm) có thể làm chất lượng sụt mà không có lỗi nào; cần bộ đo tự dựng.
  • Một tối ưu lúc dựng index thường chỉ phủ từng chiều; tổ hợp chiều là chỗ hở.

Liên quan