KSCOLD LogoKSCOLD
Blog
Feed
Product
Admin Night
Vault
Guestbook
Info

Vault 목록

벡터 데이터베이스

연결된 노트와 함께 읽기

벡터 데이터베이스

2026년 8월 28일
  • 벡터 데이터베이스(Vector DB)는 임베딩 벡터를 저장하고 근사 최근접 탐색(ANN, Approximate Nearest Neighbor) 으로 빠르게 유사 벡터를 찾는 데 특화된 DB다.
  • 일반 DB로는 N개 벡터에 대해 O(N) 풀스캔이 필요하지만, ANN 인덱스(HNSW, IVF, PQ 등)는 O(log N)~O(√N) 수준에서 근사 탐색을 한다.

대표 제품 비교

DB형태특징
Chroma로컬·임베디드개발용으로 가장 쉬움
FAISS라이브러리Facebook, 인덱싱만 — 저장은 직접
Qdrant자체 호스팅 + 클라우드Rust, 메타데이터 필터 강력
Pinecone매니지드만운영 부담 0, 비용 ↑
Weaviate자체 호스팅 + 클라우드GraphQL 인터페이스
pgvectorPostgreSQL 확장기존 SQL과 통합
Milvus자체 호스팅대규모, 분산

기본 사용 패턴 (Chroma 예시)

Python

ANN 인덱스 종류

개념 자체는 ANN(근사 최근접 이웃), 가장 흔한 구현은 HNSW에서 따로 다룬다.

  • HNSW (Hierarchical Navigable Small World) — 가장 흔함. 메모리 ↑, 정확도·속도 ↑.
  • IVF (Inverted File Index) — 클러스터링 기반. 메모리 ↓, 대규모용.
  • PQ (Product Quantization) — 벡터를 양자화해 메모리 압축. 정확도 약간 손해.
  • 보통 HNSW + PQ 조합으로 쓴다 (정확도/메모리 balance).

메타데이터 필터링이 중요한 이유

  • 벡터 유사도만으로는 "이 사용자의 문서만" 같은 권한 필터를 표현 못 함.
  • 대부분의 Vector DB는 메타데이터에 WHERE 절 같은 조건을 걸어 1차 필터링 → 그 안에서 ANN을 수행.
  • 거르는 시점에 따라 결과가 0건이 되기도 한다 → Pre-filtering vs Post-filtering, Qdrant 메타데이터 필터, Payload Index.

선택 기준

  • PoC / 단일 서버 → Chroma, FAISS.
  • 이미 Postgres 사용 중 → pgvector (별도 인프라 안 늘려도 됨).
  • 대규모 트래픽 + 운영 부담 회피 → Pinecone.
  • 온프레미스 + 정밀 제어 → Qdrant, Weaviate, Milvus.

주의

  • 벡터 차원과 거리 함수(cosine/dot/euclidean)는 컬렉션 생성 시 고정. 나중에 변경 못 함.
  • 임베딩 모델을 바꾸면 전체 재인덱싱 필요 → 안전한 절차는 Qdrant 인덱스 재빌드 전략.
  • ANN은 근사다 — 100% 재현률을 요구하면 정확도 옵션(ef_search)을 키워야 하고 그만큼 느려진다 → Recall과 ef 튜닝, HNSW 파라미터.

관련

  • ANN(근사 최근접 이웃)
  • HNSW
  • Qdrant
  • 임베딩(Embedding)
  • 코사인 유사도
  • 인덱스(Index)
  • 데이터베이스 MOC

Synapse Map Insight

import chromadb from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction client = chromadb.PersistentClient(path="./chroma_db") collection = client.get_or_create_collection( name="docs", embedding_function=OpenAIEmbeddingFunction(api_key="..."), ) collection.add( ids=["doc1", "doc2"], documents=["환불 정책: 7일 이내...", "배송 정책: 영업일 기준..."], metadatas=[{"type": "refund"}, {"type": "shipping"}], ) results = collection.query( query_texts=["환불 받고 싶어요"], n_results=3, where={"type": "refund"}, # 메타데이터 필터 )