Vector Search
벡터 검색은 저장된 임베딩 중 쿼리 벡터와 가장 가까운 항목을 찾습니다. 정확한 k-NN 또는 HNSW 및 IVF 같은 근사 인덱스를 사용해 수백만 개의 항목을 빠르게 검색합니다.
벡터 검색은 임베딩이 코사인 유사도, 내적 또는 유클리드 거리와 같은 유사도 측정 기준에서 쿼리 임베딩과 가장 가까운 항목을 검색합니다. 임베딩 모델은 의미나 외관이 유사한 항목을 서로 가까이 배치하므로, 쿼리와 키워드를 공유하지 않더라도 가장 가까운 벡터가 가장 유사한 문서, 이미지 또는 제품을 나타냅니다. 정확 벡터 검색은 저장된 모든 벡터를 대상으로 하는 k-최근접 이웃(k-NN) 조회입니다. 대규모 시스템은 전체 벡터 중 일부만 쿼리와 비교하면서도 실제 이웃을 거의 모두 반환하는 근사 최근접 이웃(ANN) 인덱스를 사용합니다.
벡터 검색의 작동 방식#
쿼리와 저장된 항목은 동일한 모델 또는 함께 학습된 모델 쌍으로 임베딩됩니다. 텍스트에는 문장 인코더, 텍스트와 이미지 매칭에는 CLIP, 이미지 간 매칭에는 비전 백본을 사용할 수 있습니다. 지표는 모델 학습 방식과 일치해야 합니다. 단위 길이 벡터에서는 코사인 유사도와 내적이 같고, 유클리드 거리를 기준으로 순위를 매겨도 순서는 동일합니다. 정확 검색은 쿼리마다 저장된 벡터와 한 번씩 비교하므로 수만 개 벡터에서는 빠르지만 수억 개에서는 너무 느립니다. 따라서 대규모 시스템은 네 가지 유형의 ANN 인덱스 중 하나를 사용합니다.
- HNSW와 같은 그래프 인덱스: 각 벡터를 계층 그래프에서 가까운 이웃과 연결하고, 쿼리 방향으로 탐욕적으로 이동해 응답합니다.
- 클러스터링 인덱스(IVF): k-means로 벡터를 그룹화하고 쿼리와 중심점이 가장 가까운 클러스터만 검색합니다.
- 벡터 양자화: 제품 양자화와 같이 각 벡터를 몇 바이트로 압축하여 메모리에 저장된 작은 코드로 거리를 근사합니다.
- 디스크 기반 그래프: DiskANN처럼 SSD에 그래프 인덱스를 저장하여 단일 머신에서 수십억 개 벡터를 검색합니다.
IVF 인덱스의 핵심 아이디어는 정확 검색과 비교하는 간단한 NumPy 및 scikit-learn 예제로 확인할 수 있습니다.
import numpy as np
from sklearn.cluster import KMeans
# 20,000 embeddings grouped by topic, normalized so a dot product is cosine similarity
rng = np.random.default_rng(0)
topics = rng.normal(size=(200, 64))
vectors = topics[rng.integers(200, size=20000)] + 0.5 * rng.normal(size=(20000, 64))
vectors /= np.linalg.norm(vectors, axis=1, keepdims=True)
query = vectors[0] + 0.1 * rng.normal(size=64)
# Exact search: score every stored vector
exact = np.argsort(-(vectors @ query))[:10]
# IVF index: cluster the vectors, then scan only the lists of the 5 closest centroids
kmeans = KMeans(n_clusters=100, n_init=1, random_state=0).fit(vectors)
probed = np.argsort(-(kmeans.cluster_centers_ @ query))[:5]
candidates = np.flatnonzero(np.isin(kmeans.labels_, probed))
approx = candidates[np.argsort(-(vectors[candidates] @ query))[:10]]
print(f"scanned {len(candidates) / len(vectors):.1%} of vectors")
print(f"recall@10: {len(set(exact) & set(approx)) / 10:.0%}")100개 클러스터 중 5개를 탐색하면 벡터의 5.1%를 스캔하고도 실제 최근접 이웃 10개를 모두 찾아 재현율@10이 100%에 도달합니다. 클러스터를 더 많이 탐색할수록 재현율과 비용이 모두 증가하므로, IVF 인덱스에서 조정할 핵심 설정은 탐색 횟수입니다.
벡터 검색과 관련 용어의 비교#
- 키워드 검색: 역색인에서 정확히 일치하는 용어를 조회하고 BM25와 같은 공식으로 순위를 매깁니다. 이름, 코드, 드문 단어 검색에는 뛰어나지만 동의어는 놓칩니다.
- 시맨틱 검색: 의미를 기준으로 검색하는 방식으로, 벡터 검색이 가장 자주 활용되는 목적입니다. 시맨틱 검색 시스템은 쿼리 재작성이나 재순위화기를 추가로 사용하는 경우가 많습니다.
- 하이브리드 검색: 키워드 검색과 벡터 검색을 함께 실행하고 두 순위 목록을 결합합니다.
- 벡터 데이터베이스: 메타데이터와 함께 벡터를 저장하고 필터링, 업데이트, 영속성을 지원하는 벡터 검색을 제공하는 시스템입니다.
실제 적용 사례#
- 검색 증강 생성(RAG): 언어 모델이 질문에 답하는 데 필요한 문서 구절을 찾습니다.
- 객체 재식별: 사람이나 차량의 외관 임베딩을 이전에 관측된 항목과 비교해 여러 카메라에서 동일한 객체를 연결합니다.
- 안면 인식: 얼굴 임베딩을 등록된 얼굴과 비교하고 충분히 가까운 항목을 선택합니다.
- 추천 시스템: 사용자가 최근 선택한 항목과 임베딩이 가까운 제품, 노래 또는 동영상을 추천합니다.
Ultralytics Platform은 벡터 검색을 사용해 학습 데이터셋을 확장합니다. 유사 이미지 찾기 작업은 선택한 이미지를 기반으로 공개 데이터셋과 사용자의 데이터셋 및 팀 데이터셋에서 임베딩이 가장 가까운 이미지를 검색하고, 유사도 점수와 함께 최대 24개의 결과를 표시합니다. 표시된 이미지는 라벨이 지정되지 않은 학습 이미지로 데이터셋에 추가할 수 있습니다.










