Metadata filtering trong vector DB: pre-filter vs post-filter vs hybrid?

Nhiều use case RAG cần filter theo metadata kèm similarity search: "tìm document chỉ thuộc product X, ngôn ngữ VN, sau 2024". Có 3 chiến lược cơ bản:

1. Post-filtering (filter sau)
- Flow: ANN search top-K trong toàn bộ index → filter metadata sau.
- Ưu: đơn giản, không đụng index.
- Nhược: nếu filter loại phần lớn → top-K có thể empty/quá ít. Phải tăng K lên nhiều (ví dụ K=500 để lọc còn 10) → chậm, tốn memory.
- Dùng khi filter loại bỏ < 20% corpus.

2. Pre-filtering (filter trước)
- Flow: query metadata index trước → subset vectors → chỉ ANN search trong subset.
- Ưu: chính xác, không miss.
- Nhược: phá ANN performance. HNSW traversal dựa trên graph; filter trước làm graph thưa → có thể "unreachable neighborhood" → recall drop. Với subset rất nhỏ (< 1% corpus) thường fallback brute force.
- Dùng khi filter loại bỏ > 80% corpus.

3. Filtered HNSW / hybrid (state-of-art)
- Kỹ thuật tích hợp filter VÀO ANN traversal: khi đi qua graph, chỉ xét node pass filter; nếu đủ neighbor pass → output, không đủ → expand thêm.
- Giữ recall cao + filter đúng, tránh case edge của pre/post.
- Qdrant gọi là payload-based filtering, Weaviate là filtered vector search, pgvector + ivfflat/hnsw từ v0.7 hỗ trợ filter trong traversal.

Kỹ thuật hỗ trợ:

  • Metadata index — index riêng (B-tree, bitmap, inverted) cho field filter phổ biến (tenant_id, date, category) → pre-filter nhanh.
  • Hybrid index / Partitioning — chia vector thành multiple collections/namespaces theo filter phổ biến (1 collection per tenant, per language, per year). Query đúng collection, không cần filter global.
  • Pre-filter selectivity estimation — DB ước lượng % vector pass filter → chọn chiến lược động (thấp → pre, cao → post, giữa → filtered HNSW).

Performance tips thực tế:

1. Cardinality thấp (tenant_id với 100 tenant) → partition theo tenant, không filter runtime.
2. Cardinality cao + loại nhiều (user_id với 10M user, mỗi query chỉ 1 user) → filtered HNSW + metadata index.
3. Range filter (date > X) → cẩn thận selectivity thay đổi theo query; dùng filtered HNSW.
4. Composite filter (AND của nhiều field) → selectivity tích; có thể rất thấp → fallback brute force subset.
5. Luôn measure recall sau khi thêm filter; recall có thể drop 10-30% nếu config sai.

Multi-tenancy là use case điển hình: Pinecone namespace, Qdrant collection shards, Weaviate multi-tenancy object. Tách tenant thành unit indexing → filter free, bảo mật tốt hơn (không lẫn data).

Xem toàn bộ AI Engineering cùng filter theo level & chủ đề con.

Mở danh sách AI Engineering