다음을 통해 공유


벡터 검색의 관련성

벡터 쿼리 실행 중 검색 엔진은 유사한 벡터를 찾아 검색 결과에 반환할 최상의 후보를 찾습니다. 벡터 콘텐츠를 인덱싱하는 방법에 따라 관련 일치 항목 검색에서 전체 항목을 검색할 수도 있고 빠른 처리를 위해 검색 대상이 최근접 항목으로 제한될 수도 있습니다. 후보가 발견되면 유사성 메트릭을 사용하여 일치 강도에 따라 각 결과를 채점합니다.

이 문서에서는 관련 일치 항목을 찾는 데 사용되는 알고리즘과 채점에 사용되는 유사성 메트릭을 설명합니다. 또한 검색 결과가 기대에 미치지 못하는 경우 관련성을 개선하기 위한 팁을 제공합니다.

벡터 검색 알고리즘은 다음과 같습니다.

인덱스 또는 searchFields 쿼리에 표시된 searchable 벡터 필드만 검색 및 채점에 사용됩니다.

전체 KNN 정보

전체 KNN은 모든 데이터 요소 쌍 간의 거리를 계산하여 쿼리 지점의 정확한 k 가장 인접한 항목을 찾습니다. 알고리즘은 데이터 포인트의 빠른 임의 액세스가 필요하지 않으므로 KNN은 벡터 인덱스 크기 할당량을 소비하지 않습니다. 그러나 가장 가까운 이웃의 전체 집합을 제공합니다.

전체 KNN은 계산 집약적이므로 중소 데이터 세트에 사용하거나 정밀도가 쿼리 성능의 필요성보다 클 때 사용합니다. 또 다른 사용 사례는 전체 KNN을 사용하여 최근접 이웃 항목의 기본 진리 집합을 빌드할 수 있으므로 ANN 알고리즘의 재현율을 평가하기 위한 데이터 세트를 빌드하는 것입니다.

HNSW 정보

HNSW는 알 수 없거나 변동성이 있는 데이터 분포를 가진 높은 리콜, 낮은 지연 시간 애플리케이션에 최적화된 ANN 알고리즘입니다. 인덱싱하는 동안 HNSW는 데이터 요소를 계층 구조 그래프로 구성하는 추가 데이터 구조를 만듭니다. 쿼리를 실행하는 동안 HNSW는 이 그래프를 탐색하여 가장 관련성이 높은 일치 항목을 찾아 가장 가까운 인접 검색을 효율적으로 수행할 수 있습니다.

HNSW를 사용하려면 벡터 인덱스 크기 할당량을 사용하는 빠른 임의 액세스를 위해 모든 데이터 요소가 메모리에 있어야 합니다. 이 디자인은 검색 정확도와 계산 효율성의 균형을 맞추고, 특히 더 큰 데이터 세트를 검색할 때 대부분의 시나리오에 HNSW를 적합하게 만듭니다.

HNSW는 검색 애플리케이션에 대한 처리량, 대기 시간 및 회수를 최적화하는 몇 가지 튜닝 가능한 구성 매개 변수를 제공합니다. 예를 들어 HNSW를 지정하는 필드는 쿼리 요청 매개 변수 "exhaustive": true를 사용하여 철저한 KNN을 지원합니다. 그러나 exhaustiveKnn로 인덱싱된 필드는 효율적인 검색을 가능하게 하는 추가 데이터 구조가 존재하지 않기 때문에 HNSW 쿼리를 지원하지 않습니다.

ANN 소개

ANN은 벡터 공간에서 일치 항목을 찾기 위한 알고리즘 클래스입니다. 이 알고리즘 클래스는 다양한 데이터 구조 또는 데이터 분할 방법을 사용하여 검색 공간을 크게 줄이고 쿼리 처리를 가속화합니다.

ANN 알고리즘은 일부 정확도를 희생하지만 가장 가까운 근사 항목의 확장 가능하고 빠른 검색을 제공하므로 최신 정보 검색 애플리케이션에서 정확도와 효율성의 균형을 맞추는 데 이상적입니다. 알고리즘의 매개 변수를 조정하여 검색 애플리케이션의 재현율, 대기 시간, 메모리 및 디스크 공간 요구 사항을 미세 조정할 수 있습니다.

Azure AI Search는 ANN 알고리즘에 HNSW를 사용합니다.

가장 인접한 항목 검색의 작동 방식

