**벡터 데이터베이스(Vector Database)**는 고차원 밀집/희소 임베딩(Embedding)과 메타데이터를 저장하고 근사 최근접 이웃(ANN) 인덱스를 통해 밀리초 단위의 유사도 검색을 제공하는 RAG, 시맨틱 검색 및 AI 에이전트 메모리 계층의 핵심 인프라입니다.
| 워크로드 / 제약 조건 | 권장 분류 | 대표 솔루션 | 선택 이유 |
|---|---|---|---|
| 기존 PostgreSQL 스택, 약 1,000만 건 이하 | 관계형 DB 확장 | pgvector (+ halfvec / HNSW) | ACID 트랜잭션, SQL JOIN 및 기존 운영 체계를 재사용해 신규 인프라 불필요 |
| 전문 검색 BM25 + 벡터 하이브리드 스코어링 | 검색 엔진 확장 | Elasticsearch / OpenSearch / Vespa | 성숙한 역인덱스 및 다단계 하이브리드 랭킹 생태계 활용 |
| 독립 고QPS 프로덕션 서비스 및 복합 필터링 | 전용 분산 벡터 DB | Qdrant / Milvus / Weaviate | 전용 스토리지 엔진, 고속 페이로드 필터링 및 수평 확장성 우수 |
| 로컬 개발, 엣지/데스크톱 앱 또는 데이터 레이크 직접 읽기 | 임베디드 / 컬럼형 DB | LanceDB / Chroma / FAISS | 인프로세스 실행 및 Apache Arrow / Parquet 제로카피 연동 |
| 초저비용 스토리지가 필요한 대규모 콜드/웜 데이터 | 오브젝트 스토리지 네이티브 SaaS | Turbopuffer | S3/GCS를 원본으로 사용하고 로컬 NVMe/RAM 핫 캐시 결합 |
| 무운영 서버리스 및 퍼블릭 클라우드 통합 | 완전 관리형 클라우드 | Pinecone / Vertex AI Vector Search / Azure AI Search | 탄력적 서버리스 확장 및 클라우드 IAM/모니터링 네이티브 연동 |
🔗 관련 치트 시트: LLM 및 AI 에이전트 핵심 개념 치트 시트 · 현대 AI 핵심 알고리즘 치트 시트 · PostgreSQL 명령어 치트 시트 · Redis 명령어 치트 시트 · MongoDB 명령어 치트 시트
1. 핵심 개념 및 거리 측정 지표
1.1 필수 용어 사전
| 용어 | 정의 | 엔지니어링 고려 사항 |
|---|---|---|
| Embedding (임베딩 벡터) | 텍스트, 이미지, 오디오의 의미를 고정 길이 부동소수점 배열로 인코딩한 표현 | 일반 차원: 384 / 768 / 1024 / 1536 / 3072. 차원에 비례해 메모리와 연산량 선형 증가 |
| ANN (근사 최근접 이웃) | 약간의 재현율(예: 95%–99%)을 양보하고 검색 속도를 100×–1000× 높이는 인덱스 기법 | 지연 시간 vs 재현율 트레이드오프의 핵심 (전체 전수 조사 k-NN과 대비) |
| Metadata Filtering | 스칼라 속성(테넌트, 시간, 권한, 카테고리)으로 벡터 검색 대상을 제한 | Pre-filtering, Single-stage / Inline, Post-filtering 구분 필수 |
| Hybrid Search (하이브리드 검색) | 밀집 벡터(의미 유사성)와 희소 벡터 / BM25(정확한 키워드 일치) 결합 | 품번, 에러 코드, 약어 등 순수 의미 검색의 누락 문제 보완 |
| Sparse Vector (희소 벡터) | 대부분의 값이 0인 고차원 표현(SPLADE, BM25 가중치 등) | 0이 아닌 인덱스와 가중치만 저장해 밀집 검색과 함께 다중 경로 검색에 활용 |
1.2 3대 핵심 거리 및 유사도 지표
Cosine(u, v) = (u · v) / (‖u‖₂ · ‖v‖₂)
IP(u, v) = u · v = ∑ᵢ (uᵢ × vᵢ)
L₂(u, v) = √( ∑ᵢ (uᵢ − vᵢ)² )
| 지표 | 의미 | 수학적 등가 관계 | 주요 활용 분야 |
|---|---|---|---|
| 코사인 유사도 (Cosine) | 벡터 크기를 무시하고 각도만 비교 (−1~1, 거리는 1 - cos) |
L₂ 정규화된 벡터에서는 내적과 순위가 완전히 동일 | 텍스트 시맨틱 검색, RAG, 문장 임베딩 (기본 권장) |
| 내적 (Inner Product / IP) | 각도와 크기를 모두 반영하며 연산 비용이 가장 낮음 | 단위 정규화된 벡터에서는 Cosine 대신 IP를 사용해 제곱근/나눗셈 생략 가능 | 투타워 추천 시스템, 정규화 임베딩 (OpenAI 등) |
| 유클리드 거리 (L₂) | 공간상 직선 거리(작을수록 유사) | 단위 벡터에서 L₂² = 2 − 2 · cos(u, v) 성립 |
이미지/얼굴 임베딩, 좌표 군집화, 크기 차이 보존 필요 시 |
2. ANN 인덱스 알고리즘 및 벡터 양자화
2.1 벡터 인덱스 비교
| 인덱스 유형 | 동작 원리 | 메모리 사용량 | 속도 및 재현율 | 규모 및 대표 엔진 |
|---|---|---|---|---|
| Flat (전수 정밀 탐색) | 모든 벡터와 거리를 직접 계산 | 보통 (원본/양자화 벡터만 저장) | 재현율 100%; 약 10만 건 이상에서 지연 급증 | 10만 건 미만 소규모 데이터, 정확도 벤치마크 기준 |
| IVF-Flat (역파일 인덱스) | K-Means로 nlist개 버킷 분할 후 최근접 nprobe개 버킷 스캔 |
낮음 (그래프 오버헤드 없음) | nprobe로 튜닝, 중~고 재현율 |
메모리 제약이 있는 100만–1,000만 건 (FAISS / Milvus / pgvector) |
| IVF-PQ (IVF + 곱 양자화) | 버킷 분할 후 부분 공간 코드북 압축 | 매우 낮음 (1/16–1/64 압축) | 초고속이나 단일 패스 재현율 저하, 재정렬(Rescore) 병행 | 1억 건 이상 인메모리 검색 (FAISS / Milvus / LanceDB) |
| HNSW (계층적 탐색 그래프) | 다층 스킵리스트 기반 근접 그래프(상층 거친 탐색, 하층 정밀 탐색) | 높음 (벡터 + 그래프 인접 리스트 RAM/mmap 상주) | 밀리초 지연 + 95%–99% 고재현율, 업계 표준 | 100만–1억 건 이상 실시간 저지연 검색 (Qdrant / Milvus / Weaviate / pgvector) |
| DiskANN (Vamana 그래프) | SSD 최적화 그래프: 압축 벡터는 RAM, 전체 그래프/원본은 NVMe 배치 | 낮음 (메모리 5×–10× 절감) | 단일 노드에서 1억 건 이상 밀리초 응답 (NVMe IOPS 의존) | 메모리 예산이 빠듯한 1억–10억 건 이상 (Milvus / LanceDB / Azure) |
| ScaNN | 비등방성 벡터 양자화 + 트리 파티셔닝 | 낮음–보통 | 내적 검색 시 동일 지연 대비 최상급 재현율 | 대규모 추천 및 검색 (Vertex AI Vector Search / OSS) |
HNSW 핵심 튜닝 파라미터:
M(노드당 최대 양방향 연결 수, 보통16–64): 클수록 고차원 재현율 향상, 메모리 및 빌드 시간 증가.efConstruction(인덱스 빌드 시 후보 큐 크기, 보통100–400): 빌드 시간에만 영향을 주며 클수록 그래프 품질 향상.efSearch(쿼리 시 동적 탐색 폭,top_k이상 필수): 쿼리마다 동적 조정 가능한 유일한 파라미터. 높이면 재현율 상승, QPS 하락.
2.2 벡터 양자화(Quantization) 및 메모리 산정
1,000만 건 × 1536차원 벡터(FP32 원본) 기준:
원본 벡터 크기 ≈ N × D × 4 Bytes (HNSW 그래프 인접 구조에 약 1.2×–1.5× 추가 메모리 필요)
| 양자화 방식 | 차원당 비트 폭 | 압축률 | 1,000만 × 1536차원 크기 | 정확도 트레이드오프 및 용도 |
|---|---|---|---|---|
| FP32 (비압축) | 32-bit (4 B) | 1× | ~57.2 GB | 기준 정밀도. RAM 상주 비용 높음 |
| FP16 / BF16 (반정밀도) | 16-bit (2 B) | 2× | ~28.6 GB | 손실이 거의 없으며(pgvector halfvec 등) 가성비 최상 |
| SQ8 (스칼라 양자화 Int8) | 8-bit (1 B) | 4× | ~14.3 GB | 보통 97%+ 재현율 유지, 프로덕션 표준 압축 |
| PQ (곱 양자화) | 부분공간/코드북 | 16×–64× | ~1–4 GB | 코드북 학습 필요. 오버샘플링 + 원본 재점수화(Rescore) 결합 |
| BQ (이진 양자화 1-bit) | 1-bit | 32× | ~1.79 GB | 초고속 해밍 거리 1차 추출. 3×–5× Rescore 필수 (1024차원 이상에서 효과 우수) |
3. 주요 벡터 데이터베이스 및 검색 솔루션 계층별 비교
3.1 전용 네이티브 벡터 데이터베이스
| 제품 | 라이선스 / 배포 형태 | 언어 및 스토리지 아키텍처 | 인덱스 및 핵심 기능 | 적합 용도 |
|---|---|---|---|---|
| Qdrant | Apache 2.0 / 자체 호스팅 & Cloud | Rust; 인메모리, mmap 디스크, 디스크 양자화 | HNSW + SQ8/BQ; 희소 벡터 및 고속 페이로드 필터 인덱스 | 고QPS 독립 서비스, 멀티테넌시, 복합 메타데이터 필터 |
| Milvus | Apache 2.0 / 분산형 & Zilliz Cloud | Go 제어부 + C++ 실행부; 오브젝트 스토리지 + MQ 분리 구조 | IVF, HNSW, DiskANN, GPU CAGRA; 멀티테넌트 파티션 | 10억 건 규모 대규모 고처리량 엔터프라이즈 |
| Weaviate | BSD-3-Clause (일부 엔터프라이즈 플러그인 비공개) | Go; 내장 오브젝트 스토리지 + 역인덱스 | HNSW + 동적/PQ/BQ 양자화; GraphQL/REST, 모듈형 임베딩 파이프라인 | 임베딩 파이프라인 일체형 RAG 구축 |
| Chroma | Apache 2.0 / 임베디드 & Client-Server | Python / Rust 코어; SQLite + 로컬/분산 저장소 | HNSW; 간결한 API, LangChain / LlamaIndex 밀접 연동 | 빠른 AI 프로토타이핑, 중소규모 Python RAG |
| LanceDB | Apache 2.0 / 임베디드 & Enterprise | Rust; Lance 컬럼형 포맷 & Apache Arrow 기반 | IVF-PQ, HNSW, DiskANN; 제로카피 I/O, 멀티모달(영상/음성/테이블) 네이티브 | 로컬 임베디드 앱, 서버리스 S3 직접 읽기, 멀티모달 레이크 |
| Pinecone | 상용 독점 Serverless SaaS | 관리형 분산 엔진 (Pod에서 Serverless로 진화) | 연산-스토리지 분리 독점 인덱스; 희소-밀집 하이브리드, Namespace 격리 | 무운영 클라우드 SaaS를 최우선하는 팀 |
| Turbopuffer | 상용 독점 SaaS / BYOC | Rust; 오브젝트 스토리지(S3/GCS) 원본 + NVMe/RAM 캐시 | 랜덤 I/O가 많은 그래프 대신 센트로이드 인덱스(SPFresh 계열) 채택; 전문+벡터 | 대규모 콜드/웜 데이터(코드 인덱싱 등) 초저비용 운영 |
3.2 순수 벡터 검색 라이브러리 (완전한 DB 아님)
| 제품 | 라이선스 | 기능 범위 및 한계 | 활용 사례 |
|---|---|---|---|
| FAISS (Meta) | MIT | C++ / Python 유사도 검색 라이브러리 (메타데이터 영속성, 분산 트랜잭션, 인증 서버 없음); CPU SIMD 및 멀티 GPU 지원 | 오프라인 배치 유사도 계산, 알고리즘 연구, 자체 엔진 내장 코어 |
3.3 기존 데이터베이스 및 검색 엔진 확장
| 제품 | 기반 기술 | 벡터 인덱싱 및 기능 | 장점 및 한계 |
|---|---|---|---|
| pgvector | PostgreSQL 확장 (Supabase 생태계 포함) | vector / halfvec / sparsevec / bit; HNSW & IVFFlat |
장점: ACID, SQL JOIN, 추가 운영 부담 제로; 한계: 1,000만–5,000만 건 이상에서 쓰기 증폭 및 RAM 부담 증가 |
| Elasticsearch / OpenSearch | Lucene 역인덱스 + HNSW | 네이티브 Dense Vector + BM25 하이브리드, RRF 융합, 중첩 필터 | 장점: 기존 검색 팀 기술 스택 재활용; 한계: JVM 오프힙 메모리 및 세그먼트 병합 비용 |
| Redis (Query Engine) | 인메모리 KV 스토어 | Flat & HNSW, 서브밀리초 지연, 실시간 스트리밍 업데이트 | 장점: 시맨틱 캐시 및 피처 스토어에 최적; 한계: 대규모 시 높은 RAM 비용 |
| MongoDB Atlas Search | 문서형 DB (Atlas / Local CLI) | Lucene 기반 HNSW를 BSON 문서와 함께 저장·검색 | 장점: 문서 DB와 벡터 DB 간 이중 쓰기 동기화 제거; 한계: Atlas 플랫폼 의존도 |
| SingleStore | 분산 HTAP SQL DB | SQL + 네이티브 벡터 연산(내적/L₂), 컬럼스토어 + 로우스토어 | 실시간 SQL 분석과 트랜잭션을 함께 처리하는 엔터프라이즈 |
| Vespa | Apache 2.0 빅데이터 서빙 엔진 | HNSW + 정확/근사 하이브리드, 다단계 ML 랭킹(Tensor/XGBoost/ONNX) | 초대형 검색·추천 플랫폼 (학습 및 운영 난이도 높음) |
3.4 퍼블릭 클라우드 완전 관리형 서비스
| 서비스 | 클라우드 | 핵심 아키텍처 및 특징 |
|---|---|---|
| Vertex AI Vector Search (구 Matching Engine) | Google Cloud (GCP) | Google ScaNN 기반; 10억 건 규모 스트리밍 업데이트 및 희소-밀집 하이브리드 지원 |
| Amazon OpenSearch Serverless / Aurora pgvector | AWS | 서버리스 검색 클러스터 및 RDS/Aurora 벡터 확장, Amazon Bedrock 지식 기반 네이티브 연동 |
| Azure AI Search | Microsoft Azure | 내장 Semantic Ranker, 통합 벡터화 파이프라인, 엔터프라이즈 RBAC 문서 권한 제어 |
4. 필터링 전략 및 하이브리드 검색
4.1 메타데이터 필터링 실행 방식
| 전략 | 실행 순서 | 한계 및 엔지니어링 대응 |
|---|---|---|
| Pre-filtering (선 필터링) | 스칼라 인덱스로 ID 비트맵을 먼저 추출한 뒤 벡터 검색 | 필터 선택도가 극단적으로 낮으면(<1%) 그래프 연결 단절 발생; 대응: 임계치 이하 시 전수 스캔으로 자동 전환 |
| Post-filtering (후 필터링) | 전체 벡터 Top-K를 먼저 뽑고 스칼라 조건으로 탈락시킴 | 반환 개수가 K개 미만(또는 0개)이 될 위험; 대응: 단독 사용 지양, 대량 오버샘플링 필수 |
| Single-stage / Inline (통합 필터링) | HNSW 그래프 탐색의 매 홉마다 필터 비트맵을 실시간 검사 | 현대 표준(Qdrant / Milvus / Weaviate / pgvector 0.8+ iterative scan)으로 재현율과 지연 균형 |
4.2 역순위 융합 (RRF: Reciprocal Rank Fusion)
밀집 벡터 검색과 BM25 키워드 검색은 점수 스케일이 다르므로, 점수 보정 없이 순위만으로 결합하는 RRF를 표준으로 사용합니다:
RRF_Score(d) = ∑_{r ∈ R} 1 / (k + rank_r(d)) (경험적 평활 상수 k = 60)
5. 프로덕션 코드 스니펫
5.1 pgvector 스키마, HNSW 인덱스 및 반복 스캔 (SQL)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
content TEXT NOT NULL,
embedding halfvec(1536), -- float16으로 float32 대비 메모리 50% 절감
fts tsvector GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED
);
CREATE INDEX idx_docs_emb_hnsw ON documents
USING hnsw (embedding halfvec_cosine_ops)
WITH (m = 16, ef_construction = 128);
CREATE INDEX idx_docs_fts ON documents USING gin (fts);
SET hnsw.ef_search = 100;
SET hnsw.iterative_scan = relaxed_order;
SELECT id, content, 1 - (embedding <=> $1::halfvec) AS cosine_sim
FROM documents
WHERE tenant_id = 42
ORDER BY embedding <=> $1::halfvec
LIMIT 10;
pgvector 거리 연산자:
<->유클리드 거리 (L₂) ·<=>코사인 거리 (1 - cos) ·<#>음의 내적 ·<+>맨해튼 거리 (L₁).
5.2 Qdrant 이진 양자화 및 Payload 필터링 (Python)
from qdrant_client import QdrantClient, models
client = QdrantClient(url="http://localhost:6333")
client.create_collection(
collection_name="knowledge_base",
vectors_config=models.VectorParams(
size=1536,
distance=models.Distance.COSINE,
on_disk=True,
),
quantization_config=models.BinaryQuantization(
binary=models.BinaryQuantizationConfig(always_ram=True)
),
)
client.create_payload_index(
collection_name="knowledge_base",
field_name="tenant_id",
field_schema=models.PayloadSchemaType.KEYWORD,
)
hits = client.query_points(
collection_name="knowledge_base",
query=[0.012, -0.045, ...],
query_filter=models.Filter(
must=[models.FieldCondition(key="tenant_id", match=models.MatchValue(value="org_a"))]
),
search_params=models.SearchParams(
quantization=models.QuantizationSearchParams(rescore=True, oversampling=3.0)
),
limit=10,
).points