벡터 데이터베이스가 등장한 배경과 전통 데이터베이스와의 차이점, 유사도 검색 원리, ANN 알고리즘의 필요성, 그리고 주요 벡터 데이터베이스 생태계를 개괄합니다.
최근 몇 년간 AI와 머신러닝의 급격한 발전은 데이터를 다루는 방식 자체를 바꾸고 있습니다. **LLM(Large Language Model)**이 보편화되면서, 텍스트, 이미지, 오디오 등 비정형 데이터를 수치 벡터로 변환하여 활용하는 패턴이 표준이 되었습니다. 이 수치 벡터를 **임베딩(Embedding)**이라 부릅니다.
문제는 이 임베딩 벡터를 효율적으로 저장하고 검색하는 것입니다. 수백만에서 수십억 개의 고차원 벡터 중에서 "가장 유사한 것"을 밀리초 단위로 찾아내야 하는 요구사항은 전통적인 데이터베이스로는 해결할 수 없습니다.
벡터 데이터베이스는 단순한 유행이 아닙니다. RAG(Retrieval-Augmented Generation), 추천 시스템, 이미지 검색, 이상 탐지 등 현대 AI 애플리케이션의 핵심 인프라입니다.
전통적인 관계형 데이터베이스는 **정확한 일치(exact match)**를 기반으로 설계되었습니다. WHERE name = 'vector' 같은 쿼리는 인덱스를 통해 빠르게 처리됩니다. 하지만 "이 문장과 의미적으로 가장 비슷한 문장을 찾아라"는 질의는 근본적으로 다른 문제입니다.
| 특성 | 관계형 DB | 벡터 DB |
|---|---|---|
| 데이터 모델 | 행과 열 (정형) | 고차원 벡터 (비정형) |
| 쿼리 방식 | 정확한 일치, 범위 검색 | 유사도 기반 근사 검색 |
| 인덱스 | B-Tree, Hash | HNSW, IVF, DiskANN |
| 결과 | 정확한 결과 집합 | 유사도 순위 기반 근사 결과 |
| 확장 대상 | 트랜잭션 처리량 | 벡터 검색 처리량 (QPS) |
핵심 차이점은 검색 패러다임 자체가 다르다는 것입니다. 관계형 DB가 "같은 것을 찾는" 도구라면, 벡터 DB는 "비슷한 것을 찾는" 도구입니다.
벡터 공간에서 두 벡터의 "유사함"을 측정하는 방법은 여러 가지가 있습니다. 가장 널리 사용되는 세 가지 메트릭을 살펴보겠습니다.
두 벡터 사이의 각도를 기반으로 유사도를 측정합니다. 벡터의 크기(magnitude)에 영향받지 않으므로 텍스트 임베딩에서 가장 많이 사용됩니다. 결과값은 -1에서 1 사이이며, 1에 가까울수록 유사합니다.
import numpy as np
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 예시: 두 문장의 임베딩 벡터
vec_a = np.array([0.1, 0.3, 0.5, 0.7])
vec_b = np.array([0.2, 0.4, 0.4, 0.6])
similarity = cosine_similarity(vec_a, vec_b)
print(f"코사인 유사도: {similarity:.4f}") # 0.9878두 벡터 사이의 직선 거리를 측정합니다. 값이 작을수록 유사합니다. 벡터의 크기가 의미를 가지는 경우에 적합합니다.
두 벡터의 내적으로 유사도를 측정합니다. 값이 클수록 유사합니다. 정규화된 벡터에서는 코사인 유사도와 동일한 결과를 냅니다. 계산이 가장 빠르므로 정규화된 임베딩에서 성능을 최적화할 때 선호됩니다.
N개의 벡터 중에서 가장 유사한 K개를 찾는 KNN(K-Nearest Neighbor) 검색은 모든 벡터와의 거리를 계산해야 합니다. 이는 **O(N x D)**의 시간 복잡도를 가집니다(N은 벡터 수, D는 차원 수).
1,000개의 벡터라면 문제가 없지만, 1억 개의 1536차원 벡터라면 단일 쿼리에 수십 초가 걸립니다. 실시간 서비스에서는 사용할 수 없는 수준입니다.
이 문제를 해결하는 것이 ANN(Approximate Nearest Neighbor) 알고리즘입니다. ANN은 100% 정확한 결과 대신 "거의 정확한" 결과를 수십 밀리초 내에 반환합니다. **Recall(재현율)**이라는 지표로 정확도를 측정하며, 대부분의 실용적 시나리오에서 95% 이상의 recall을 달성합니다.
실제 프로덕션 환경에서는 recall 95-99%의 ANN이 recall 100%의 KNN보다 훨씬 실용적입니다. 1% 미만의 정확도 손실 대비 수백 배의 속도 향상을 얻을 수 있기 때문입니다.
벡터 데이터베이스들이 사용하는 주요 ANN 인덱스 알고리즘을 간략히 살펴보겠습니다. 각 알고리즘은 이후 장에서 깊이 있게 다룹니다.
다층 그래프 구조로 벡터를 연결하여 검색합니다. 높은 검색 속도와 recall을 동시에 달성하지만, 모든 벡터를 메모리에 올려야 합니다. 1억 개 미만의 인메모리 워크로드에 최적입니다.
벡터 공간을 여러 클러스터로 분할한 뒤, 쿼리 벡터와 가까운 클러스터만 탐색합니다. 빌드 속도가 빠르고 메모리 효율적이며, **PQ(Product Quantization)**와 결합하면 수십억 규모에서도 작동합니다.
SSD 기반으로 동작하는 알고리즘으로, 메모리 제약이 있는 환경에서 10억 개 이상의 벡터를 처리할 수 있습니다. Microsoft Research에서 개발했으며, 메모리 대비 뛰어난 비용 효율을 보여줍니다.
현재 벡터 데이터베이스 생태계는 크게 전용 솔루션과 확장 솔루션으로 나뉩니다.
| 솔루션 | 특징 | 배포 형태 |
|---|---|---|
| Pinecone | 완전 관리형, 서버리스, SOC2/HIPAA | 클라우드 전용 |
| Weaviate | 오픈소스, GraphQL API, 내장 벡터라이저 | 셀프호스트 + 클라우드 |
| Qdrant | Rust 기반 고성능, 풍부한 필터링 | 셀프호스트 + 클라우드 |
| Milvus | 분산 아키텍처, GPU 가속 | 셀프호스트 + Zilliz Cloud |
| Chroma | 경량, 로컬 개발 최적화 | 로컬 + 클라우드 |
| 솔루션 | 기반 | 특징 |
|---|---|---|
| pgvector | PostgreSQL | 트랜잭션 일관성, 기존 인프라 활용 |
| Elasticsearch | Lucene | kNN 검색 + 전문 검색 통합 |
| Redis | Redis | RediSearch 모듈, 인메모리 고속 |
각 솔루션의 선택 기준은 데이터 규모, 성능 요구사항, 운영 역량, 비용 등에 따라 달라집니다. 6장부터 8장까지 주요 솔루션을 심층적으로 비교 분석합니다.
벡터 데이터베이스 선택은 "최고의 솔루션"을 고르는 것이 아니라, 자신의 요구사항에 "가장 적합한 솔루션"을 고르는 것입니다. 11장에서 의사결정 프레임워크를 제시합니다.
이 시리즈는 총 11장으로 구성되어 있으며, 다음과 같은 흐름으로 진행됩니다.
이번 장에서는 벡터 데이터베이스가 등장한 배경과 핵심 개념을 살펴보았습니다. 전통적인 데이터베이스가 정확한 일치 검색에 최적화되어 있다면, 벡터 데이터베이스는 유사도 기반 근사 검색에 최적화되어 있습니다. ANN 알고리즘을 통해 약간의 정확도를 희생하는 대신 수백 배의 속도 향상을 얻을 수 있으며, 이것이 현대 AI 애플리케이션의 실시간 서비스를 가능하게 합니다.
다음 장에서는 벡터 데이터베이스의 입력이 되는 **임베딩(Embedding)**의 원리와 유사도 메트릭을 깊이 있게 다룹니다. 텍스트, 이미지, 멀티모달 임베딩 모델의 차이와 선택 기준을 함께 살펴보겠습니다.
이 글이 도움이 되셨나요?
임베딩의 원리와 텍스트, 이미지, 멀티모달 임베딩 모델을 비교하고, 유사도 메트릭의 수학적 배경과 차원의 저주, 임베딩 모델 선택 가이드를 다룹니다.
HNSW 알고리즘의 원리를 NSW 그래프에서부터 다층 구조까지 단계별로 분석하고, 핵심 파라미터 튜닝과 성능 특성, 적합한 사용 시나리오를 다룹니다.
IVF 클러스터링 기반 검색과 Product Quantization의 원리를 분석하고, IVF+PQ 조합의 대규모 데이터셋 최적화 전략과 메모리-정확도 트레이드오프를 다룹니다.