Milvus là cơ sở dữ liệu vector mã nguồn mở, hiệu suất cao, được thiết kế để lưu trữ, quản lý và tìm kiếm các bản nhúng (embedding) từ dữ liệu phi cấu trúc như văn bản, hình ảnh hoặc video.
Được xây dựng bằng Go và C++, Milvus là dự án thuộc LF AI & Data Foundation (Linux Foundation) do Zilliz phát triển, cho phép xử lý các truy vấn láng giềng gần đúng (ANN) ở quy mô hàng tỷ vector với độ trễ mức mili giây (millisecond).
Milvus đóng vai trò hạ tầng cốt lõi trong các ứng dụng AI hiện đại, đặc biệt là Retrieval-Augmented Generation (RAG).
Bằng cách chuyển đổi dữ liệu phi cấu trúc thành các vector số học nhờ các mô hình học máy (Machine Learning), Milvus giúp bạn tìm kiếm theo độ tương đồng thay vì dựa trên từ khoá thuần tuý, giải quyết bài toán truy xuất thông tin từ những kho dữ liệu khổng lồ.

Milvus là gì?
Milvus bắt đầu được phát triển từ năm 2017 bởi Zilliz, gia nhập Linux Foundation vào tháng 1/2020 và chính thức tốt nghiệp (graduate) vào tháng 6/2021. Cộng đồng Milvus quy tụ đóng góp kỹ thuật từ các chuyên gia tại Zilliz, Intel, NVIDIA, Microsoft, IBM và ARM, tập trung vào việc tối ưu hoá mã nguồn cho nhiều loại hạ tầng phần cứng khác nhau.
Về nguyên lý, Milvus tổ chức dữ liệu theo cơ chế lưu trữ dạng cột (column-oriented). Dữ liệu phi cấu trúc được lưu trong các "collection", gồm các trường vector và trường vô hướng (scalar). Cách lưu trữ này cho phép hệ thống chỉ đọc đúng những trường cần thiết trong một truy vấn, nhờ đó giảm đáng kể tài nguyên I/O và tăng tốc xử lý ở quy mô lớn.
Hơn 80% hiệu năng của một cơ sở dữ liệu vector nằm ở công cụ tìm kiếm, và Milvus viết phần cốt lõi này bằng C++ để kiểm soát tài nguyên ở mức thấp. Công cụ đó khai thác trực tiếp phần cứng qua tập lệnh AVX512, SIMD và các kiến trúc GPU (điển hình là thuật toán CAGRA của NVIDIA). Hệ thống dùng các thuật toán tìm kiếm láng giềng gần đúng (ANN) như HNSW hay IVF để thay cho tìm kiếm vét cạn (brute-force), giữ thông lượng (throughput) cao ngay cả khi dữ liệu phình to.
Milvus hỗ trợ linh hoạt nhiều kiểu dữ liệu: vector dày (dense), vector thưa (sparse) và vector nhị phân. Bạn cũng có thể lưu kèm dữ liệu vô hướng như JSON, mảng (Array), số nguyên (Int) hoặc chuỗi (Varchar) để lọc kết hợp trong cùng một truy vấn.
Khởi tạo một collection qua MilvusClient:
from pymilvus import MilvusClient
# Khởi tạo kết nối tới Milvus server
client = MilvusClient(uri="http://localhost:19530")
# Tạo collection với vector 768 chiều
client.create_collection(
collection_name="knowledge_base",
dimension=768,
metric_type="COSINE" # Sử dụng khoảng cách Cosine
)Kiến trúc bốn lớp của Milvus
Milvus xây dựng trên kiến trúc cloud-native, tách rời hoàn toàn lưu trữ khỏi tính toán (storage-compute disaggregation), cho phép bạn mở rộng độc lập từng thành phần theo nhu cầu thực tế.

