벡터 검색 시스템의 성능은 "어떻게 가까운 벡터를 빨리 찾아낼 것인가"에 달려 있습니다. 이 문제를 해결하는 두 가지 대표적인 방식이 바로 브루트포스(naive) 검색과 인덱싱 기반 검색입니다. 두 방식의 개념과 차이점을 아래와 같이 설명할 수 있습니다.
브루트포스 검색은 말 그대로 "무식하게 다 비교해보는" 방식입니다. 벡터 데이터베이스에 저장된 모든 벡터를 하나하나 순회하면서, 쿼리 벡터와의 유사도를 일일이 계산합니다. 그리고 유사도가 가장 높은(거리 기준으로는 가장 가까운) 벡터들을 상위 N개 골라냅니다.
만약 DB에 100만 개의 벡터가 있다면, 쿼리 한 번에 대해 100만 번의 유사도 계산이 필요합니다.
인덱싱 기반 방식은 모든 벡터를 다 비교하는 것이 아니라, 검색 속도를 높이기 위해 특정 구조(인덱스)를 미리 만들어 놓고 쿼리 시 그 구조를 따라 빠르게 유사한 벡터만 골라내는 방식입니다. 대표적인 인덱싱 기법으로는 다음과 같은 것들이 있습니다:
100만 개 중에 모든 벡터를 비교하지 않고, 유사할 가능성이 높은 1~2만 개만 선택적으로 비교합니다.
항목 | 브루트포스 검색 | 인덱싱 기반 검색 |
---|---|---|
정확도 | 높음 (100%) | 보통 약간 손실 있음 (95~99%) |
속도 | 느림 | 빠름 |
구현 난이도 | 낮음 | 중간~높음 |
확장성 | 낮음 (작은 데이터셋에 적합) | 높음 (대규모에 적합) |
리소스 효율 | 비효율적 | 효율적 |
브루트포스 방식은 작고 정밀한 데이터셋에 적합하고, 인덱싱 기반 방식은 대규모 데이터셋에서 빠른 응답 속도를 요구하는 실제 서비스에 적합합니다.
실제로 대부분의 벡터 DB(Faiss, Qdrant, Milvus 등)는 두 가지 방식 모두 지원하며, 사용자 요구에 맞게 선택하거나 자동 전환 기능을 제공하기도 합니다.