벡터 데이터베이스 비교 — Chroma, Pinecone, Weaviate, pgvector

벡터 데이터베이스가 필요한 이유

벡터 데이터베이스는 텍스트, 이미지 등을 수치 벡터(임베딩)로 변환하여 저장하고, 의미적 유사도 기반으로 검색하는 특수 데이터베이스입니다. 도서관에서 키워드가 아닌 내용의 의미로 책을 찾는 것과 같습니다.

RAG(검색 증강 생성) 파이프라인에서 벡터 DB는 핵심 인프라입니다. 문서를 임베딩으로 저장하고, 사용자 질문과 유사한 문서를 빠르게 검색하여 LLM에 컨텍스트로 전달합니다.

주요 벡터 DB 한눈에 비교

항목ChromaPineconeWeaviatepgvector
유형오픈소스관리형 SaaS오픈소스 + 클라우드PostgreSQL 확장
언어Python- (API 기반)GoC (PG 확장)
호스팅로컬/셀프클라우드 전용로컬/클라우드기존 PG에 추가
인덱스 알고리즘HNSW독자적HNSW, FlatIVFFlat, HNSW
메타데이터 필터링지원지원지원 (GraphQL)SQL WHERE 절
최대 벡터 차원제한 없음20,00065,5352,000
무료 티어완전 무료1개 인덱스셀프호스트 무료무료 (PG 확장)

Chroma: 로컬 개발의 최고 선택

Chroma는 가장 쉽게 시작할 수 있는 벡터 DB입니다. 설치가 간단하고 Python 생태계와 자연스럽게 통합됩니다.

# pip install chromadb
import chromadb

# 영구 저장소로 클라이언트 생성
client = chromadb.PersistentClient(path="./chroma_db")

# 컬렉션 생성 (테이블과 유사한 개념)
collection = client.get_or_create_collection(
    name="documents",
    metadata={"hnsw:space": "cosine"}  # 코사인 유사도 사용
)

# 문서 추가 (임베딩은 자동 생성)
collection.add(
    documents=[
        "Python은 데이터 분석에 널리 사용되는 언어입니다.",
        "JavaScript는 웹 프론트엔드 개발의 표준입니다.",
        "Rust는 메모리 안전성을 보장하는 시스템 언어입니다."
    ],
    ids=["doc1", "doc2", "doc3"],
    metadatas=[
        {"category": "data"},
        {"category": "web"},
        {"category": "system"}
    ]
)

# 유사도 검색
results = collection.query(
    query_texts=["데이터 분석에 좋은 프로그래밍 언어"],
    n_results=2,  # 상위 2개 결과
    where={"category": "data"}  # 메타데이터 필터링
)
print(results["documents"])
# 출력: [['Python은 데이터 분석에 널리 사용되는 언어입니다.']]

Chroma 장단점:

  • 장점: 설치 즉시 사용 가능, 내장 임베딩 모델, LangChain/LlamaIndex 통합 우수
  • 단점: 대규모 운영 환경에서의 성능 검증 부족, 분산 처리 미지원

Pinecone: 관리형 서비스의 편리함

Pinecone은 인프라 관리 없이 벡터 검색을 제공하는 완전 관리형 서비스입니다. 스케일링, 백업, 모니터링을 자동으로 처리합니다.

# pip install pinecone
from pinecone import Pinecone, ServerlessSpec

# 클라이언트 초기화
pc = Pinecone(api_key="your-api-key")

# 인덱스 생성 (서버리스 모드)
pc.create_index(
    name="my-documents",
    dimension=1536,           # OpenAI 임베딩 차원
    metric="cosine",
    spec=ServerlessSpec(
        cloud="aws",
        region="us-east-1"
    )
)

index = pc.Index("my-documents")

# 벡터 업서트 (임베딩은 별도 생성 필요)
index.upsert(
    vectors=[
        {
            "id": "doc1",
            "values": [0.1, 0.2, ...],   # 1536차원 임베딩 벡터
            "metadata": {"category": "ai", "source": "blog"}
        },
        {
            "id": "doc2",
            "values": [0.3, 0.4, ...],
            "metadata": {"category": "web", "source": "docs"}
        }
    ],
    namespace="articles"     # 네임스페이스로 데이터 분리
)

# 유사도 검색
results = index.query(
    vector=[0.1, 0.2, ...],  # 쿼리 임베딩 벡터
    top_k=5,
    include_metadata=True,
    filter={"category": {"$eq": "ai"}}  # 메타데이터 필터
)

for match in results["matches"]:
    print(f"ID: {match['id']}, 유사도: {match['score']:.4f}")
# 출력: ID: doc1, 유사도: 0.9521

Pinecone 장단점:

  • 장점: 인프라 관리 불필요, 자동 스케일링, 높은 가용성
  • 단점: 벤더 종속, 데이터가 외부에 저장, 비용이 사용량에 비례

Weaviate: 하이브리드 검색의 강자

Weaviate는 벡터 검색과 키워드 검색을 결합한 하이브리드 검색을 기본 지원합니다. GraphQL API를 제공하여 복잡한 쿼리가 가능합니다.

