본문 바로가기

DB

RAG 시스템에 맞는 벡터 DB는 뭔가 — ChromaDB vs Qdrant vs Pinecone vs Elasticsearch 완전 비교

반응형

RAG 시스템을 만들 때 이런 고민이 생깁니다.

"벡터 DB가 이렇게 많은데 뭘 써야 하지? 다들 자기가 제일 빠르다고 하는데."

벤더 벤치마크는 전부 자기한테 유리하게 나와 있어요. 이번 글에서는 ChromaDB, Qdrant, Pinecone, Elasticsearch 네 가지를 실전 관점에서 비교해 드릴게요.


벡터 DB가 왜 필요한가

일반 DB는 정확한 값으로 검색해요. "이름 = 홍길동"처럼요. 벡터 DB는 의미적으로 유사한 것을 찾아요. "강아지"를 검색하면 "멍멍이", "반려견", "puppy"도 찾아주는 거예요.

RAG 시스템에서 "사용자 질문과 관련된 문서를 찾아서 LLM에 넘기는" 과정이 바로 벡터 검색이에요. 이 검색이 빠르고 정확해야 RAG 전체 품질이 올라갑니다.


4개 한눈에 비교

구분 ChromaDB Qdrant Pinecone Elasticsearch

타입 전용 벡터 DB 전용 벡터 DB 전용 벡터 DB (관리형) 범용 검색엔진 + 벡터
언어 Python (Rust 재작성) Rust 클라우드 서비스 Java
호스팅 셀프호스팅 셀프호스팅 / 관리형 관리형 전용 셀프호스팅 / 관리형
오픈소스 ✅ (기본 기능)
하이브리드 검색 제한적 ✅ (강점)
적합한 단계 프로토타입 프로덕션 프로덕션 (관리 편의) 기존 ES 스택

ChromaDB — 빠르게 시작하는 프로토타입용

어떤 DB인가

2025년 Rust로 재작성되면서 이전 Python 구현보다 쓰기/조회 속도가 4배 빨라졌어요. Python API가 NumPy처럼 직관적이라 설치하고 5분이면 벡터 검색을 돌려볼 수 있어요.

import chromadb

client = chromadb.Client()
collection = client.create_collection("my_docs")

collection.add(
    documents=["오늘 날씨가 맑아요", "내일 비가 올 예정입니다"],
    ids=["doc1", "doc2"]
)

results = collection.query(
    query_texts=["날씨 어때?"],
    n_results=1
)

설정 없이, 인프라 없이, 이게 전부예요.

장점

설치와 세팅이 필요 없어요. 애플리케이션 안에 임베디드로 실행되기 때문에 네트워크 지연도 없어요. 메타데이터 필터링과 풀텍스트 검색을 내장하고 있어서 별도 툴을 연동할 필요가 없어요.

단점

1,000만 벡터 이상의 프로덕션 워크로드에는 설계상 한계가 있어요. 팀들이 대부분 프로토타입에서 Qdrant나 Pinecone으로 마이그레이션해요.

언제 쓰나

  • 빠르게 RAG 프로토타입을 만들고 싶을 때
  • 1,000만 벡터 이하의 MVP 단계
  • 팀에 DevOps 역량이 없을 때

Qdrant — 프로덕션 셀프호스팅의 표준

어떤 DB인가

Rust로 만들어진 전용 벡터 DB예요. 성능과 메모리 효율을 최우선으로 설계했어요. 스칼라 양자화(Scalar Quantization)를 켜면 메모리 사용량을 4~8배까지 줄일 수 있고, 검색 속도는 거의 그대로 유지돼요.

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient("localhost", port=6333)

client.create_collection(
    collection_name="my_docs",
    vectors_config=VectorParams(size=768, distance=Distance.COSINE)
)

client.upsert(
    collection_name="my_docs",
    points=[
        PointStruct(
            id=1,
            vector=[0.1, 0.2, ...],
            payload={"text": "문서 내용", "category": "기술"}
        )
    ]
)

results = client.search(
    collection_name="my_docs",
    query_vector=[0.1, 0.2, ...],
    query_filter={"must": [{"key": "category", "match": {"value": "기술"}}]},
    limit=5
)

장점

복잡한 메타데이터 필터링이 강력해요. 벡터 검색과 페이로드 필터를 동시에 적용해도 성능 저하가 거의 없어요. 로컬 파일로도 실행할 수 있어서 개발 환경에서는 Docker 없이도 사용 가능해요. 멀티테넌시도 컬렉션과 샤딩으로 유연하게 구성할 수 있어요.

단점

Pinecone에 비해 인프라 운영 지식이 필요해요. 클러스터 구성, 샤딩, 백업 전략을 직접 설계해야 해요.

언제 쓰나

  • 프로덕션으로 가야 하는데 비용 통제가 중요할 때
  • 복잡한 메타데이터 필터가 필요할 때
  • 셀프호스팅 환경에서 최고 성능을 원할 때
  • 데이터 사이언티스트가 실험부터 프로덕션까지 같은 툴을 쓰고 싶을 때

Pinecone — 인프라 없이 프로덕션 수준

어떤 DB인가

