벡터 검색의 관련성

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

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

벡터 검색 알고리즘에는 KNN(k-가장 인접한 항목) 및 HNSW(Hierarchical Navigable Small World)가 포함되어 있습니다.

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

전체 KNN을 사용하는 시기

전체 KNN은 모든 데이터 요소 쌍 간의 거리를 계산하여 쿼리 지점의 정확한 k 가장 인접한 항목을 찾습니다. 높은 재현율이 가장 중요하며 사용자가 쿼리 대기 시간의 득실을 기꺼이 수락하는 시나리오에 적합합니다. 계산 집약적이므로 중소 규모의 데이터 세트에 또는 정밀도 요구 사항이 쿼리 성능 고려 사항보다 높은 경우에 전체 KNN을 사용합니다.

부차적인 사용 사례는 근사 가장 인접한 항목 알고리즘 재현율을 평가하는 데이터 세트를 빌드하는 것입니다. 전체 KNN은 가장 인접한 항목의 참값 집합을 빌드하는 데 사용할 수 있습니다.

전체 KNN 지원은 2023-11-01 REST API, 2023-10-01-Preview REST API 및 두 REST API 버전 중 하나를 대상으로 하는 Azure SDK 클라이언트 라이브러리에서 사용할 수 있습니다.

HNSW를 사용하는 시기

인덱싱하는 동안 HNSW는 더 빠른 검색을 위해 추가 데이터 구조를 만들고, 데이터 요소를 계층적 그래프 구조로 구성합니다. HNSW에는 검색 애플리케이션의 처리량, 대기 시간 및 재현율 목표를 달성하기 위해 튜닝할 수 있는 여러 가지 구성 매개 변수가 있습니다. 예를 들어 쿼리 시 벡터 필드가 HNSW에 대해 인덱싱된 경우에도 전체 검색 옵션을 지정할 수 있습니다.

쿼리를 실행하는 동안 HNSW는 그래프를 탐색하여 빠른 인접 항목 쿼리를 가능하게 합니다. 이 방법은 검색 정확도와 계산 효율성 간에 적절한 균형을 맞춥니다. 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입니다.

벡터 검색 결과의 점수

점수가 계산되어 각 일치 항목에 할당되며, 점수가 가장 높은 일치 항목은 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 결과를 늘려 더 많은 검색 결과를 채팅 모델에 제공합니다.

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

다음 단계