벡터 쿼리는 동일한 포함 모델에서 생성된 벡터로 구성된 포함 공간을 대상으로 실행됩니다. 일반적으로 쿼리 요청 내의 입력 값은 벡터 인덱스에 포함을 생성한 동일한 기계 학습 모델에 제공됩니다. 출력은 동일한 포함 공간에 있는 벡터입니다. 유사한 벡터가 서로 가깝게 클러스터링되므로, 일치 항목을 찾는 것은 쿼리 벡터와 가장 가까운 벡터를 찾아서 관련 문서를 검색 결과로 반환하는 것과 같습니다.

예를 들어 쿼리 요청이 호텔에 대한 요청인 경우 이 모델은 호텔에 대한 문서를 나타내는 벡터 클러스터의 어딘가에 있는 벡터에 쿼리를 매핑합니다. 유사성 메트릭에 따라 쿼리와 가장 유사한 벡터를 파악하면 가장 관련성이 높은 문서가 결정됩니다.

전체 KNN에 대해 벡터 필드를 인덱싱하면 "모든 인접 항목"에 대해 쿼리가 실행됩니다. HNSW에 대해 인덱싱된 필드의 경우 검색 엔진은 HNSW 그래프를 사용하여 벡터 인덱스 내의 노드 하위 집합을 검색합니다.

HNSW 그래프 만들기

인덱싱하는 동안 검색 서비스는 HNSW 그래프를 생성합니다. 새 벡터를 HNSW 그래프로 인덱싱하는 목표는 가장 인접한 항목을 효율적으로 검색할 수 있는 방식으로 그래프 구조에 추가하는 것입니다. 다음 단계는 프로세스를 요약합니다.

  1. 초기화: 빈 HNSW 그래프로 시작하거나, 새 인덱스가 아닌 경우 기존 HNSW 그래프로 시작합니다.

  2. 진입점: 계층 구조 그래프의 최상위 수준이며 인덱싱의 시작점 역할을 합니다.

  3. 그래프에 추가: 다른 계층적 수준은 그래프의 다른 세분성을 나타내며, 수준이 높을수록 전체를 나타내고 수준이 낮을수록 구체적입니다. 그래프의 각 노드는 벡터 지점을 나타냅니다.

    • 각 노드는 근처에 있는 최대 m개 인접 항목에 연결됩니다. 이것이 m 매개 변수입니다.

    • 후보 연결로 간주되는 데이터 요소의 수는 efConstruction 매개 변수를 통해 제어됩니다. 이 동적 목록은 알고리즘에서 고려해야 할 기존 그래프의 가장 가까운 지점 집합을 형성합니다. efConstruction 값이 높을수록 고려할 노드가 많아지며, 이로 인해 각 벡터의 로컬 환경이 더 조밀해지는 경우가 많습니다.

    • 이러한 연결은 구성된 유사성 metric을 사용하여 거리를 결정합니다. 일부 연결은 서로 다른 계층 수준에서 연결하는 "장거리" 연결이며, 그래프에서 검색 효율성을 향상하는 바로 가기를 만듭니다.

  4. 그래프 정리 및 최적화: 모든 벡터를 인덱싱한 후에 발생할 수 있으며, HNSW 그래프의 탐색성과 효율성을 향상합니다.

벡터 쿼리는 계층 구조 그래프 구조를 탐색하여 일치 항목을 검색합니다. 다음은 이 프로세스를 요약한 것입니다.

  1. 초기화: 알고리즘이 계층 그래프의 최상위 수준에서 검색을 시작합니다. 이 진입점에는 검색의 시작점 역할을 하는 벡터 집합이 포함됩니다.

  2. 트래버스: 다음으로, 알고리즘이 그래프 수준을 수준별로 트래버스하고, 최상위 수준에서 낮은 수준으로 탐색하고, 코사인 유사성과 같이 구성된 거리 메트릭에 따라 쿼리 벡터에 더 가까운 후보 노드를 선택합니다.

  3. 정리: 효율성을 높이기 위해 알고리즘은 가장 인접한 항목이 들어 있을 가능성이 있는 노드만 고려하여 검색 공간을 정리합니다. 이 정리 작업은 잠재적 후보의 우선 순위 큐를 유지하고 검색이 진행됨에 따라 업데이트하는 방식으로 수행됩니다. 이 큐의 길이는 efSearch 매개 변수를 통해 구성합니다.

  4. 구체화: 알고리즘이 점점 더 세분화된 하위 수준으로 이동함에 따라 HNSW는 쿼리 근처에서 더 많은 인접 항목을 고려하므로, 후보 벡터 집합을 구체화하여 정확도를 높일 수 있습니다.

  5. 완료: 가장 인접한 항목을 원하는 만큼 찾았거나 다른 중지 조건이 충족되면 검색이 완료됩니다. 원하는 가장 인접한 항목의 수는 쿼리 시간 매개 변수 k를 통해 제어합니다.

근접성을 측정하는 데 사용되는 유사성 메트릭