완전 관리형 벡터 DB 서비스예요. 클러스터 구성, 샤딩, 복제, 백업을 전부 Pinecone이 해줍니다. 수십억 개의 벡터도 처리할 수 있는 스케일이에요.

from pinecone import Pinecone

pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-index")

index.upsert(
    vectors=[
        {"id": "doc1", "values": [0.1, 0.2, ...], "metadata": {"text": "문서 내용"}}
    ]
)

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

장점

인프라를 전혀 신경 쓰지 않아도 돼요. SOC 2, HIPAA 컴플라이언스가 필요한 엔터프라이즈 환경에도 바로 쓸 수 있어요. 멀티리전, VPC 피어링, BYOK 같은 엔터프라이즈 기능도 지원해요.

단점

비용이 비싸요. 클라우드 서비스라 데이터가 외부로 나가요. 오픈소스가 아니라 벤더 종속이 생겨요. Qdrant나 자체 호스팅 대비 장기적으로 비용 차이가 커질 수 있어요.

언제 쓰나

  • 인프라 운영팀이 없는 스타트업이 빠르게 프로덕션에 올려야 할 때
  • 엔터프라이즈 컴플라이언스가 필요할 때
  • 수십억 벡터 규모의 대형 서비스

Elasticsearch — 기존 스택 활용의 최강자

어떤 DB인가

원래 전문 검색 엔진인데 벡터 검색 기능을 추가한 거예요. 이미 Elasticsearch를 쓰고 있다면 별도 벡터 DB를 추가하지 않고 그대로 활용할 수 있어요.

from elasticsearch import Elasticsearch

es = Elasticsearch("http://localhost:9200")

es.index(
    index="my_docs",
    body={
        "text": "문서 내용",
        "embedding": [0.1, 0.2, ...],
        "category": "기술"
    }
)

results = es.search(
    index="my_docs",
    body={
        "knn": {
            "field": "embedding",
            "query_vector": [0.1, 0.2, ...],
            "k": 5,
            "num_candidates": 100
        },
        "query": {
            "match": {"category": "기술"}
        }
    }
)

장점

하이브리드 검색이 강력해요. BM25 키워드 검색과 벡터 검색을 하나의 쿼리에서 자연스럽게 결합할 수 있어요. 기존 Elasticsearch 인프라, 대시보드, 분석 툴을 그대로 활용할 수 있어요. 대규모 클러스터에서 수십억 벡터 처리 경험이 풍부해요.

단점

전용 벡터 DB에 비해 순수 벡터 검색 성능은 낮을 수 있어요. 메모리 효율도 Qdrant보다 떨어져요. Java 기반이라 운영 복잡도가 있어요.

언제 쓰나

  • 이미 Elasticsearch를 로그, 검색에 쓰고 있을 때
  • 키워드 검색과 벡터 검색을 함께 써야 할 때
  • 기존 인프라에 벡터 검색을 추가하는 형태로 시작할 때

단계별 선택 가이드

전문가들의 공통된 조언이에요.

"벡터 DB는 거의 병목이 아니에요. 청킹 전략이나 임베딩 품질이 훨씬 중요해요. 일단 ChromaDB로 시작하고, 프로덕션 가면 그때 이전하세요."

프로토타입 / MVP 단계

ChromaDB로 시작하세요. 설정 없이 바로 시작할 수 있고, 1,000만 벡터 이하에서는 충분해요.

프로덕션 — 셀프호스팅 원할 때

Qdrant가 정답이에요. 성능, 메모리 효율, 필터링 기능 모두 프로덕션 수준이고 비용 통제가 가능해요.

프로덕션 — 인프라 신경 쓰기 싫을 때

Pinecone이에요. 비용은 더 들지만 운영 부담이 없어요.

기존 Elasticsearch 스택이 있을 때

Elasticsearch에 벡터 기능을 추가하세요. 새 인프라를 추가하지 않아도 돼요.


마무리

결론은 단순해요.

  • 빠른 시작이 목표 → ChromaDB
  • 셀프호스팅 프로덕션 → Qdrant
  • 관리형 프로덕션 → Pinecone
  • 기존 ES 스택 있음 → Elasticsearch

어떤 DB를 선택하든 임베딩 모델과 청킹 전략이 더 중요해요. 최고의 벡터 DB도 나쁜 임베딩을 보완하지 못하거든요. 😄


📌 관련 글

Elasticsearch 한국어 RAG

 

Elasticsearch로 한국어 RAG 만드는 법 — Dense Vector KNN + BM25 + Nori 완전 정리

Elasticsearch로 RAG 시스템을 만들다 보면 이런 상황이 생겨요."의미 기반 벡터 검색도 하고 싶고, 정확한 키워드 검색도 하고 싶은데 어떻게 같이 써?"그리고 한국어 데이터를 다루면 또 이런 문제

cell-devlog.tistory.com

벡터 검색 정확도 올리는 법

 

벡터 검색 정확도 올리는 법 — 임베딩 모델 선택부터 HNSW 튜닝, Reranking까지

벡터 검색을 붙여봤는데 결과가 기대보다 별로라는 경험, 한 번쯤 있으실 거예요."분명히 관련 있는 문서인데 왜 안 나오지?"이번 글에서는 벡터 검색 정확도를 높이는 방법을 임베딩 모델 선택

cell-devlog.tistory.com

 

반응형