Chọn vector database cho dự án vừa và nhỏ: pgvector, Qdrant, Chroma hay Milvus?
Làm RAG thì sớm muộn cũng phải chọn chỗ lưu embedding. Mình đã dùng cả 4 lựa chọn phổ biến ở các dự án khác nhau, chia sẻ để mọi người đỡ băn khoăn. Tóm tắt trước: với phần lớn dự án vừa và nhỏ (dưới vài triệu vector), lựa chọn nào cũng chạy được, quan trọng là hợp với hạ tầng và đội ngũ bạn đang có. 1. PGVECTOR (TIỆN ÍCH MỞ RỘNG CỦA POSTGRESQL) Ưu điểm: - Nếu đã dùng Postgres thì không cần thêm hệ thống mới, sao lưu, phân quyền, giám sát dùng chung. - Kết hợp được truy vấn vector với điều kiện SQL thông thường (lọc theo phòng ban, ngày tạo, quyền truy cập) và JOIN với dữ liệu nghiệp vụ. - Hỗ trợ chỉ mục HNSW và IVFFlat. Nhược điểm: - Ở quy mô rất lớn, hiệu năng và tinh chỉnh không bằng hệ thống chuyên dụng. - Lọc kết hợp với tìm vector đôi khi cho kết quả thiếu nếu không cấu hình kỹ. Phù hợp: đã có Postgres, dữ liệu dưới vài triệu vector. Đây là lựa chọn mặc định của mình. 2. QDRANT Ưu điểm: - Hệ thống chuyên cho vector, viết bằng Rust, nhanh và ổn định. - Lọc theo thuộc tính (payload) rất mạnh, hợp với bài toán phân quyền tài liệu. - Chạy bằng Docker rất gọn, có bản cloud. Nhược điểm: - Thêm một hệ thống phải vận hành, sao lưu riêng. Phù hợp: cần hiệu năng tốt và lọc phức tạp, sẵn sàng vận hành thêm dịch vụ. 3. CHROMA Ưu điểm: - Cực kỳ dễ bắt đầu: cài thư viện Python là chạy, có thể lưu ngay trong thư mục dự án. - Rất hợp để làm prototype, demo, notebook. Nhược điểm: - Mình chưa yên tâm dùng cho production nhiều người dùng đồng thời. Phù hợp: học tập, thử nghiệm, công cụ cá nhân. 4. MILVUS Ưu điểm: - Thiết kế cho quy mô rất lớn (hàng trăm triệu vector trở lên), chạy phân tán. - Nhiều loại chỉ mục, kể cả chạy trên GPU. Nhược điểm: - Vận hành phức tạp nhất trong 4 lựa chọn, bản phân tán cần nhiều thành phần đi kèm. Phù hợp: quy mô lớn, có đội vận hành. NHỮNG ĐIỀU QUAN TRỌNG HƠN VIỆC CHỌN DATABASE - Chất lượng chia đoạn và model embedding ảnh hưởng tới kết quả nhiều hơn nhiều so với loại database. - Tìm kiếm kết hợp (từ khoá + vector) gần như luôn tốt hơn chỉ dùng vector, nhất là với tiếng Việt có tên riêng, mã số. Postgres có sẵn tìm kiếm toàn văn, Qdrant và Milvus cũng hỗ trợ vector thưa (sparse). - Phân quyền tài liệu: lưu thông tin quyền cùng vector và lọc ngay khi tìm, đừng tìm xong mới lọc. - Khi đổi model embedding phải tạo lại toàn bộ vector, nên lưu kèm tên model và phiên bản. GỢI Ý NHANH - Đã có Postgres: dùng pgvector. - Chưa có gì, cần production: Qdrant. - Làm demo, học tập: Chroma. - Quy mô cực lớn: Milvus. Mọi người đang dùng cái nào? Có ai từng phải chuyển từ database này sang database khác không, lý do là gì?