Skip to main content
임베딩으로 텍스트를 벡터로 변환했다면, 이제 “질문 벡터”와 “문서 벡터”가 얼마나 가까운지 수학적으로 측정해야 합니다. 이 페이지에서는 세 가지 주요 유사도 측정 방법을 깊이 있게 비교합니다.

Cosine Similarity (코사인 유사도)

핵심 직관: “방향이 같으면 의미가 같다”

두 벡터의 각도 를 측정합니다. 방향이 같으면(각도 0) 유사도 1, 수직이면(각도 90) 유사도 0, 반대 방향이면(각도 180) 유사도 -1입니다.

2D 시각화로 이해하기

        ↑ 차원 2 (예: "기술적" 정도)
        |
        |   /  "AI 모델 성능 최적화" (기술적, 긍정적)
        |  / θ=15°
        | /___  "ML 모델 튜닝 가이드" → cosine = 0.97 (매우 유사)
        |
--------+--------→ 차원 1 (예: "긍정적" 정도)
        |
        |
        ↓  "오늘 날씨가 좋다" → cosine ≈ 0 (수직 = 무관)
  • 같은 방향 (θ ≈ 0°): “AI 모델 최적화” ↔ “ML 모델 튜닝” → cos ≈ 1.0
  • 수직 (θ ≈ 90°): “AI 모델 최적화” ↔ “오늘 날씨가 좋다” → cos ≈ 0.0
  • 반대 방향 (θ ≈ 180°): 실제 임베딩에서는 거의 발생하지 않음

수식

cosine_similarity(A, B) = (A · B) / (||A|| × ||B||)

여기서:
- A · B = 두 벡터의 내적 (각 차원의 곱을 모두 합산)
- ||A|| = 벡터 A의 크기 (각 차원의 제곱합의 제곱근)

문서 길이에 영향받지 않는 이유

코사인 유사도는 벡터의 방향만 비교하고 크기는 무시 합니다. 이것이 텍스트 검색에서 핵심적인 장점입니다. 예를 들어, 같은 주제를 다루는 100단어 문서와 10,000단어 문서가 있다고 합시다. 임베딩 벡터의 크기(magnitude)는 다를 수 있지만, 방향은 비슷합니다. 코사인 유사도는 크기를 정규화하므로 문서 길이와 무관하게 의미적 유사성 만을 측정합니다.
참고 수식을 자연어로: 분모의 ||A|| × ||B||가 핵심입니다. 이 부분이 벡터의 크기를 나누어 단위 벡터(방향만 남은 벡터) 로 만들어주기 때문에, 결과적으로 순수한 방향의 일치도만 계산됩니다.

Euclidean Distance (유클리드 거리)

핵심 직관: “공간에서의 직선 거리”

두 점 사이의 직선 거리를 측정합니다. 지도에서 두 도시 사이의 거리를 자로 재는 것과 같습니다.

수식

euclidean_distance(A, B) = √(Σ(a_i - b_i)²)

각 차원에서의 차이를 제곱하여 합산한 뒤, 제곱근을 취합니다.
동작 원리를 2D 예시로 풀면: 벡터 A = [3, 4], 벡터 B = [1, 2]일 때, 각 차원의 차이는 [2, 2]이고, 제곱합은 4+4=8, 제곱근은 √8 ≈ 2.83입니다. 3차원이면 피타고라스 정리를 3번 적용하는 것이고, 768차원이면 768번 적용하는 것입니다. 차원이 높아져도 원리는 동일 합니다. 유클리드 거리가 텍스트 검색에서 코사인 유사도보다 덜 선호되는 근본적 이유는 “차원의 저주(curse of dimensionality)” 때문입니다. 고차원 공간(768차원 이상)에서는 모든 점 쌍의 유클리드 거리가 비슷한 값으로 수렴하는 현상이 발생합니다. 즉, 가장 가까운 점과 가장 먼 점의 거리 차이가 상대적으로 줄어들어 판별력이 떨어집니다. 반면 코사인 유사도는 방향(각도)만 측정하므로 이 현상에 덜 민감합니다.