이 알고리즘은 유사성을 평가할 후보 벡터를 찾습니다. 이 작업을 수행하기 위해 유사성 메트릭 계산에서 후보 벡터를 쿼리 벡터와 비교하고 유사성을 측정합니다. 이 알고리즘은 발견된 가장 유사한 벡터의 순서가 지정된 집합을 추적하며, 알고리즘이 완료되면 순위가 지정된 결과 집합이 작성됩니다.

메트릭 설명
cosine 이 메트릭은 두 벡터 사이의 각도를 측정하며, 서로 다른 벡터 길이의 영향을 받지 않습니다. 수학적으로 이 메트릭은 두 벡터 사이의 각도를 계산합니다. 코사인은 Azure OpenAI 포함 모델이 사용하는 유사성 메트릭이므로, Azure OpenAI를 사용하는 경우 벡터 구성에서 cosine을 지정하세요.
dotProduct 이 메트릭은 모든 두 벡터 쌍의 길이와 두 벡터 사이의 각도를 모두 측정합니다. 수학적으로 이 메트릭은 벡터의 크기와 두 벡터 간 각도의 곱을 계산합니다. 정규화된 벡터의 경우 이 값은 cosine 유사성과 동일하지만 성능은 약간 더 높습니다.
euclidean (l2 norm라고도 함) 이 메트릭은 두 벡터 간의 벡터 차이 길이를 측정합니다. 수학적으로 이 메트릭은 두 벡터 간의 유클리드 거리를 계산하며, 계산 결과는 두 벡터 간 차이의 l2-norm입니다.

참고

둘 이상의 벡터 쿼리를 병렬로 실행하거나 동일한 요청에서 벡터와 텍스트 쿼리를 결합하는 하이브리드 검색을 수행하는 경우 최종 검색 결과를 채점하는 데 RRF(Reciprocal Rank Fusion)가 사용됩니다.

벡터 검색 결과의 점수

점수가 계산되어 각 일치 항목에 할당되며, 점수가 가장 높은 일치 항목은 k 결과로 반환됩니다. @search.score 속성에 점수가 포함됩니다. 다음 표에는 점수를 분류하는 범위가 나와 있습니다.

검색 방법 매개 변수 채점 메트릭 범위
벡터 검색 @search.score 코사인 0.333~1.00

cosine 메트릭의 경우 계산된 @search.score는 쿼리 벡터와 문서 벡터 간의 코사인 값이 아니라는 점에 유의해야 합니다. 대신, Azure AI Search는 점수 함수가 단조적으로 감소하는 변환을 적용합니다. 즉, 유사성이 떨어질수록 점수 값이 항상 감소합니다. 이렇게 변환하면 검색 점수를 순위 지정에 사용할 수 있습니다.

유사성 점수와 관련하여 미묘한 차이가 있습니다.

  • 코사인 유사성은 두 벡터 간 각도의 코사인으로 정의됩니다.
  • 코사인 거리는 1 - cosine_similarity로 정의됩니다.

단조적으로 감소하는 함수를 만들기 위해 @search.score1 / (1 + cosine_distance)로 정의됩니다.

합성 값 대신 코사인 값이 필요한 개발자는 수식을 사용하여 검색 점수를 다시 코사인 거리로 변환할 수 있습니다.

double ScoreToSimilarity(double score)
{
    double cosineDistance = (1 - score) / score;
    return  -cosineDistance + 1;
}

원래 코사인 값이 있으면 낮은 품질의 결과를 자르는 임계값을 설정하는 사용자 지정 솔루션에서 유용하게 이용할 수 있습니다.

관련성 튜닝 팁

관련 있는 결과를 얻지 못하는 경우 쿼리 구성을 변경해 보세요. 벡터 쿼리에 대한 점수 매기기 프로필 또는 필드나 용어 상승과 같은 튜닝 기능은 없습니다.

  • 청크 크기 및 겹침을 실험합니다. 청크 크기를 늘리고 청크 간의 컨텍스트 또는 연속성을 유지하기에 충분한 겹침이 있는지 확인합니다.

  • HNSW의 경우 다양한 수준의 efConstruction을 시도하여 근접성 그래프의 내부 구성을 변경해 봅니다. 기본값은 400입니다. 범위는 100~1,000입니다.

  • 채팅 모델을 사용하는 경우 k 결과를 늘려 더 많은 검색 결과를 채팅 모델에 제공합니다.

  • 의미 체계 순위 지정을 사용하는 하이브리드 쿼리를 사용해 봅니다. 벤치마크 테스트에서 이 조합은 지속적으로 가장 관련성이 높은 결과를 생성했습니다.

다음 단계