벡터 유사도 검색은 어떻게 동작하는가 - 벡터 DB의 필요성
지난 글에서 텍스트를 임베딩 벡터로 변환하고, 코사인 유사도로 두 벡터가 얼마나 비슷한지 계산할 수 있다는 걸 다뤘습니다. 이번 글에서는 이 유사도 계산을 실제 서비스 규모에서 어떻게 빠르게 수행하는지, 그리고 왜 벡터 DB라는 별도의 저장소가 필요한지 정리합니다.
1. 문서가 적을 땐 그냥 다 비교하면 되지 않을까
문서가 몇십 개 수준이면, 사용자 질문 벡터를 저장된 모든 문서 벡터와 하나씩 비교해도 문제가 없습니다.
질문 벡터 vs 문서1 벡터 → 유사도 계산
질문 벡터 vs 문서2 벡터 → 유사도 계산
질문 벡터 vs 문서3 벡터 → 유사도 계산
...
→ 가장 높은 유사도 순으로 정렬
이 방식을 Brute-force(전수 비교) 검색이라고 부릅니다. 문서가 적을 때는 이걸로 충분합니다.
2. 문서가 많아지면 왜 문제가 되는가
사내 문서가 수십만 건, 수백만 건으로 늘어나면 이야기가 달라집니다. 질문 하나가 들어올 때마다 저장된 벡터 전부와 일일이 거리를 계산해야 하기 때문에, 문서 수에 비례해서 검색 시간이 그대로 늘어납니다.
| 문서 수 | Brute-force 검색 방식 |
|---|---|
| 1,000건 | 즉시 응답 가능 |
| 100,000건 | 응답 지연 체감 시작 |
| 10,000,000건 | 질문마다 수 초 이상 소요, 실서비스 사용 불가 |
RAG는 사용자가 질문을 입력할 때마다 실시간으로 검색이 일어나야 하는 구조이기 때문에, 이 지연은 그대로 서비스 응답 속도 저하로 이어집니다. 그래서 문서 규모가 커질수록 전수 비교가 아닌 다른 방식이 필요해집니다.
3. ANN(근사 최근접 이웃 탐색)이라는 접근
이 문제를 해결하기 위해 실제 벡터 검색 시스템은 정확도를 아주 살짝 포기하는 대신 속도를 크게 얻는 방식을 씁니다. 이를 ANN(Approximate Nearest Neighbor, 근사 최근접 이웃 탐색)이라고 부릅니다.
정확한 검색(Exact Search) : 모든 벡터와 비교 → 100% 정확하지만 느림
근사 검색(ANN) : 유사할 가능성이 높은 후보군만 비교 → 약간의 오차 있지만 훨씬 빠름
"완벽하게 가장 가까운 문서"를 찾는 대신, "거의 확실하게 상위권에 있는 문서들"을 훨씬 빠르게 찾아내는 것이 핵심 아이디어입니다. 실무 RAG 서비스에서는 이 정도의 근사치로도 답변 품질에 큰 차이가 없기 때문에 대부분 ANN 방식을 사용합니다.
4. 대표적인 ANN 알고리즘 - HNSW
현재 가장 널리 쓰이는 방식은 HNSW(Hierarchical Navigable Small World)입니다. 이름이 복잡해 보이지만 아이디어는 비교적 단순합니다.
Layer 2 (성긴 연결) : 대륙에서 대륙으로 이동하듯 큰 폭으로 후보를 좁힘
Layer 1 (중간 연결) : 좁혀진 범위 안에서 다시 세부적으로 탐색
Layer 0 (촘촘한 연결) : 최종 후보들 중 실제로 가장 가까운 것을 확정
전체 벡터를 여러 층의 그래프로 미리 연결해두고, 위층에서 큰 범위를 빠르게 좁힌 다음 아래층에서 정밀하게 탐색하는 방식입니다. 비유하면 지도를 볼 때 국가 단위로 먼저 위치를 좁히고, 그다음 도시, 그다음 동네 순으로 좁혀가는 것과 비슷합니다. 이 구조 덕분에 문서가 수백만 건이어도 검색 속도가 크게 느려지지 않습니다.
5. 벡터 DB가 필요한 이유
이런 ANN 인덱스를 직접 구현하고 운영하는 건 상당히 복잡합니다. 그래서 실무에서는 이 기능을 이미 구현해둔 벡터 DB(Vector Database)를 가져다 씁니다. 벡터 DB는 다음 역할을 대신 처리해줍니다.
- 임베딩 벡터를 저장하고, HNSW 같은 인덱스를 자동으로 구성
- 유사도 검색 API를 제공해서, 질문 벡터만 넘기면 유사한 문서를 즉시 반환
- 문서 추가·삭제 시 인덱스를 다시 관리
- 메타데이터(문서 출처, 작성일 등)와 벡터를 함께 저장해서 필터링 검색 지원
[코드블록 - Text]
사용자 질문 → 임베딩 변환 → 벡터 DB에 질의(query) → 유사 문서 Top-K 반환
즉, 벡터 DB는 "일반 데이터베이스에 유사도 검색 기능이 특화되어 들어간 저장소"라고 이해하면 됩니다.
6. 정리
- 문서 수가 많아지면 모든 벡터를 하나씩 비교하는 방식(Brute-force)은 응답 속도가 급격히 느려집니다.
- ANN(근사 최근접 이웃 탐색)은 약간의 정확도를 포기하는 대신 검색 속도를 크게 높이는 방식이며, HNSW가 대표적인 알고리즘입니다.
- 이런 인덱싱과 검색을 직접 구현하지 않고 가져다 쓸 수 있게 만든 것이 벡터 DB입니다.
지금까지는 검색이 동작하는 원리를 다뤘다면, 다음 글에서는 실제로 어떤 벡터 DB를 선택할지 - Pinecone, Chroma, pgvector를 실무 관점에서 비교해보겠습니다.
'RAG를 활용한 LLM 서비스 구축' 카테고리의 다른 글
| STEP 7 - pgvector 실습 (0) | 2026.07.07 |
|---|---|
| STEP 6 - 벡터 DB 선택하기 (0) | 2026.07.06 |
| STEP 4 - 임베딩이란 (0) | 2026.07.03 |
| STEP 3 - RAG란 무엇인가 (0) | 2026.07.03 |
| STEP 2 - LLM의 한계, Hallucination과 Knowledge Cutoff (0) | 2026.07.03 |