코사인 유사도와의 차이

특성Cosine SimilarityEuclidean Distance
측정 대상방향(각도)절대 거리
벡터 크기 영향없음 (정규화)있음
값 범위-1 ~ 10 ~ ∞
비슷할수록값이 (→ 1)값이 작음(→ 0)
사용 시나리오의미적 유사도 (대부분의 RAG)클러스터링, 이상 탐지

언제 사용하는가?

유클리드 거리는 벡터의 절대적 위치 가 중요할 때 사용합니다. 예를 들어, 이상 탐지(anomaly detection)에서 “정상 데이터 군집에서 얼마나 떨어져 있는가”를 측정할 때 유용합니다. RAG의 의미 검색에서는 코사인 유사도가 더 적합합니다.

Dot Product (내적)

핵심 직관: “방향 + 크기를 모두 고려”

dot_product(A, B) = Σ(a_i × b_i)

= ||A|| × ||B|| × cos(θ)
내적은 코사인 유사도의 분자 부분입니다. 벡터가 정규화되어 있으면(||A|| = ||B|| = 1), 내적과 코사인 유사도는 수학적으로 동일 합니다.

Cosine과의 관계

cosine_similarity = dot_product / (||A|| × ||B||)

만약 ||A|| = 1 이고 ||B|| = 1 이면:
cosine_similarity = dot_product  ← 동일!
대부분의 현대 임베딩 모델(BGE, E5 등)은 출력 벡터를 L2 정규화 (벡터의 각 요소를 벡터 크기로 나누어 전체 크기를 1로 만드는 연산)하여 크기를 1로 만듭니다. 이 경우 내적이 더 빠르면서 코사인과 동일한 결과를 제공합니다. 내적이 더 빠른 이유는 연산량의 차이에 있습니다. 내적은 Σ(a_i × b_i)로 곱셈 N번 + 덧셈 N번이면 끝나지만, 코사인 유사도는 내적 계산에 더해 ||A||||B||를 각각 구해야 하므로 제곱 연산 2N번 + 제곱근 2번 + 나눗셈 1번이 추가됩니다. 벡터가 이미 정규화되어 있으면 이 추가 연산이 모두 불필요해지므로, 같은 결과를 더 적은 연산으로 얻을 수 있습니다.
참고 성능 팁: 정규화된 벡터에서는 내적(Dot Product)이 코사인 유사도보다 계산이 빠릅니다. 나눗셈 연산이 없기 때문입니다. 대규모 벡터 검색에서 이 차이가 누적되면 유의미한 성능 향상이 됩니다.

실무 선택 가이드

대부분 Cosine Similarity가 최선인 이유

  1. 정규화 불필요: 임베딩 모델의 출력이 정규화되지 않아도 올바르게 동작
  2. 직관적 해석: 0~1 범위로 “50% 유사하다” 같은 해석이 가능
  3. 문서 길이 무관: 짧은 문서와 긴 문서를 공정하게 비교
  4. 업계 표준: Databricks Vector Search, Pinecone, Weaviate 등 대부분의 벡터 DB 기본값

의사결정 트리

임베딩 벡터가 정규화되어 있는가?
├── Yes → Dot Product (빠르고 Cosine과 동일한 결과)
└── No  → Cosine Similarity (안전한 선택)
         ↳ 절대 거리가 중요한가?
            └── Yes → Euclidean Distance (클러스터링, 이상 탐지)
참고 Databricks Vector Search 는 기본적으로 Cosine Similarity를 사용합니다. 인덱스 생성 시 별도 설정 없이도 가장 적합한 유사도 측정이 자동 적용됩니다.

다음: 유사도를 계산하는 방법을 알았으니, 수백만 벡터에서 빠르게 검색하는 방법을 알아봅시다 → 벡터 인덱스 & ANN