Summary#
벡터 유사도 검색에서 코사인 유사도, 내적, L2 거리를 바꿔 써도 항상 같은 결과가 나오는 것은 아니다. 세 척도의 순위가 일치하는 핵심 조건은 비교하는 문서 벡터와 쿼리 벡터가 모두 0이 아닌 단위 벡터라는 것이다. 인덱싱과 쿼리 단계의 정규화 계약이 어긋나면 검색은 실행되더라도 의도한 척도와 다른 순위를 낼 수 있다. (github.com)
Key Points#
- 척도별 의미: 코사인은 벡터의 방향을 비교하고, 원시 내적은 방향과 크기의 영향을 함께 받는다. L2 거리는 두 벡터 사이의 거리를 측정한다. 따라서 정규화하지 않은 임베딩에서는 척도 선택이 순위를 바꿀 수 있다. (github.com)
- 순위 동치의 조건: 문서와 쿼리 벡터가 모두 단위 벡터이면
코사인 유사도 = 내적이고L2 거리² = 2 − 2 × 내적이다. 이때 내적·코사인의 내림차순과 L2 거리의 오름차순은 같은 순위를 뜻하지만, 반환 점수의 값과 해석은 같지 않다. Faiss의 L2 반환값은 제곱 거리다. (github.com) - 대표적 불일치: Faiss에서 내적 인덱스로 코사인 검색을 구현하려면 벡터를 추가하기 전과 쿼리로 검색하기 전에 모두 정규화해야 한다. 한쪽만 정규화하는 구성은 이 코사인 구현 계약을 충족하지 않는다. 다만 고정된 쿼리 하나의 순위만 비교하면 쿼리의 양의 길이 배율은 내적 순위를 바꾸지 않으므로, 모든 불일치를 곧바로 순위 오류라고 단정해서는 안 된다. (github.com)
- 인덱스·쿼리·점수 계약: pgvector는 L2(
<->), 음의 내적(<#>), 코사인 거리(<=>)를 구분하고, 각 척도에 맞는 인덱스 연산자 클래스를 안내한다.<#>를 양의 내적 점수로 읽거나, 코사인 거리와 유사도를 같은 임계값으로 취급하면 점수 해석이 틀어진다. (github.com) - 점검 절차: 사용하려는 임베딩의 척도를 정한 뒤, 저장 벡터와 쿼리 벡터의 노름을 확인하고 정규화·인덱스 척도·쿼리 연산자·점수 변환을 한 계약으로 기록한다. 대표 쿼리의 결과를 정확 검색과 비교하면 척도·전처리 문제와 근사 인덱스의 재현율 문제를 구분하는 데 도움이 된다. pgvector는 기본 정확 검색과 별도의 근사 인덱스를 구분한다. (github.com)
Cautions#
- 코사인 정규화는 벡터의 크기 정보를 제거한다. 크기에 의미가 있는지는 해당 임베딩 모델의 설계와 실제 검색 평가 없이는 판단할 수 없다.
- 위 순위 동치는 0이 아닌 벡터의 단위 정규화 및 동일한 후보 집합에서의 정확한 점수 비교에 관한 수학적 성질이다. 근사 인덱스의 반환 결과까지 반드시 동일하다고 보장하지 않는다. (github.com)
- 특정 서비스에서 검색 품질이 얼마나 저하되는지, 또는 어느 척도가 최선인지는 이 자료만으로 확인되지 않았다.
Sources#
- https://github.com/facebookresearch/faiss/wiki/MetricType-and-distances/a3e007ce5ed56dccfab63e9b6a0d0e792b1e58dc
- https://github.com/pgvector/pgvector/blob/master/README.md
Sagwan Revalidation 2026-10-20T17:11:06Z#
- verdict:
ok - note: 수학적 관계와 도구별 점수 해석이 정확하며, 주의사항도 재사용 가능하다.