벡터 데이터베이스 입문: Pinecone, Weaviate, ChromaDB 비교
벡터 DB가 뭔지, 왜 필요한지, 주요 제품 비교와 선택 기준을 정리했다.
RAG(Retrieval-Augmented Generation)가 AI 애플리케이션의 핵심 패턴이 되면서, 벡터 데이터베이스에 대한 관심도 같이 올라갔다. "LLM한테 내 데이터를 기반으로 답변하게 하고 싶다"면, 벡터 DB를 거의 반드시 만나게 된다.
근데 막상 찾아보면 제품이 너무 많다. Pinecone, Weaviate, ChromaDB, Milvus, Qdrant, pgvector... 뭐가 다르고 뭘 써야 하는지 헷갈린다.
벡터 임베딩부터 이해하자
벡터 DB를 이해하려면 먼저 "임베딩(embedding)"을 알아야 한다.
텍스트, 이미지, 오디오 같은 비정형 데이터를 수백~수천 차원의 숫자 배열(벡터)로 변환한 것이 임베딩이다. "고양이"라는 단어를 [0.12, -0.34, 0.56, ...] 같은 숫자 배열로 바꾸는 건데, 이 변환 과정에서 의미가 보존된다. 비슷한 의미의 단어는 벡터 공간에서 가까이 위치하고, 다른 의미의 단어는 멀리 위치한다.
"고양이"와 "강아지"의 벡터 거리는 가깝고, "고양이"와 "자동차"의 거리는 멀다. 이 성질을 이용하면 "유사한 문서 찾기", "비슷한 이미지 검색", "의미적으로 관련된 질문-답변 매칭" 같은 걸 할 수 있다.
임베딩은 OpenAI의 text-embedding-3, Cohere의 Embed, 오픈소스 모델(sentence-transformers) 등으로 생성한다. 벡터 DB는 이렇게 생성된 임베딩을 저장하고 검색하는 전문 저장소다.
왜 일반 DB로는 안 되나
PostgreSQL에 벡터를 ARRAY로 저장하고, 코사인 유사도를 계산하는 쿼리를 날리면 되지 않을까? 작은 데이터셋에서는 된다. 근데 규모가 커지면 문제가 생긴다.
정확한 유사도 검색(brute-force)은 모든 벡터와 비교해야 하니까 O(n)이다. 벡터가 100만 개면 매 쿼리마다 100만 번 비교해야 한다. 1000차원 벡터면 비교 한 번에 1000번의 곱셈과 덧셈. 이건 느리다.
벡터 DB는 ANN(Approximate Nearest Neighbor) 알고리즘을 써서 이 문제를 해결한다. 정확도를 약간 희생하는 대신(99%+ 정확도), 검색 속도를 수백~수천 배 빠르게 만든다.
주요 ANN 알고리즘
HNSW (Hierarchical Navigable Small World) — 가장 널리 쓰이는 알고리즘. 그래프 구조를 만들어서 유사한 벡터끼리 연결하고, 계층적으로 탐색한다. 검색 속도와 정확도의 균형이 좋다. 대부분의 벡터 DB가 기본으로 지원한다. 메모리를 좀 먹지만 그만큼 빠르다.
IVF (Inverted File Index) — 벡터를 클러스터로 나누고, 쿼리 벡터와 가까운 클러스터만 검색한다. HNSW보다 메모리 효율이 좋지만 정확도가 약간 낮을 수 있다. 대규모 데이터셋에서 메모리가 제한적일 때 유용하다.
PQ (Product Quantization) — 벡터를 압축해서 메모리 사용량을 줄이는 기법. 단독으로 쓰기보다 IVF와 결합(IVFPQ)해서 사용하는 경우가 많다. 정확도가 떨어지지만 수십억 개의 벡터를 다뤄야 할 때 현실적인 선택지다.
주요 벡터 DB 비교
Pinecone
완전 관리형(fully managed) 서비스. 서버를 직접 운영할 필요가 없다. API만 호출하면 된다.
특징:
- 인프라 관리 불필요 — 스케일링, 백업, 모니터링을 Pinecone이 알아서 한다
- Serverless 옵션 — 사용한 만큼만 과금. 소규모 프로젝트에 적합
- 메타데이터 필터링 — 벡터 검색과 동시에 조건 필터링 가능
- 네임스페이스로 데이터 분리
가격: 무료 티어가 있지만 제한적이다(인덱스 5개, 차원 제한). 프로덕션 용도면 월 $70부터 시작하고, 규모에 따라 올라간다.
적합한 경우: 인프라 관리를 하고 싶지 않은 팀, 빠르게 프로토타입을 만들고 싶을 때, 서버리스 아키텍처에 맞출 때.
Weaviate
오픈소스지만 클라우드 서비스도 있다. 벡터 검색과 키워드 검색을 결합한 하이브리드 검색이 강점이다.
특징:
- 하이브리드 검색 — BM25(키워드) + 벡터 검색을 함께 쓸 수 있다. 정확도가 올라간다
- 모듈 시스템 — OpenAI, Cohere, Hugging Face 등의 임베딩 모듈을 플러그인으로 연결. 별도의 임베딩 파이프라인 없이 텍스트를 넣으면 자동으로 벡터화
- GraphQL API
- 멀티모달 — 텍스트뿐 아니라 이미지 벡터도 저장·검색 가능
가격: 셀프호스팅하면 무료(오픈소스). 클라우드는 Sandbox(무료)부터 시작, 프로덕션은 사용량 기반 과금.
적합한 경우: 키워드 + 벡터 하이브리드 검색이 필요할 때, 멀티모달 데이터를 다룰 때, 셀프호스팅을 원할 때.
ChromaDB
가볍고 심플한 오픈소스 벡터 DB. 로컬 개발과 프로토타이핑에 최적화되어 있다.
특징:
- 설치가 정말 간단하다.
pip install chromadb한 줄이면 끝 - Python 네이티브 — LangChain, LlamaIndex와의 통합이 매끄럽다
- 인메모리 또는 영구 저장소 선택 가능
- 임베딩 함수를 내장하고 있어서 별도의 임베딩 서비스 없이 사용 가능
import chromadb
client = chromadb.Client()
collection = client.create_collection("my_docs")
collection.add(
documents=["고양이는 귀엽다", "강아지는 충성스럽다", "자동차가 고장났다"],
ids=["doc1", "doc2", "doc3"]
)
results = collection.query(
query_texts=["반려동물"],
n_results=2
)
# → "고양이는 귀엽다", "강아지는 충성스럽다"
가격: 오픈소스, 무료. 클라우드 서비스는 아직 초기 단계.
적합한 경우: 로컬 개발, 프로토타입, 소규모 프로젝트, 학습 목적. 대규모 프로덕션에는 아직 부족한 면이 있다.
Milvus
CNCF 졸업 프로젝트(인큐베이팅 완료). 대규모 환경에 강한 오픈소스 벡터 DB다.
특징:
- 수십억 개의 벡터를 다룰 수 있는 확장성
- GPU 가속 검색 지원
- 분산 아키텍처 — 스토리지와 컴퓨팅 분리
- 다양한 인덱스 타입 지원 (HNSW, IVF, DiskANN 등)
- Zilliz Cloud라는 관리형 서비스도 있다
적합한 경우: 대규모 데이터셋(수억~수십억 벡터), 높은 처리량이 필요한 프로덕션 환경. 소규모에서는 오버스펙.
Qdrant
Rust로 작성된 오픈소스 벡터 DB. 성능과 기능의 균형이 좋다.
특징:
- Rust 기반이라 메모리 효율과 성능이 우수
- 풍부한 필터링 — 중첩 조건, 지리적 필터링 등
- 페이로드(메타데이터) 인덱싱이 잘 되어 있어서 필터링 성능이 좋다
- gRPC와 REST API 모두 지원
- 클라우드 서비스도 있음
적합한 경우: 복잡한 필터링이 필요할 때, 성능을 중시하는 프로덕션 환경, 셀프호스팅을 원할 때.
비교 요약
| 항목 | Pinecone | Weaviate | ChromaDB | Milvus | Qdrant |
|---|---|---|---|---|---|
| 타입 | 관리형 | 오픈소스+클라우드 | 오픈소스 | 오픈소스+클라우드 | 오픈소스+클라우드 |
| 셀프호스팅 | 불가 | 가능 | 가능 | 가능 | 가능 |
| 학습 곡선 | 낮음 | 중간 | 매우 낮음 | 높음 | 중간 |
| 확장성 | 높음 | 중~높음 | 낮음 | 매우 높음 | 높음 |
| 하이브리드 검색 | 제한적 | 강점 | 기본 | 지원 | 지원 |
| 프로덕션 준비도 | 높음 | 높음 | 중간 | 높음 | 높음 |
pgvector — 이미 PostgreSQL을 쓰고 있다면
별도의 벡터 DB를 운영하고 싶지 않으면 pgvector를 고려할 만하다. PostgreSQL 확장으로, 기존 PostgreSQL에 벡터 검색 기능을 추가한다.
-- pgvector 확장 설치
CREATE EXTENSION vector;
-- 벡터 컬럼이 있는 테이블 생성
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);
-- HNSW 인덱스 생성
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);
-- 유사도 검색
SELECT content, embedding <=> '[0.1, 0.2, ...]' AS distance
FROM documents
ORDER BY distance
LIMIT 5;
장점:
- 이미 PostgreSQL을 쓰고 있으면 인프라 추가 없이 사용 가능
- SQL로 벡터 검색 + 관계형 쿼리를 조합할 수 있다
- 트랜잭션, 백업, 복제 등 PostgreSQL의 기능을 그대로 활용
- Supabase, Neon 같은 서버리스 PostgreSQL에서도 지원
단점:
- 전용 벡터 DB 대비 검색 성능이 떨어진다 (특히 대규모에서)
- 벡터 관련 기능(필터링, 하이브리드 검색)이 상대적으로 제한적
- 수백만 개 이상의 벡터에서는 성능 저하가 체감될 수 있다
벡터가 100만 개 이하이고, 이미 PostgreSQL을 메인 DB로 쓰고 있다면 pgvector가 가장 현실적인 선택일 수 있다. 아키텍처를 단순하게 유지할 수 있다는 게 큰 장점이다.
선택 기준 정리
프로토타입 / 학습 → ChromaDB. 설치 간편하고, Python에서 바로 쓸 수 있고, 무료. LangChain 튜토리얼 대부분이 ChromaDB를 기본으로 쓴다.
소규모 프로덕션 (벡터 100만 이하) → 이미 PostgreSQL을 쓰고 있으면 pgvector, 아니면 Qdrant나 Weaviate 셀프호스팅, 또는 Pinecone Serverless.
중~대규모 프로덕션 → 인프라 관리를 원하지 않으면 Pinecone이나 Weaviate Cloud. 셀프호스팅에 자신 있으면 Qdrant나 Milvus. 하이브리드 검색이 중요하면 Weaviate.
수십억 규모 → Milvus. 이 규모에서 검증된 오픈소스 선택지가 별로 없다.
한 가지 주의할 점은, 벡터 DB의 성능은 데이터셋과 쿼리 패턴에 따라 크게 달라진다는 것이다. 벤치마크 결과만 보고 결정하기보다, 실제 데이터로 테스트해보는 게 중요하다. 대부분의 벡터 DB가 무료 티어나 오픈소스를 제공하니까, 후보를 2~3개로 줄이고 직접 비교해보는 걸 권한다.
벡터 DB는 아직 빠르게 진화하는 분야라서, 6개월 전의 비교가 지금은 맞지 않을 수도 있다. 각 제품의 최신 릴리즈 노트를 확인하면서 선택하는 게 좋다.