11분
#Vector DB#RAG#AI

벡터 데이터베이스 비교:
Pinecone vs Weaviate vs Chroma

RAG(Retrieval-Augmented Generation) 시스템을 구축하면서 세 가지 벡터 DB를 모두 사용해봤습니다. 각각의 장단점과 어떤 상황에 적합한지 정리했습니다.

벡터 데이터베이스가 뭔가요?

일반 DB가 숫자나 텍스트를 저장한다면, 벡터 DB는 "의미"를 숫자 배열(벡터)로 저장합니다. 이를 통해 "이 문서와 비슷한 문서 찾기" 같은 작업을 빠르게 할 수 있습니다.

예: "강아지"와 "개"는 다른 단어지만 벡터로 표현하면 매우 가깝습니다.

1. Pinecone: 가장 쉽고 빠른 선택

장점

  • ✅ 완전 관리형 서비스 (서버 관리 불필요)
  • ✅ 매우 빠른 검색 속도
  • ✅ 간단한 API
  • ✅ 자동 스케일링
  • ✅ 좋은 문서화

단점

  • ❌ 무료 플랜이 제한적 (100만 벡터, 1개 인덱스)
  • ❌ 비용이 높은 편
  • ❌ 클라우드 전용 (로컬 사용 불가)

코드 예시

import pinecone

# 초기화
pinecone.init(api_key="your-api-key", environment="us-west1-gcp")

# 인덱스 생성
index = pinecone.Index("my-index")

# 벡터 저장
index.upsert(vectors=[
    ("id1", [0.1, 0.2, 0.3, ...], {"text": "문서 내용"}),
    ("id2", [0.4, 0.5, 0.6, ...], {"text": "다른 문서"})
])

# 검색
results = index.query(
    vector=[0.1, 0.2, 0.3, ...],
    top_k=5,
    include_metadata=True
)

언제 사용하나?

  • 프로덕션 환경에서 안정성이 중요할 때
  • 대규모 데이터 (수백만 벡터 이상)
  • 서버 관리를 하고 싶지 않을 때

2. Weaviate: 기능이 풍부한 오픈소스

장점

  • ✅ 오픈소스 (셀프 호스팅 가능)
  • ✅ GraphQL API (유연한 쿼리)
  • ✅ 하이브리드 검색 (벡터 + 키워드)
  • ✅ 다양한 모듈 (생성 AI, 필터링 등)
  • ✅ 클라우드 버전도 제공

단점

  • ❌ 설정이 복잡함
  • ❌ 학습 곡선이 높음
  • ❌ 셀프 호스팅 시 관리 필요

코드 예시

import weaviate

# 클라이언트 생성
client = weaviate.Client("http://localhost:8080")

# 스키마 정의
schema = {
    "class": "Document",
    "vectorizer": "text2vec-openai",
    "properties": [
        {"name": "content", "dataType": ["text"]},
        {"name": "title", "dataType": ["string"]}
    ]
}

client.schema.create_class(schema)

# 데이터 추가
client.data_object.create({
    "content": "문서 내용",
    "title": "제목"
}, "Document")

# 검색
result = client.query.get("Document", ["content", "title"])\
    .with_near_text({"concepts": ["검색어"]})\
    .with_limit(5)\
    .do()

언제 사용하나?

  • 복잡한 검색 로직이 필요할 때
  • 데이터 프라이버시가 중요할 때 (셀프 호스팅)
  • 하이브리드 검색이 필요할 때

3. Chroma: 가볍고 간단한 로컬 DB

장점

  • ✅ 완전 무료
  • ✅ pip install 하나로 설치 완료
  • ✅ 로컬에서 바로 사용 가능
  • ✅ LangChain과 완벽 통합
  • ✅ 학습하기 쉬움

단점

  • ❌ 대규모 프로덕션에는 부적합
  • ❌ 성능이 다른 것들보다 낮음
  • ❌ 고급 기능 부족

코드 예시

import chromadb

# 클라이언트 생성
client = chromadb.Client()

# 컬렉션 생성
collection = client.create_collection("my_docs")

# 데이터 추가
collection.add(
    documents=["문서1 내용", "문서2 내용"],
    metadatas=[{"source": "file1"}, {"source": "file2"}],
    ids=["id1", "id2"]
)

# 검색
results = collection.query(
    query_texts=["검색어"],
    n_results=5
)

언제 사용하나?

  • 프로토타입이나 실험용
  • 소규모 프로젝트
  • 로컬 개발 환경
  • LangChain 학습용

성능 비교

검색 속도 (100만 벡터 기준)

  • Pinecone: ~10ms
  • Weaviate: ~15ms
  • Chroma: ~50ms

확장성

  • Pinecone: 수십억 벡터 OK
  • Weaviate: 수억 벡터 OK
  • Chroma: 수백만 벡터까지

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

  • Pinecone: $70~
  • Weaviate Cloud: $25~
  • Chroma: 무료 (셀프 호스팅)

실전 경험

프로젝트 1: 사내 문서 검색 (Chroma)

소규모 팀용 문서 검색 봇을 만들 때 Chroma를 사용했습니다. 설정이 간단하고 LangChain과 잘 연동되어 빠르게 프로토타입을 만들 수 있었습니다.

프로젝트 2: 고객 지원 챗봇 (Pinecone)

수만 명의 사용자가 사용하는 챗봇을 만들 때 Pinecone을 선택했습니다. 안정성과 속도가 중요했고, 관리 부담을 줄이고 싶었습니다.

프로젝트 3: 논문 검색 엔진 (Weaviate)

복잡한 필터링과 하이브리드 검색이 필요한 논문 검색 시스템에 Weaviate를 사용했습니다. 키워드와 의미 검색을 동시에 활용할 수 있어서 좋았습니다.

선택 가이드

상황추천
빠른 프로토타입Chroma
프로덕션 (관리형)Pinecone
셀프 호스팅 필수Weaviate
복잡한 쿼리Weaviate
예산 제한Chroma

추가 고려사항

임베딩 모델

벡터 DB 선택만큼 중요한 게 임베딩 모델입니다:

  • OpenAI ada-002: 범용적, 고품질
  • sentence-transformers: 무료, 로컬 사용
  • Cohere: 다국어 지원 우수

데이터 마이그레이션

나중에 다른 DB로 옮길 가능성도 고려하세요. 표준 포맷(JSON 등)으로 백업하는 습관을 들이면 좋습니다.

마무리

정답은 없습니다. 프로젝트 규모, 예산, 요구사항에 따라 선택하세요.

개인적 추천:

  • 학습 & 테스트: Chroma
  • MVP: Chroma → 성장하면 Pinecone
  • 대규모 프로덕션: Pinecone
  • 특수한 요구사항: Weaviate