Vì phần lớn truy vấn thực tế đều kèm ràng buộc không nằm trong ngữ nghĩa: chỉ tài liệu của phòng ban tôi, chỉ bản hiệu lực năm nay, chỉ tiếng Việt. Similarity không lọc được những thứ này — chúng phải là metadata để filter.
Bộ tối thiểu nên có:
- Quyền truy cập: tenant_id, owner_id, visibility. Đây là ràng buộc bảo mật, phải filter ở tầng DB chứ không lọc sau khi lấy về.
- Thời gian: created_at, effective_date, version — để loại bản cũ và ưu tiên bản mới.
- Nguồn gốc: doc_id, source_url, page, heading_path — để trích dẫn và để người dùng mở đúng chỗ.
- Phân loại: doc_type, language, department.
collection.query(
query_embeddings=[q_vec],
n_results=20,
where={"tenant_id": "acme", "doc_type": "policy", "effective_date": {"$gte": "2026-01-01"}},
)Hai lỗi hay gặp: lưu quá ít rồi phải reindex toàn bộ khi cần thêm filter (embedding không đổi nhưng vẫn phải chạy lại pipeline), và nhét cả nội dung dài vào metadata làm index nặng.
Metadata nên là trường ngắn, có kiểu rõ ràng, và các trường dùng để filter nên được đánh index theo hướng dẫn của từng vector DB.