임베딩으로 텍스트를 벡터로 변환했다면, 이제 “질문 벡터”와 “문서 벡터”가 얼마나 가까운지 수학적으로 측정해야 합니다. 이 페이지에서는 세 가지 주요 유사도 측정 방법을 깊이 있게 비교합니다.
Cosine Similarity (코사인 유사도)
핵심 직관: “방향이 같으면 의미가 같다”
두 벡터의 각도 를 측정합니다. 방향이 같으면(각도 0) 유사도 1, 수직이면(각도 90) 유사도 0, 반대 방향이면(각도 180) 유사도 -1입니다.2D 시각화로 이해하기
- 같은 방향 (θ ≈ 0°): “AI 모델 최적화” ↔ “ML 모델 튜닝” → cos ≈ 1.0
- 수직 (θ ≈ 90°): “AI 모델 최적화” ↔ “오늘 날씨가 좋다” → cos ≈ 0.0
- 반대 방향 (θ ≈ 180°): 실제 임베딩에서는 거의 발생하지 않음
수식
문서 길이에 영향받지 않는 이유
코사인 유사도는 벡터의 방향만 비교하고 크기는 무시 합니다. 이것이 텍스트 검색에서 핵심적인 장점입니다. 예를 들어, 같은 주제를 다루는 100단어 문서와 10,000단어 문서가 있다고 합시다. 임베딩 벡터의 크기(magnitude)는 다를 수 있지만, 방향은 비슷합니다. 코사인 유사도는 크기를 정규화하므로 문서 길이와 무관하게 의미적 유사성 만을 측정합니다.
참고
수식을 자연어로: 분모의 ||A|| × ||B||가 핵심입니다. 이 부분이 벡터의 크기를 나누어 단위 벡터(방향만 남은 벡터) 로 만들어주기 때문에, 결과적으로 순수한 방향의 일치도만 계산됩니다.
Euclidean Distance (유클리드 거리)
핵심 직관: “공간에서의 직선 거리”
두 점 사이의 직선 거리를 측정합니다. 지도에서 두 도시 사이의 거리를 자로 재는 것과 같습니다.수식
코사인 유사도와의 차이
| 특성 | Cosine Similarity | Euclidean Distance |
|---|---|---|
| 측정 대상 | 방향(각도) | 절대 거리 |
| 벡터 크기 영향 | 없음 (정규화) | 있음 |
| 값 범위 | -1 ~ 1 | 0 ~ ∞ |
| 비슷할수록 | 값이 큼(→ 1) | 값이 작음(→ 0) |
| 사용 시나리오 | 의미적 유사도 (대부분의 RAG) | 클러스터링, 이상 탐지 |
언제 사용하는가?
유클리드 거리는 벡터의 절대적 위치 가 중요할 때 사용합니다. 예를 들어, 이상 탐지(anomaly detection)에서 “정상 데이터 군집에서 얼마나 떨어져 있는가”를 측정할 때 유용합니다. RAG의 의미 검색에서는 코사인 유사도가 더 적합합니다.Dot Product (내적)
핵심 직관: “방향 + 크기를 모두 고려”
Cosine과의 관계
Σ(a_i × b_i)로 곱셈 N번 + 덧셈 N번이면 끝나지만, 코사인 유사도는 내적 계산에 더해 ||A||와 ||B||를 각각 구해야 하므로 제곱 연산 2N번 + 제곱근 2번 + 나눗셈 1번이 추가됩니다. 벡터가 이미 정규화되어 있으면 이 추가 연산이 모두 불필요해지므로, 같은 결과를 더 적은 연산으로 얻을 수 있습니다.
참고 성능 팁: 정규화된 벡터에서는 내적(Dot Product)이 코사인 유사도보다 계산이 빠릅니다. 나눗셈 연산이 없기 때문입니다. 대규모 벡터 검색에서 이 차이가 누적되면 유의미한 성능 향상이 됩니다.
실무 선택 가이드
대부분 Cosine Similarity가 최선인 이유
- 정규화 불필요: 임베딩 모델의 출력이 정규화되지 않아도 올바르게 동작
- 직관적 해석: 0~1 범위로 “50% 유사하다” 같은 해석이 가능
- 문서 길이 무관: 짧은 문서와 긴 문서를 공정하게 비교
- 업계 표준: Databricks Vector Search, Pinecone, Weaviate 등 대부분의 벡터 DB 기본값
의사결정 트리
참고 Databricks Vector Search 는 기본적으로 Cosine Similarity를 사용합니다. 인덱스 생성 시 별도 설정 없이도 가장 적합한 유사도 측정이 자동 적용됩니다.
다음: 유사도를 계산하는 방법을 알았으니, 수백만 벡터에서 빠르게 검색하는 방법을 알아봅시다 → 벡터 인덱스 & ANN