상품 유사도 추천에 임베딩 기반 검색을 붙여보려고 vector DB 두 개를 비교 테스트. Milvus 2.0(작년 11월쯤 2.0 GA), Weaviate 1.10. 둘 다 처음 써봄. 솔직히 관련 지식 얕아서 사용기 수준.
데이터
상품 텍스트(이름+설명) 임베딩 300만 벡터, 차원 768(multilingual sentence embedding). query 당 top-10 ANN 검색.
설치
Milvus는 docker-compose로 minio+etcd+pulsar까지 같이 올라옴. 처음 보면 어질어질함.
wget https://github.com/milvus-io/milvus/releases/download/v2.0.0/milvus-standalone-docker-compose.yml
docker compose up -d
Weaviate는 훨씬 가볍.
services:
weaviate:
image: semitechnologies/weaviate:1.10.0
ports: ["8080:8080"]
environment:
QUERY_DEFAULTS_LIMIT: 25
DEFAULT_VECTORIZER_MODULE: 'none'
색인 구성
둘 다 HNSW 인덱스. 파라미터는 M=16, efConstruction=200로 맞췄다. 검색 시 ef는 64.
결과
| 항목 | Milvus 2.0 | Weaviate 1.10 |
|---|---|---|
| 인덱스 빌드 (3M) | 약 18분 | 약 32분 |
| p95 latency (top-10) | 22ms | 31ms |
| recall@10 | 0.94 | 0.93 |
| 메모리 | 약 12GB | 약 9GB |
| 운영 단순성 | 낮음(컴포넌트 많음) | 높음 |
| 메타데이터 필터 | OK | GraphQL 기반, 표현력 높음 |
개인적 인상
성능만 보면 Milvus가 미세하게 좋고 확장성도 강해 보인다. 그런데 운영할 컴포넌트가 많아서 처음 도입에 부담. Weaviate는 단일 바이너리 가까운 느낌이라 실험 단계엔 훨씬 편하다. GraphQL 쿼리 인터페이스는 익숙해지면 편리한데 팀 전체가 학습해야 됨.
결정: PoC 단계에서는 Weaviate로 간다. 트래픽 올라가면 Milvus 재검토. 어차피 벡터 자체는 재업로드만 하면 되니 락인은 작음.
공통 주의점
- 벡터 DB만 있다고 검색이 좋아지진 않는다. 임베딩 품질이 전부임. 다국어 문제 심각한 카테고리(전기용품 등)는 임베딩 모델 튜닝이 먼저.
- ANN 파라미터(ef, M) 따라 recall/latency 트레이드오프 큼. 실데이터로 튜닝 필수.
- vector index rebuild 시간 고려. 스키마 변경이 무겁다.
댓글 없음:
댓글 쓰기