- Lớp Truy cập (Access Layer): Gồm các Proxy không trạng thái (stateless). Đây là điểm đầu cuối nhận yêu cầu từ SDK/RESTful, xác thực và điều hướng truy vấn. Nhờ kiến trúc xử lý song song quy mô lớn (Massively Parallel Processing — MPP), Proxy tổng hợp và hậu xử lý các kết quả trung gian từ nhiều node trước khi trả về cho bạn.
- Bộ điều phối (Coordinator): Quản trị cluster. Chỉ một Coordinator hoạt động tại mỗi thời điểm để quản lý topology hệ thống, lập lịch tác vụ và duy trì tính nhất quán. Các tác vụ chính gồm quản lý DDL/DCL (tạo/xoá collection), quản lý dịch vụ streaming và phân phối nhiệm vụ xây dựng chỉ mục cho lớp thực thi.
- Các node thực thi (Worker Nodes): Các node không trạng thái đảm nhận những tác vụ thâm dụng
tài nguyên:
- Streaming Node: Đảm bảo tính nhất quán cấp shard cho dữ liệu đang đổ vào (growing data) và xử lý ghi vào WAL (nhật ký ghi trước).
- Query Node: Tải dữ liệu lịch sử từ object storage để phục vụ truy vấn. Bạn có thể tăng số lượng Query Node để nâng năng lực đọc mà không ảnh hưởng đến các node khác.
- Data Node: Thực hiện các tác vụ offline như đóng gói dữ liệu (compaction) và xây dựng chỉ mục.
- Lớp Lưu trữ (Storage): Gồm Meta storage (etcd) lưu metadata, Object storage (S3, MinIO, Azure Blob) lưu file dữ liệu và chỉ mục, cùng Log broker. Milvus hiện dùng Woodpecker làm hệ thống WAL (Write-Ahead Log) không ổ đĩa (zero-disk), ghi thẳng vào object storage để giảm gánh nặng vận hành đĩa cục bộ.
Milvus đánh chỉ mục vector như thế nào?
Một chỉ mục trong Milvus gồm ba thành phần: cấu trúc dữ liệu (Data structure), định lượng (Quantization) và bộ lọc tinh (Refiner). Quá trình định lượng nén dữ liệu nhưng gây sai số (lossy). Đó là lý do Refiner quan trọng: sau khi tìm được top-K ứng viên từ dữ liệu nén, Refiner truy cập dữ liệu gốc hoặc dữ liệu độ chính xác cao (FP32) để tính lại khoảng cách, nhờ đó giữ tỷ lệ thu hồi (recall) ở mức chính xác nhất.

Về thuật toán, bạn thường chọn giữa IVF và HNSW. IVF (Inverted File) phân cụm vector vào các bucket quanh tâm cụm, hợp với kịch bản cần thông lượng lớn và dữ liệu có thể nằm trên đĩa. HNSW (Hierarchical Navigable Small World) xây đồ thị phân lớp giữa các láng giềng gần nhất, cho độ trễ thấp nhất nhưng ngốn RAM hơn hẳn.
Cơ chế nén SQ8 chuyển float32 sang 8-bit và giảm 75% bộ nhớ, còn PQ (Product Quantization) chia nhỏ vector thành các sub-vector để đạt tỷ lệ nén từ 4 đến 32 lần.
Ước tính bộ nhớ cho 1 triệu vector 128 chiều:
- HNSW: cần RAM cho cấu trúc đồ thị (số liên kết × 4 byte mỗi ID) cộng với dữ liệu vector thô.
- IVF: cần RAM cho các tâm cụm (centroid), danh sách ID gán cho cụm và dữ liệu đã nén.
| Loại chỉ mục | Dung lượng RAM (ước tính) | Hiệu suất (QPS) | Recall |
|---|---|---|---|
| FLAT | ~512 MB (thô) | Thấp | 100% |
| IVF-PQ | ~11 MB (nén cao) | Cao | Trung bình — Cao |
| HNSW | ~640 MB (đồ thị + thô) | Rất cao | Rất cao |
| DiskANN | Thấp (chủ yếu trên SSD) | Trung bình | Cao |
Ba chế độ triển khai: Lite, Standalone và Distributed
Quy mô dữ liệu quyết định chế độ triển khai bạn nên chọn:
- Milvus Lite: Thư viện Python cài qua
pip install -U pymilvus[milvus-lite]. Nó chạy thẳng trong ứng dụng hoặc notebook và lưu dữ liệu vào file cục bộ. Hợp cho prototype hoặc thiết bị biên (edge) ở quy mô vài triệu vector đổ lại. - Milvus Standalone: Triển khai qua Docker image trên một máy chủ duy nhất. Mọi thành phần được đóng gói gọn, dùng Woodpecker nhúng. Chế độ này hỗ trợ tới 100 triệu vector, hợp cho môi trường sản xuất quy mô vừa và ít tốn công vận hành.
- Milvus Distributed: Triển khai trên Kubernetes (K8s). Đây là kiến trúc đầy đủ nhất, hỗ trợ từ 100 triệu đến hàng chục tỷ vector, cung cấp tính sẵn sàng cao (High Availability — HA) và khả năng mở rộng độc lập cho từng loại node.