# pip install weaviate-client
import weaviate
import weaviate.classes as wvc

# 로컬 Weaviate 연결 (Docker로 실행)
client = weaviate.connect_to_local()

# 컬렉션 생성
articles = client.collections.create(
    name="Article",
    vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
    properties=[
        wvc.config.Property(name="title", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT),
        wvc.config.Property(name="category", data_type=wvc.config.DataType.TEXT),
    ]
)

# 데이터 삽입 (벡터화 자동 처리)
articles.data.insert_many([
    {"title": "RAG 가이드", "content": "RAG는 검색 증강 생성입니다.", "category": "ai"},
    {"title": "Docker 입문", "content": "Docker는 컨테이너 기술입니다.", "category": "devops"},
])

# 하이브리드 검색 (벡터 + 키워드 결합)
response = articles.query.hybrid(
    query="AI 검색 기술",
    alpha=0.7,          # 0=키워드 전용, 1=벡터 전용, 0.7=벡터 가중
    limit=3,
    return_metadata=wvc.query.MetadataQuery(score=True)
)

for obj in response.objects:
    print(f"{obj.properties['title']} (점수: {obj.metadata.score:.4f})")
# 출력: RAG 가이드 (점수: 0.8934)

client.close()

Weaviate 장단점:

  • 장점: 하이브리드 검색 기본 지원, GraphQL API, 모듈식 벡터라이저
  • 단점: Docker 필수(로컬 실행 시), 러닝 커브 존재

pgvector: 기존 PostgreSQL에 벡터 추가

이미 PostgreSQL을 사용 중이라면 pgvector 확장을 추가하여 별도의 벡터 DB 없이 벡터 검색이 가능합니다.

-- pgvector 확장 설치
CREATE EXTENSION vector;

-- 벡터 컬럼이 포함된 테이블 생성
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    content TEXT NOT NULL,
    category TEXT,
    embedding vector(1536),  -- 1536차원 벡터
    created_at TIMESTAMP DEFAULT NOW()
);

-- HNSW 인덱스 생성 (빠른 근사 최근접 이웃 검색)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 200);

-- 벡터 삽입
INSERT INTO documents (title, content, embedding)
VALUES ('RAG 가이드', 'RAG는 검색 증강 생성입니다.', '[0.1, 0.2, ...]');

-- 코사인 유사도 기반 검색 (상위 5개)
SELECT title, content,
       1 - (embedding <=> '[0.1, 0.2, ...]'::vector) AS similarity
FROM documents
WHERE category = 'ai'
ORDER BY embedding <=> '[0.1, 0.2, ...]'  -- <=> 는 코사인 거리 연산자
LIMIT 5;

-- 결과: title: RAG 가이드, similarity: 0.9234

pgvector 장단점:

  • 장점: 기존 PostgreSQL 인프라 활용, SQL과 통합, 트랜잭션 지원
  • 단점: 전용 벡터 DB 대비 성능 제한, 대규모 데이터셋에서 느림

사용 시나리오별 추천

시나리오추천 DB이유
프로토타입/로컬 개발Chroma설치 즉시 사용, 코드 3줄로 시작
소규모 프로덕션 (10만 벡터 이하)pgvector별도 인프라 불필요, SQL 통합
중규모 프로덕션Weaviate하이브리드 검색, 자체 호스팅 가능
대규모 SaaSPinecone자동 스케일링, 관리 부담 최소
키워드+의미 검색 동시 필요Weaviate하이브리드 검색 기본 지원
PostgreSQL 이미 사용 중pgvector추가 인프라 비용 없음

비용 비교 (월간, 100만 벡터 기준)

DB예상 비용비고
Chroma무료 (셀프호스트 서버 비용)서버 비용만 발생
Pinecone$70~$200서버리스 기준, 쿼리 수에 따라 변동
Weaviate Cloud$25~$100노드 크기에 따라 변동
pgvector무료 (기존 PG 비용)추가 메모리/CPU 필요할 수 있음

실전 팁

  • 처음에는 Chroma로 시작하세요: 프로토타입 단계에서 빠르게 검증한 후, 요구사항에 맞는 DB로 마이그레이션하는 것이 효율적입니다.
  • 임베딩 모델 선택이 더 중요합니다: 벡터 DB의 성능 차이보다 임베딩 모델의 품질이 검색 정확도에 훨씬 큰 영향을 미칩니다.
  • 메타데이터 필터링을 적극 활용하세요: 벡터 유사도만으로는 부족한 경우가 많습니다. 날짜, 카테고리 등 메타데이터 필터를 결합하면 검색 품질이 크게 향상됩니다.
  • 하이브리드 검색을 고려하세요: 고유명사, 코드, 약어 등은 키워드 검색이 더 정확합니다. Weaviate의 하이브리드 검색이나 별도 BM25 결합을 검토하세요.
  • 인덱스 설정을 조정하세요: HNSW의 ef_constructionef_search 파라미터를 조정하면 정확도와 속도의 균형을 맞출 수 있습니다.

이 글이 도움이 되었나요?