Milvus는 클라우드 네이티브 오픈소스 벡터 데이터베이스다. 분산 아키텍처로 수십억 개의 벡터를 처리하며, Zilliz가 개발·관리한다. FAISS, HNSW, DiskANN 등 다양한 인덱스를 지원한다.
아키텍처 구성요소
| 컴포넌트 | 역할 |
|---|
| Proxy | 클라이언트 요청 라우팅 |
| Root Coord | 메타데이터 관리 |
| Query Node | 벡터 검색 실행 |
| Data Node | 데이터 삽입·삭제 |
| Index Node | 인덱스 빌드 |
| etcd | 메타데이터 저장 |
기본 사용법
python
from pymilvus import (
connections, FieldSchema, CollectionSchema, DataType, Collection
)
import numpy as np
connections.connect("default", host="localhost", port="19530")
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
]
schema = CollectionSchema(fields, description="문서 컬렉션")
collection = Collection("documents", schema)
index_params = {
"metric_type": "COSINE",
"index_type": "HNSW",
"params": {"M": 8, "efConstruction": 200},
}
collection.create_index("embedding", index_params)
data = [
["제목 1", "제목 2", "제목 3"],
np.random.random((3, 1536)).tolist(),
]
collection.insert(data)
collection.flush()
collection.load()
results = collection.search(
data=np.random.random((1, 1536)).tolist(),
anns_field="embedding",
param={"metric_type": "COSINE", "params": {"ef": 100}},
limit=5,
output_fields=["title"],
)
for hits in results:
for hit in hits:
print(f"ID: {hit.id}, Distance: {hit.distance:.4f}")
Milvus vs Qdrant 비교
| 항목 | Milvus | Qdrant |
|---|
| 확장성 | 수십억 벡터 | 수억 벡터 |
| 아키텍처 | 분산 (마이크로서비스) | 단일/분산 |
| 설정 복잡도 | 높음 | 낮음 |
| 관리형 서비스 | Zilliz Cloud | Qdrant Cloud |
관련 문서