Lệnh cài bản Lite để bắt đầu nhanh:
pip install -U pymilvus[milvus-lite]Milvus 3.0 thay đổi những gì?
Milvus 3.0 giới thiệu kiến trúc "lake-native", cho phép hệ thống làm việc trực tiếp trên các kho dữ liệu lớn:
- Kiến trúc lake-native: Tính năng External Collection cho phép truy vấn thẳng dữ liệu nằm trên object storage (định dạng Parquet, Iceberg, Lance, Vortex) mà không cần sao chép, xoá bỏ các pipeline ETL phức tạp.
- Loon (Storage v3): Công cụ lưu trữ cột mới dùng định dạng Vortex (tương thích Arrow). Trong một benchmark nội bộ trên S3 với 3 triệu bản ghi vector 128 chiều và 256 luồng đọc đồng thời, I/O cho mỗi lần đọc điểm (point read) giảm từ khoảng 9,4 MB (Parquet) xuống 0,07 MB — thấp hơn chừng 135 lần.
- Tính năng tìm kiếm: Đưa sắp xếp (ORDER BY), tập hợp (Aggregation) và tìm kiếm theo nhóm (faceted search) thẳng vào engine, giảm tải hậu xử lý cho tầng ứng dụng.
- StructArray và SINDI: StructArray hỗ trợ các thực thể phức tạp như nhiều vector trong một hàng (ColBERT). Thuật toán SINDI sắp xếp các posting vào những "compact window" thân thiện với SIMD, đạt thông lượng gấp khoảng 5–10 lần MaxScore trên vector thưa học được.

Milvus so với Pinecone, Qdrant và Weaviate
Milvus nhắm vào những hệ thống cần quy mô cực lớn và tối ưu hoá phần cứng sâu.

- Hiệu suất: Qua benchmark thực tế, Milvus khi có GPU đạt độ trễ p50 khoảng 6ms, nhanh hơn hẳn Pinecone Serverless (20–30ms). Qdrant tự vận hành giữ mức p50 thấp nhất, khoảng 4ms.
- Khả năng lọc: Qdrant áp bộ lọc payload ngay khi duyệt đồ thị, còn Milvus dùng scalar index tách biệt phối hợp với kiến trúc MPP, xử lý hiệu quả các phép lọc phức tạp trên hàng tỷ bản ghi.
- Chi phí: Milvus và Qdrant có lợi thế kinh tế khi tự vận hành ở quy mô trên 100 triệu vector. Pinecone hợp hơn với các đội ưu tiên zero-ops và dữ liệu quy mô nhỏ.
Tóm gọn cách chọn:
- Chọn Pinecone: khi cần dựng nhanh, dữ liệu nhỏ, chấp nhận chi phí managed service cao.
- Chọn Qdrant: khi cần hệ thống gọn nhẹ (viết bằng Rust) và lọc payload linh hoạt.
- Chọn Weaviate: khi cần module vector hoá tích hợp sẵn và tìm kiếm đa phương thức.
- Chọn Milvus: khi dữ liệu ở mức hàng tỷ vector, cần tối ưu GPU/SIMD hoặc chạy trên Kubernetes.
Khi nào nên chọn Milvus?
Chọn Milvus khi bạn cần chủ động hoàn toàn về hạ tầng (on-premise hoặc private cloud) và xử lý dữ liệu từ hàng trăm triệu vector trở lên. Nhờ tách rời lưu trữ khỏi tính toán và hỗ trợ tăng tốc phần cứng, hệ thống giữ được hiệu suất ổn định dưới tải cao.
Bạn có thể bắt đầu bằng Milvus Lite để làm prototype, rồi chuyển sang Standalone hoặc Distributed mà không phải viết lại logic, vì cả ba chế độ dùng chung một bộ SDK. Còn nếu bài toán của bạn chỉ có vài nghìn vector trong một script đơn giản, Milvus là con dao mổ trâu.
Tài liệu tham khảo
- What is Milvus — Milvus Documentation
- Milvus Architecture Overview — Milvus Documentation
- Index Explained — Milvus Documentation
- Overview of Milvus Deployment Options — Milvus Documentation
- Milvus 3.0: Lake-Native Vector Search & Retrieval Engine — Milvus Blog
- milvus-io/milvus — GitHub
- Milvus (vector database) — Wikipedia
- Pinecone vs Weaviate vs Milvus vs Qdrant: Which Vector DB in 2026? — DEV Community