핵심 요약
RAG 시스템의 핵심 인프라. pgvector(PostgreSQL extension)이 가장 단순, Pinecone이 가장 매니지드, Qdrant·Milvus가 전문 vector DB. 2026년 시점 선택 매트릭스.
- pgvector 0.10 (2026-02): HNSW + iterative scan
- Pinecone serverless (2024 출시 후 표준)
- Qdrant 1.10: Rust 기반, hybrid 검색 강함
- Milvus 2.5: 가장 큰 스케일, 운영 부담
1. 성능 비교 (1M docs, 1024-dim)
| 지표 | pgvector | Qdrant | Pinecone | Milvus |
|---|---|---|---|---|
| indexing 시간 | 4분 | 2분 | 1분 | 1.5분 |
| QPS (single search) | 800 | 2,400 | 3,000 | 2,800 |
| p99 latency | 40ms | 15ms | 20ms | 18ms |
| recall@10 | 0.95 | 0.96 | 0.95 | 0.96 |
| 월 비용 (1M docs) | $50 (PG 인스턴스) | $120 | $70 (serverless) | $200 (자체 호스팅) |
2. pgvector 0.10 — 단순함의 가치
-- 설치
CREATE EXTENSION vector;
-- 테이블
CREATE TABLE docs (
id UUID PRIMARY KEY DEFAULT uuidv7(),
content TEXT,
embedding VECTOR(1024),
metadata JSONB
);
-- HNSW 인덱스
CREATE INDEX docs_embedding_idx ON docs
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 검색
SELECT id, content, 1 - (embedding <=> $1) AS score
FROM docs
ORDER BY embedding <=> $1
LIMIT 10;0.10 신기능 — Iterative Scan
SET hnsw.iterative_scan = 'strict_order';
SET hnsw.max_scan_tuples = 20000;
-- recall 부족 시 자동 추가 탐색장점: PostgreSQL 데이터·메타데이터·관계·트랜잭션 모두 한 곳에. 운영 매우 단순.
3. Qdrant — Rust 기반 전문 DB
# 설치
docker run -p 6333:6333 qdrant/qdrant
# Python
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient("localhost", port=6333)
client.create_collection(
collection_name="docs",
vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)
client.upsert(
collection_name="docs",
points=[
PointStruct(id=1, vector=[0.1]*1024, payload={"source": "..."}),
],
)
results = client.search(
collection_name="docs",
query_vector=[0.1]*1024,
query_filter={"must": [{"key": "source", "match": {"value": "blog"}}]},
limit=10,
)Hybrid 검색 (vector + keyword)
from qdrant_client.models import Fusion, Prefetch
results = client.query_points(
collection_name="docs",
prefetch=[
Prefetch(query=dense_vector, using="dense", limit=100),
Prefetch(query=sparse_vector, using="sparse", limit=100),
],
query=Fusion.RRF, # Reciprocal Rank Fusion
limit=10,
)dense + sparse 결합이 1급 시민. 한국어 RAG에서 효과 큼.
4. Pinecone Serverless
from pinecone import Pinecone
pc = Pinecone(api_key="...")
index = pc.create_index(
name="docs",
dimension=1024,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index.upsert([
("id1", [0.1]*1024, {"source": "..."}),
])
results = index.query(
vector=[0.1]*1024,
filter={"source": {"$eq": "blog"}},
top_k=10,
)완전 관리. 운영 부담 0. 단 비용·lock-in.
5. Milvus — 대규모
10억+ 벡터 처리. 설치·운영 부담 큼. 대규모 검색 엔진·추천 시스템에서만 정당화.
6. 의사결정 매트릭스
| 워크로드 | 1순위 |
|---|---|
| 이미 PostgreSQL 운영 | pgvector |
| 1M docs 미만 | pgvector |
| 관리 부담 0 | Pinecone Serverless |
| hybrid (dense + sparse) 필수 | Qdrant |
| 1억+ 벡터 | Milvus 또는 Pinecone |
| 오픈소스 + self-hosted + 성능 | Qdrant |
7. 임베딩 모델과의 조합
# BGE-M3로 임베딩 + Qdrant 또는 pgvector
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('BAAI/bge-m3')
embs = model.encode(documents, batch_size=32)['dense_vecs']
# Qdrant로 저장
client.upsert(collection_name="docs",
points=[PointStruct(id=i, vector=e.tolist(), payload={...}) for i, e in enumerate(embs)]
)8. 운영 노하우
pgvector
- maintenance_work_mem 4GB+ 후 인덱스 빌드
- HNSW: m=16, ef_construction=64 표준
- 큰 테이블은 partition + 인덱스 별도
Qdrant
- quantization (scalar·binary)으로 메모리 50% 절감
- multi-tenant 시 collection 분리
- snapshot으로 백업
Pinecone
- namespace로 multi-tenant
- 비용은 query·storage 분리 — 검색 빈도 추적
9. 비용 종합
| 규모 | pgvector | Qdrant | Pinecone |
|---|---|---|---|
| 10K docs | ~$20/월 | ~$30/월 | ~$10/월 |
| 1M docs | ~$50/월 | ~$120/월 | ~$70/월 |
| 10M docs | ~$200/월 | ~$400/월 | ~$300/월 |
| 100M docs | ~$1500/월 | ~$3000/월 | ~$2500/월 |
10. RAG 시스템 권장 조합
| 규모 | 임베딩 | Vector DB | Reranker |
|---|---|---|---|
| POC·소규모 | OpenAI v3 | pgvector | 없음 |
| 중간 | bge-m3 | pgvector or Qdrant | bge-reranker-v2-m3 |
| 큰 규모 | bge-m3 | Qdrant | cross-encoder |
| 매니지드 우선 | OpenAI v3 | Pinecone | Cohere Rerank |

댓글 0