거리 지표

거리 지표 (Distance metrics)

벡터 검색에서 "얼마나 가까운가"를 재는 기준이 바로 거리 지표예요. Weaviate가 결과를 어떤 순서로 반환하고 어떤 점수를 붙이는지는 이 지표 하나가 결정하니까, 컬렉션의 벡터 인덱스를 만들 때 뭘 고를지가 실제 검색 품질로 이어져요. 이 페이지에서는 Weaviate가 지원하는 거리 지표를 하나씩 살펴보면서, 언제 어떤 지표가 어울리는지를 함께 짚어볼게요.

출처: Weaviate 공식 문서 — Distance metrics

사용할 수 있는 거리 지표

별도로 지정하지 않으면 Weaviate의 기본 거리 지표는 cosine이에요. 스키마의 vectorIndexConfig 필드에서 아래 값 중 하나로 바꿀 수 있어요.

거리를 비교할 때 중요한 규칙이 하나 있어요. 어떤 지표든 거리 값이 클수록 유사도가 낮고, 작을수록 유사도가 높아요. 이 방향감각만 잡아두면 아래 표가 헷갈리지 않아요.

이름 설명 정의 범위
cosine 코사인(각) 거리 1 - cosine_sim(a,b) 0 <= d <= 2 0: 동일 벡터, 2: 반대 방향 벡터
dot 내적 기반 거리(정확히는 음의 내적) -dot(a,b) -∞ < d < ∞ -3: -2보다 유사, 2: 5보다 유사
l2-squared 두 벡터 사이의 제곱 유클리드 거리 sum((a_i - b_i)^2) 0 <= d < ∞ 0: 동일 벡터
hamming 각 차원에서 값이 서로 다른 개수 `sum( a_i != b_i )`
manhattan 축 방향으로 직각을 그리며 잰 거리 `sum( a_i - b_i )`

원하는 거리 지표가 없다면 Weaviate에 기여하는 것도 방법이에요. PR을 열면 검토해 준다고 하니, 필요할 때 참고하면 좋겠죠.

몇 가지 짚어둘 만한 세부 사항이 있어요.

  • cosine을 골랐을 때는 모든 벡터가 읽는 시점에 길이 1로 정규화되고, 계산 효율을 위해 내적(dot product)으로 거리를 계산해요.
  • dot은 그 자체로는 유사도 메트릭이에요. 거리로 쓰려면 직관(작은 값 = 더 유사)을 지켜야 하므로, Weaviate는 음의 내적을 반환해요.
  • HFresh 인덱스는 아직 cosinel2-squared 두 지표만 지원해요.

거리 계산 최적화 (SIMD)

일반적인 Weaviate 사용에서는 CPU 시간의 가장 큰 부분이 벡터 거리 계산에 쓰여요. 근사 최근접 이웃(ANN) 인덱스가 계산 횟수를 크게 줄여주긴 하지만, 거리 계산 자체의 효율도 전체 성능에 큰 영향을 줘요.

Weaviate는 아래 표의 순서대로 아키텍처에 맞는 SIMD(단일 명령 다중 데이터) 명령을 사용해서 최적화해요 (예: SVE → Neon).

거리 arm64 amd64
cosine, dot, l2-squared SVE 또는 Neon Sapphire Rapids(AVX512) 또는 AVX2 탑재 환경
hamming, manhattan SIMD 없음 SIMD 없음

API에서 거리 값 다루기

거리는 API에서 두 가지 방식으로 노출돼요.

  • 벡터 검색이 개입될 때 결과의 일부로 표시할 수 있어요. 예를 들어 _additional { distance }로 거리를 조회할 수 있어요.
  • 거리를 제한 기준으로 지정할 수도 있어요. 예를 들어 nearVector({distance: 1.5, vector: ...})처럼 최대 거리를 걸 수 있어요.

Distance vs Certainty

v1.14 이전에는 API에 certainty만 있었어요. certainty는 거리 점수를 0 <= certainty <= 1로 정규화한 값이에요. 여기서 1은 동일 벡터, 0은 반대 방향 벡터를 뜻해요.

그런데 이 개념은 cosine 거리에만 국한돼요. 다른 거리 지표에서는 점수가 무한대로 벌어질 수 있거든요. 그래서 현재는 certainty보다 distance를 쓰는 것이 권장돼요.

호환성을 위해 거리가 cosine일 때는 certainty를 계속 쓸 수 있어요. 하지만 cosine 외의 다른 지표를 고른 순간부터는 certainty를 쓸 수 없어요.

더 알아보기