빠른 참조

벡터 데이터베이스 및 검색 아키텍처 치트 시트: 핵심 개념, 인덱스, 양자화 및 제품 선택

벡터 데이터베이스와 시맨틱 검색의 고밀도 레퍼런스: 거리 측정 공식, ANN 인덱스(HNSW/IVF/DiskANN/ScaNN), 양자화 메모리 산정, 인라인 필터링, RRF 하이브리드 검색, 전용 벡터 DB·기존 DB 확장·클라우드 관리형 서비스 계층별 비교를 다룹니다.

· 게시일

**벡터 데이터베이스(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

관련 주제