DEVOTEE 요약최근 RAG(Relevant Augmented Generation)의 인기가 높아지면서 벡터 검색 기술에 대한 관심이 증가하고, 다양한 Vector Database들이 등장하고 있습니다. 이 중 Vespa, Milvus, Qdrant 세 가지 데이터베이스를 설치 용이성, 사용성 및 성능을 기준으로 비교했으며, 각 DB는 사용 목적에 따라 각각의 장점을 제공하고 있습니다. 프로젝트의 요구 사항과 환경에 따라 적절한 벡터 DB를 선택하는 것이 중요하며, 벡터 검색은 AI 생태계에서 필수 인프라로 자리 잡고 활용 범위가 확대될 것으로 예상됩니다.DEVOTEE 추천 블로그
0. 개요
요즘 RAG(Relevant Augmented Generation)가 트렌드로 자리 잡으면서, 이를 구현하기 위한 핵심 기술인 벡터 검색에 대한 관심도 높아지고 있습니다.
다양한 Vector Database 들이 등장하고 있는 가운데, 각각의 특징을 직접 비교해보며 더 깊이 있게 이해해보고, 실무에 활용할 Database 선택에 참고될 만한 내용들을 정리해 보고자 합니다.
Vector Search?
전통적인 키워드 기반 검색이 문자 단위의 단순 매칭에 집중했다면, 벡터 검색은 데이터의 의미론적 유사도를 기반으로 더욱 정확하고 직관적인 검색 결과를 제공합니다.
텍스트뿐 아니라 이미지·오디오·행동 패턴 등 다양한 형태의 비정형 데이터를 빠르게 분석하고 검색할 수 있어, AI 서비스의 질을 한 단계 높이는 기술로 평가받고 있습니다.
(https://encord.com/blog/vector-similarity-search/?utm_source=pytorchkr)
Vector Database 활용 분야
- 추천 시스템: 사용자·제품 정보를 벡터로 표현해 더욱 정교하게 개인화 추천을 제공
- 이미지 검색: CNN 임베딩 기반으로 시각적으로 유사한 이미지를 빠르게 조회
- NLP: 문장을 벡터로 변환함으로써 의미적으로 유사한 텍스트를 효과적으로 검색
- 하이브리드 검색: 키워드와 벡터 검색을 결합해 정확도 향상
1. 체험 대상 선정
최근 수많은 벡터 데이터베이스들이 등장하며 말 그대로 Vector Database 의 춘추전국시대가 열리고 있습니다. (https://objectbox.io/vector-database/)
이처럼 다양한 선택지가 존재하는 상황에서, 어떤 Vector Database 가 실제 프로덕션 환경에 적합할지 고민해 볼 필요가 있습니다.
이에 따라, 아래와 같은 기준을 바탕으로 비교 대상 Database 들을 우선 필터링했습니다:
- On-Prem 환경에서 직접 설치 및 운영이 가능할 것
- 오픈소스로 제공될 것
- 실사용 기반의 충분한 활용 사례가 있을 것
- 최소 10GB / 5천만 건 이상의 문서를 처리할 수 있을 것 (실제 검색/AI 서비스에 활용 가능한 수준)
결과적으로 아래 3가지 Database 를 선정했습니다.
- Vespa: 초저지연(Low Latency) 쿼리와 하이브리드 검색에 강점을 갖춘 솔루션
- Milvus: 대용량 분산 처리를 위한 클라우드 네이티브 아키텍처로 확장성 뛰어남
- Qdrant: 필터링 통합 검색과 가벼운 설치가 특징으로 빠른 테스트 환경 구성에 유리
2. 주요 비교 항목
주요 비교 항목으로는 다음 네 가지를 살펴보겠습니다.
- 설치 용이성: 특히 Kubernetes(K8s) 환경에서의 배포
- 사용성: 문서 색인(Indexing)과 쿼리(Searching) 방식
- 성능: 확장성과 처리량, 지연시간, 그리고 RAG(검색+생성) 같은 시나리오에서의 효율성
- 특정 용도: 각 DB가 실무에서 어떤 상황에 가장 적합한지
아래에서 단계별로 구체적으로 살펴봅니다.
3. Kubernetes 환경에서 설치 방법 비교
현재 팀 내에서는 이미 잘 구성된 Kubernetes 클러스터 환경을 운영 중이며, 충분한 여유 리소스를 확보하고 있습니다.
이를 활용해 각 벡터 데이터베이스를 직접 설치하고 테스트해볼 수 있는 기반을 마련했습니다. 3가지 Database 모두 Helm chart 를 통해 설치하였습니다.
세부 설정을 위해서는 각 github repository 에 포함된 values.yaml 파일을 수정하여야 합니다. 세세한 설정은 이번 포스팅에서는 제외하였습니다.
3.1 Vespa의 K8s 설치
- 특징: Vespa는 Config Server를 통해 노드 구성을 관리하며, 최대한의 고가용성을 위해 최소 3개의 Config Server Pod를 사용하는 것을 권장합니다.
- 설치 난이도: 소규모 테스트보다는 다소 무겁게 느껴질 수 있으나, 복잡한 네트워크 설정이 필요하거나 엔터프라이즈급 배포 환경을 구성해야 할 때 유리합니다.
# Vespa 설치 예시(간단 예시)
helm repo add vespa https://unoplat.github.io/vespa-helm-charts
helm repo update
helm install unoplat-vespa vespa/vespa
# NAME: unoplat-vespa
# LAST DEPLOYED:
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# NOTES:
# 1. Get the application URL by running these commands:
# NOTE: It may take a few minutes for the LoadBalancer IP to be available.
# You can watch the status of by running 'kubectl get --namespace default svc -w unoplat-vespa'
# export SERVICE_IP=$(kubectl get svc --namespace default unoplat-vespa --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
# echo http://$SERVICE_IP:
3.2 Qdrant의 K8s 설치
- 표준 배포: Helm Chart를 공식 제공하며, 단 몇 분 내에 클러스터 환경을 구성할 수 있습니다.
- 장점:
- NodePort나 포트 포워딩을 통해 빠르게 접근 가능
- 설치 난이도: 가장 가벼운 편에 속하며, 빠른 프로토타이핑과 실습에 최적화되어 있습니다.
# Qdrant 설치 예시
helm repo add qdrant https://qdrant.to/helm
helm install qdrant qdrant/qdrant
# NAME: qdrant
# LAST DEPLOYED:
# NAMESPACE: qdrant
# STATUS: deployed
# REVISION: 1
# NOTES:
# Qdrant v1.13.4 has been deployed successfully.
3.3 Milvus의 K8s 설치
- Operator 기반 배포: Milvus는 별도의 Milvus Operator를 통해 설치 및 관리가 이뤄집니다.
- 특징:
- cert-manager 등 추가 컴포넌트 필요
- CRD(Custom Resource Definition) 생성 등 엔터프라이즈적인 확장 기능 제공
- 설치 난이도: Qdrant보다는 복잡하지만, 향후 대규모 클러스터 확장이나 다양한 클라우드 환경 연동을 고려한다면 매력적인 선택입니다.
# Milvus Operator 설치 예시
helm repo add zilliztech https://zilliztech.github.io/milvus-helm/operator/main/deploy/manifests/deployment.yaml
wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml
helm upgrade my-release milvus/milvus -f values.yaml
# NAME: my-milvus
# LAST DEPLOYED:
# NAMESPACE: milvus
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
3.4 설치 용이성 비교결과 정리
항목VespaQdrantMilvus| 초기 설정 소요 시간 | 25분 이상 | 10분 이내 | 30분 이상 |
| 필수 부가 컴포넌트 | ConfigServer 등 | 없음 | cert-manager, CRDs |
| HA(고가용성) 구성 난이도 | ★★★★☆ | ★★☆☆☆ | ★★★☆☆ |
| 공식 Helm Chart | 미제공 | 제공 | Operator 방식 |
4. 사용성 비교
4.1 문서 색인(Indexing) 예시
4.1.1 Vespa 문서 색인
- 스키마 정의가 필수: .sd 파일을 통해 문서 구조와 벡터 필드를 명시
- Python 예시:
-
from vespa.application import Vespa app = Vespa(url="http://localhost:8080") response = app.feed_data_point( schema="doc", data_id="id:ns:doc::1", fields={ "id": 1, "title": "AI 기술 백서", "description": "머신러닝 모델 최적화 기법", "vector": [0.12, 0.45, ..., 0.78] # 768차원 } ) print(response.json) - 특징: 강타입(Strict) 스키마라 재배포 시 스키마 변경을 주의해야 합니다.
4.1.2 Qdrant 문서 색인
- 컬렉션(collection) 중심: 스키마 대신 컬렉션과 벡터 설정만 지정하면 됨
- Python 예시:
-
from qdrant_client import QdrantClient from qdrant_client.models import PointStruct client = QdrantClient("localhost", port=6333) client.recreate_collection( collection_name="docs", vectors_config={"size": 768, "distance": "Cosine"} ) points = [ PointStruct( id=1, vector=[0.12, 0.45, ..., 0.78], payload={ "title": "AI 기술 백서", "description": "머신러닝 모델 최적화 기법" } ) ] client.upsert(collection_name="docs", points=points) - 특징:
- 동적 스키마로 원하는 메타데이터(payload)를 자유롭게 추가 가능
- REST/ gRPC 모두 지원
4.1.3 Milvus 문서 색인
- 정형적인 방식으로 필드를 사전에 정의하고 인덱스를 만들어야 함
- Python 예시:
-
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection connections.connect("default", host="localhost", port="19530") fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=200), FieldSchema(name="description", dtype=DataType.VARCHAR, max_length=1000), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768) ] schema = CollectionSchema(fields, description="테스트 컬렉션") collection = Collection("docs", schema) index_params = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128} } collection.create_index("vector", index_params) data = [ [1], ["AI 기술 백서"], ["머신러닝 모델 최적화 기법"], [[0.12, 0.45, ..., 0.78]] ] collection.insert(data) - 특징: 인덱스 생성 과정이 명시적이며, 대규모 데이터에서는 별도의 compaction 처리가 권장됩니다.
4.1.4 색인 기능 사용성 비교
항목VespaQdrantMilvus| 스키마 유연성 | 강타입(Strict) | 반구조화(Semi-structured) | 강타입(Strict) |
| 초기 설정 단계 | 스키마/배포/검증 등 최소 3단계 | 컬렉션 생성 1단계로 간단 | 연결/스키마/인덱스/삽입 4단계 |
| 배치 처리 | 1,000 docs/req | 500 docs/req | 4,096 docs/req (PyMilvus 2.0+) |
| 오류 메시지 | 상세 검증 로그 제공 | HTTP 상태 코드 | trace_id 통해 추적 필요 |
| SDK 성숙도 | 공식 Python SDK | gRPC + Python 클라이언트 | PyMilvus 2.0+ (안정화) |
| HTTP API 활용 가능 여부 | API 제공 (설정 관리, 문서 작업) | API 및 gRPC 병행 지원 (OpenAPI 명세, API 키 인증) | RESTful API 제공 (토큰 기반 인증, 컬렉션 관리) |
Tip
- Qdrant: 가장 빠르게 시작 가능
- Milvus: 대량 삽입 및 확장에 유리
- Vespa: 하이브리드 검색, 엔터프라이즈급 스케일에 적합
4.2 쿼리(Query) 예시
4.2.1 Vespa: 하이브리드 검색
from vespa.application import Vespa
app = Vespa(url="http://localhost:8080")
result = app.query(
yql="select * from doc where ({targetHits:100}nearestNeighbor(vector,q_vector)) or userQuery()",
ranking="similarity",
body={
"input.query(q_vector)": [0.12, 0.45, ..., 0.78],
"query": "머신러닝 최적화",
"type": "any"
}
)
- 장점: 텍스트 검색 + 벡터 검색을 결합한 하이브리드 쿼리가 가능
- 추가 기능: rank-profile 설정에서 텍스트 점수와 벡터 점수를 어떻게 결합할지 세부 조정 가능
4.2.2 Qdrant: 메타데이터 필터링
from qdrant_client.models import Filter, FieldCondition
result = client.search(
collection_name="docs",
query_vector=[0.12, 0.45, ..., 0.78],
query_filter=Filter(
must=[
FieldCondition(key="category", match="AI/ML"),
FieldCondition(key="year", range={"gte": 2023})
]
),
limit=5
)
- 장점: AND/OR/NOT, Geo-filtering 등 정교한 조건을 벡터 검색과 함께 적용 가능
- 특히: Geo 위치 기반 검색, 특정 필드 값 범위 검색 등에 유리
4.2.3 Milvus: 일관성(Consistency) 수준 제어
search_params = {
"metric_type": "L2",
"params": {"nprobe": 64}
}
results = collection.search(
data=[[0.12, 0.45, ..., 0.78]],
anns_field="vector",
param=search_params,
limit=5,
consistency_level="Strong" # Bounded/Eventually 등
)
- 장점: consistency_level 옵션으로 트랜잭션 유사한 일관성 제어 가능
- 추가 기능: 특정 시점(Time Travel) 데이터 조회, GPU 인덱싱, 인덱스 동적 재구성 등
4.2.4 데이터 쿼리 기능 비교결과 정리
항목VespaQdrantMilvus| 검색 유형 | 하이브리드(텍스트+벡터) | 통합 필터링 + 벡터 검색 | 일관성 제어(ANN) |
| 점수 결합 | 텍스트 vs 벡터 비중 조절 가능 | 필터 후 벡터 점수 재순위 | 단일 벡터 메트릭(L2, IP 등) |
| 조건 연산 | AND/OR/NOT, GeoHash | must/should/must_not | 기본 비교 연산자 위주 |
| 지리 검색(Geo) | 지원(GeoHash) | 지원(반경/다각형) | 기본적으로 미지원 |
| 결과 반환 | 사용자 정의 필드 선택 | 전체 payload 혹은 부분 반환 | 특정 필드 마스킹 가능 |
| 연결 프로토콜 | HTTP/2 위주 | HTTP + gRPC 모두 지원 | gRPC 우선 |
5. 결론: 어떤 벡터 DB를 선택해야 할까?
5.1 프로젝트 규모/목적에 따른 추천
프로젝트 특성추천 솔루션선정 이유| 대규모 데이터(수십억 건) | Milvus | 분산 아키텍처, 클라우드 네이티브 확장성 우수 |
| 실시간 추천 시스템 | Vespa | 초저지연, 하이브리드 검색 및 빠른 업데이트 성능 |
| 복잡한 필터링이 필요한 검색 | Qdrant | 메타데이터 + 벡터 검색 통합, Geo·조건 필터 강력 |
| 스타트업/소규모 프로젝트 | Qdrant | 쉽고 빠른 설치, 짧은 학습 곡선 |
| 하이브리드 검색(텍스트+벡터) | Vespa | rank-profile 기반 텍스트+벡터 결합이 유연 |
| 클라우드 환경 연동 | Milvus | Operator 기반, 쿠버네티스 통합 기능 탁월 |
| 엣지 컴퓨팅 | Qdrant | 경량 구조로 리소스 절감 효과 |
| 커스터마이징이 필요한 엔터프라이즈 | Vespa | 세밀한 설정 및 고가용성 아키텍처를 직접 제어 가능 |
5.2 최종 선택 가이드라인
- 데이터 규모: 현재 볼륨과 미래 확장성을 고려해 Milvus(분산 처리)나 Vespa(고가용성)를 검토
- 성능 요구사항: 초저지연이 필수라면 Vespa, 범용 처리량이나 단순 구축이 중요하다면 Qdrant
- 리소스·역량: 엔지니어링 팀의 전문성과 운영 비용을 살펴본 뒤 결정
- 하이브리드 검색: 텍스트와 벡터 결합이 중요하다면 Vespa 쪽이 호환성이 높음
- 메타데이터 필터링: 복잡한 검색 조건이 필요하면 Qdrant
- 엔터프라이즈 고려: Milvus Operator를 통한 클라우드·K8s 연동, Vespa의 고가용성 구조
모든 상황에 완벽하게 들어맞는 ‘실버 불릿(Silver Bullet)’은 존재하지 않습니다.
각 프로젝트가 요구하는 기능적 요건과 인프라 환경에 따라, 소규모 PoC(개념 검증) 단계에서부터 성능, 확장성, 유지보수 측면을 꼼꼼히 비교해보는 것이 가장 현실적이고 효과적인 접근입니다.
Tip
- 배포 및 운영에 대한 리소스가 부족하다면 Qdrant
- 대규모 확장, GPU 활용에 초점을 둔다면 Milvus
- 하이브리드 검색, 초저지연 추천 서비스가 필요하다면 Vespa
마무리하며
본 포스팅에서는 Vespa, Milvus, Qdrant 세 벡터 DB의 장단점과 설치·사용성·성능 비교 포인트를 정리해보았습니다.
벡터 검색은 이미 AI 생태계에서 필수 인프라로 자리 잡았으며, 앞으로도 다양한 분야에서 더욱 광범위하게 활용될 것으로 보입니다.
각 솔루션은 데이터 규모, 서비스 특성, 팀의 기술 역량 등에 따라 저마다의 강점을 발휘할 수 있습니다.
초기 PoC 단계에서부터 체계적인 벤치마크와 모니터링이 병행된다면, 더 강력하고 확장성 있는 AI 서비스를 구현하는 데 큰 도움이 될 것입니다.
출처: https://devocean.sk.com/blog/techBoardDetail.do?ID=167359&boardType=techBlog
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| "find ~ -name "milvus.yaml" 2>/dev/null" 의미? (0) | 2026.08.05 |
|---|---|
| Docker Compose, K8s(쿠버네티스) (0) | 2026.08.04 |
| Eclipse에서도 Visual Studio Code(VSCode)처럼 IDE 내부에서 바로 사용할 수 있는 내장 터미널 기능 (0) | 2026.08.04 |
| Prisma (0) | 2026.07.31 |
| Claude에서 명령하고 대화한 내용을 저장 (0) | 2026.07.31 |