벡터 데이터베이스와 유사도 계산 알고리즘은 대규모 임베딩(벡터) 집합에서 “가장 비슷한” 항목을 빠르게 찾기 위해 사용됩니다. 아래와 같이 구조화해서 살펴보겠습니다.
---
## 1. 벡터 데이터베이스(Vector Database) 개요
- **정의**
임베딩된 벡터(예: 문장 임베딩, 이미지 특징 벡터)를 저장하고, 유사도 검색(Nearest Neighbor Search)을 효율적으로 지원하는 DBMS
- **주요 시스템 비교**
|시스템|언어·라이브러리|인덱스 타입|특징|
|---|---|---|---|
|**FAISS**|C++ / Python|Flat, IVF, HNSW, PQ|Facebook OSS, 로컬 메모리 최적화, 다양한 인덱스 지원|
|**Milvus**|Go / C++|IVF, HNSW, ANNOY, 多種組合|분산 클러스터 지원, GPU 가속, SQL-like query|
|**Pinecone**|Managed Cloud|HNSW 기반|SaaS 형태, 자동 스케일링, 보안·모니터링 내장|
|**Qdrant**|Rust / gRPC|HNSW|Rust 기반 고성능, 실시간 업데이트, Go/Java/Python 클라이언트|
---
## 2. 유사도(Similarity)·거리(Distance) 측정 기법
1. **코사인 유사도(Cosine Similarity)**
cosine(u,v)=u⋅v∥u∥ ∥v∥ \text{cosine}(u,v) = \frac{u \cdot v}{\|u\|\,\|v\|}
- 범위: [−1,1][-1,1]
- 방향성 유사도 측정에 강점
2. **유클리드 거리(Euclidean Distance)**
d(u,v)=∑i=1D(ui−vi)2 d(u,v) = \sqrt{\sum_{i=1}^D (u_i - v_i)^2}
- 크기(절대 차이)에 민감
3. **내적(Dot Product)**
u⋅v=∑i=1Dui vi u \cdot v = \sum_{i=1}^D u_i\,v_i
- 벡터 크기∙방향 모두 반영; 추천 시스템에서 점수(score)로 자주 사용
> **참고**: 실제 구현 시, “코사인 유사도” 대신 “1 – 코사인 유사도”를 거리로 사용하거나, 내적 연산만으로 순위 비교를 하는 경우도 많습니다.
---
## 3. 근사 최근접 이웃 검색(ANN) 알고리즘
### 3.1. 브루트 포스(Exact Search)
- **방법**: 모든 벡터와의 거리를 계산 → 정렬 → 상위 K개 선택
- **장점**: 100% 정확
- **단점**: O(ND)O(ND) 연산, 대규모 데이터에 비현실적
### 3.2. HNSW (Hierarchical Navigable Small World)
- **구조**: 다층 그래프(layered graph)
- **탐색**: 상위 레벨에서 근사 이웃으로 빠르게 이동 후, 하위 레벨에서 미세 탐색
- **특징**:
- 실험적으로 높은 Recall & 낮은 Latency
- 동적 삽입·삭제 지원
### 3.3. IVF (Inverted File) + PQ (Product Quantization)
- **IVF**: 전체 벡터를 k-means로 군집화(centroid) → 쿼리가 속한 클러스터만 검색
- **PQ**: 각 클러스터 내 벡터를 더 작은 서브벡터로 분할 → 코드북(codebook)으로 양자화
- **조합 장점**: 메모리 절감, 속도 향상
### 3.4. LSH (Locality-Sensitive Hashing)
- **아이디어**: 유사한 벡터는 동일 해시 버킷에 배치
- **특징**: 해시 충돌 기반의 근사 이웃 탐색
- **단점**: 해시 함수를 여러 번 설계해야 하며, 정밀도 조율 필요
---
## 4. 설계 시 고려사항
|요소|설명|
|---|---|
|**정확도(Recall)**|ANN 사용 시 전체 정확도를 얼마나 유지할지 (e.g. HNSW의 M, efConstruction 파라미터)|
|**지연(Latency)**|1쿼리당 허용 응답 시간 (ms 단위)|
|**메모리·디스크**|인덱스 구조별 메모리 사용량, 온디스크 저장 여부|
|**동적 업데이트**|삽입/삭제를 얼마나 자주, 빠르게 지원하는가|
|**분산·스케일링**|수십억 벡터 규모에서의 분산 처리 지원 여부|
---
## 5. 간단한 파이썬 예제: 코사인 유사도 계산
```python
import numpy as np
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
"""두 벡터 a, b 간의 코사인 유사도 반환"""
# 1) 내적
dot = np.dot(a, b)
# 2) 크기 곱
norm = np.linalg.norm(a) * np.linalg.norm(b)
return dot / norm
# 예시
vec1 = np.array([0.1, 0.3, 0.5])
vec2 = np.array([0.2, 0.4, 0.4])
print("Cosine Similarity:", cosine_similarity(vec1, vec2))
```
- 이 함수를 모든 벡터에 대해 브루트 포스로 돌리면 정확하지만 느립니다.
- 대규모 검색에는 앞서 소개한 **ANN 인덱스**를 활용하세요.
---
### 요약
1. **벡터 DB**는 임베딩 기반 검색을 효율화
2. **유사도 지표**: 코사인, 유클리드, 내적
3. **검색 알고리즘**: 브루트 포스 vs HNSW, IVF+PQ, LSH
4. **비교 포인트**: 정확도, 지연, 메모리, 업데이트, 분산
필요에 따라 **Milvus**나 **FAISS** 같은 OSS 위에 HNSW/IVF+PQ 인덱스를 구성해 보고, 실제 워크로드(쿼리 패턴, 삽입 빈도 등)에 맞춰 파라미터를 튜닝하는 것을 추천드립니다. 추가 구현 예제나 튜닝 가이드가 필요하시면 말씀해 주세요!