벡터 데이터베이스와 유사도 계산 알고리즘은 대규모 임베딩(벡터) 집합에서 “가장 비슷한” 항목을 빠르게 찾기 위해 사용됩니다. 아래와 같이 구조화해서 살펴보겠습니다. --- ## 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 인덱스를 구성해 보고, 실제 워크로드(쿼리 패턴, 삽입 빈도 등)에 맞춰 파라미터를 튜닝하는 것을 추천드립니다. 추가 구현 예제나 튜닝 가이드가 필요하시면 말씀해 주세요!