💡 핵심 인사이트 유사도 검색(Similarity Search)은 "정확한 키워드 매칭이 아닌, 의미적/벡터적 유사성을 기반으로 데이터를 검색하는" 기법입니다. 전통적 검색이 "_검색어와 문자열이 정확히 일치하는가?"_를 확인한다면, 유사도 검색은 "_검색어와 의미적으로 가장 비슷한 것은 무엇인가?"_를 판단합니다. **벡터 데이터베이스의 핵심 기능**으로, ChatGPT와 같은 LLM의 RAG(Retrieval-Augmented Generation), 음성/영상 검색, 추천 시스템 등에서 핵심적인 역할을 합니다.
Ⅰ. 유사도 검색의 기본 개념: 비슷한 것을 찾는 수학
유사도 검색의 목표는 **주어진 벡터와 가장相似的 벡터들을 벡터 공간에서 찾는 것**입니다.
[2차원 벡터 공간에서의 유사도 검색]
벡터 공간:
│
1.0 │ ●C
│ /
│ / ← "사과" 벡터와
│ / "딸기" 벡터가 가깝게 위치
│ ●
│ /
│ / ★ (쿼리: "과일 중 빨간 것은?")
│ /
│/ ●
-1.0 └──────────────────●
│ A 1.0
│ (포도)
│
-1.0
결과: ★ (쿼리)로부터 거리순 정렬:
1. 🍎 C (사과): 거리 0.15 ← 가장 유사
2. 🍓 B (딸기): 거리 0.35
3. 🍇 A (포도): 거리 0.72
2가지 핵심 질문:
- "비슷함"을 어떻게定義할 것인가? → 거리 측정 방법 (코사인, 유클리디안 등)
- 수십억 개 벡터에서 빠르게 찾을 것인가? → ANN (Approximate Nearest Neighbor) 알고리즘
Ⅱ. 거리 측정 방식: 유사도를 수학으로
벡터 간 유사도를 측정하는 대표적 방법입니다.
[주요 거리 측정 방식]
1. 코사인 유사도 (Cosine Similarity)
- 두 벡터의 방향이 얼마나相似的か
- 텍스트/문서 검색에 가장 많이 사용
Cosine(A, B) = (A · B) / (|A| × |B|)
예:
A = [1, 2, 3]
B = [1, 2, 3] → Cosine = 1.0 (완전 일치)
C = [2, 4, 6] → Cosine = 1.0 (비율만 다름, 방향 같음)
D = [-1,-2,-3] → Cosine = -1.0 (정반대 방향)
2. 유클리디안 거리 (L2 Distance)
- 두 벡터 간의 직선 거리
- 이미지/생체 인증에 적합
L2(A, B) = √(Σ(Aᵢ - Bᵢ)²)
예:
A = [0, 0] B = [3, 4]
L2(A, B) = √(9+16) = 5
3. 맨해튼 거리 (L1 Distance / Manhattan Distance)
- 각 차원의差的 절대값 합계
- 고차원 공간에서 L2 대신 사용
L1(A, B) = Σ|Aᵢ - Bᵢ|
[,什么时候用什么?]
텍스트/문서 검색 → 코사인 유사도
- 문서 길이에 영향받지 않고 방향(의미)만 비교
- "이 문장과 의미가 가장 비슷한 문서를 찾아라"
이미지/생체 인증 → 유클리디안 거리
- 픽셀 값의 절대적 차이를 비교
- "이 이미지와 가장 비슷한 이미지를 찾아라"
Ⅲ. ANN: 대용량 벡터的高速 검색
정확한 Nearest Neighbor (KNN)는 모든 벡터와 거리 계산 → 수십억 벡터에 비현실적
**ANN(Approximate Nearest Neighbor)**은 정확하지는 않지만 (99%+ 정확도) 엄청나게 빠른 검색을 제공합니다.
[ANN 알고리즘: HNSW 예시]
HNSW (Hierarchical Navigable Small World):
Layer 2: ●━━━━━━━━━━━━━━━━●
/ \
● ●
/ \
Layer 1: ●━━━━●━━━━●━━━━●━━━━●━━━━●
\
Layer 0: ●● ●●●●●●●●●●●●●●●●●●●●●
↑
(세밀한 지역 연결)
탐색 과정:
1. 상위 레이어에서 시작 (빠른 글로벌 탐색)
2. 가장 가까운 노드로 이동
3. 하위 레이어로 이동 (세밀한 지역 탐색)
4. 반복 → 최선의 근접 이웃 발견
시간 복잡도: O(log N) (vs KNN의 O(N))
100만 벡터: KNN=100만 회 计算, ANN=약 20회 计算
IVF (Inverted File Index):
[IVF 동작 원리]
전체 벡터 공간 역색인 구조
┌──────────────────┐ ┌──────────────────┐
│ Centroid 0 │ │ Centroid 0: │
│ ● ● ● ● ● │ ←── │ [v1, v5, v9, v12] │
│ │ │ │
│ Centroid 1 │ │ Centroid 1: │
│ ● ● ● ● ● │ ←── │ [v2, v3, v7, v11] │
│ │ │ │
│ Centroid 2 │ │ Centroid 2: │
│ ● ● ● ● ● │ ←── │ [v4, v6, v8, v10] │
└──────────────────┘ └──────────────────┘
↑
쿼리 벡터 q
q와 가장 가까운 Centroid 1만 탐색
→ v2, v3, v7, v11만 후보로 선정
→ 4개와만 거리 계산 (vs 전체 12개 계산)
Ⅳ. 유사도 검색의 활용 사례
1. RAG (Retrieval-Augmented Generation)
LLM의 환각을 줄이기 위해 유사도 검색을 활용합니다.
[RAG에서 유사도 검색]
사용자 질문: "데이터베이스 트랜잭션 고립화 수준에 대해 설명해줘"
│
│ 임베딩 모델로 벡터화
▼
q = [0.123, -0.456, ...] (1536차원)
│
│ 벡터 DB에서 ANN 검색
▼
┌────────────────────────────────────────────┐
│ 유사도 검색 결과 (Top-5): │
│ │
│ 1. [0.97] "트랜잭션 고립화 수준의 종류..." │
│ 2. [0.94] "MVCC는 어떻게 동작하는가..." │
│ 3. [0.91] "Read Committed의 특징..." │
│ 4. [0.89] "Serializable이란..." │
│ 5. [0.85] "Repeatalbe Read와 Phantom..." │
└────────────────────────────────────────────┘
│
│ LLM에 컨텍스트로 제공
▼
정확한 답변 (문서에 기반)
2. 이미지 유사 검색
[电商平台的相似商品検索]
사용자가"samsung galaxy phone" 이미지를 업로드
│
│ CLIP으로 이미지 벡터화
▼
q = [0.789, -0.123, ...] (512차원)
│
│ 벡터 DB에서 ANN 검색
▼
"비슷한 형태/색상/스타일의 스마트폰" 결과 반환
Ⅴ. 유사도 검색의 실제 적용과 📢 비유
성능 최적화:
-
임베딩 차원 선택: 높을수록 정확하지만 비용↑
- 1536차원 (OpenAI) vs 384차원 (MiniLM) → 속도와 품질 트레이드오프
-
인덱스 파라미터 튜닝: HNSW의 M, efConstruction
- M: 각 노드의 연결 수 (높을수록 정확도↑, 메모리↑)
- efConstruction: 빌드 시 탐색 범위 (높을수록 정확도↑, 빌드 시간↑)
-
필터링과 결합: 벡터 검색 + 메타데이터 필터
- "가격 10만원 이하인商品 중 가장相似的" → Pre-filtering 또는 Hybrid search
정확도 측정:
# Recall@K: 실제 최근접 이웃 중 검색된 비율
recall@k = (검색된 Top-K 중 실제 최근접 이웃인 수) / (실제 최근접 이웃 수)
📢 섹션 요약 비유: 유사도 검색은 **"항항마라톤 경기에서 비슷한 실력의 선수를 찾는 것에 비유"**할 수 있습니다. (전통적 검색이 "이 선수 번호 7번은淘汰인지?")를 "정확히 일치하는 번호로 찾는" 것이라면, (유사도 검색은) "7번 선수와 실력이 가장 비슷한 선수를 찾아라")를 (각 선수의) "경기 기록(벡터)"를 (비교해서) "1位, 3位, 5位 등을 추천하는" 것입니다. 번호(키워드)가 아니라 (경기력(의미))을 비교합니다. 다만 "정확히 2위와 비슷한 선수") (vs) (")3위와 비슷한 선수_") (사이에는) (미세한 차이)가 (존재하듯) (_ ANN은_) (거의 정확한) (결과를) (수 밀리초 만에) (제공하지만) (100% 정확도는) (보장하지) (않는) (점이) (있습니다)。