다음을 통해 공유


RRF(Reciprocal Rank Fusion)를 사용한 하이브리드 검색의 관련성 점수 매기기

RRF(Reciprocal Rank Fusion)는 이전에 순위가 매겨진 여러 결과의 검색 점수를 평가하여 통합된 결과 집합을 생성하는 알고리즘입니다. Azure AI 검색에서는 동시에 실행되는 쿼리가 두 개 이상 있을 때마다 RRF가 사용됩니다. 각 쿼리는 순위가 매겨진 결과 집합을 생성하며 RRF는 순위를 쿼리 응답에서 반환된 단일 결과 집합으로 병합하고 균질화하는 데 사용됩니다. RRF가 항상 사용되는 시나리오의 예로는 하이브리드 검색과 동시에 실행되는 여러 벡터 쿼리가 있습니다.

RRF는 검색 결과 목록에서 첫 번째 관련 문서 순위의 역수인 상호 순위 개념을 기반으로 합니다. 이 기술의 목표는 원래 순위에 있는 항목의 위치를 고려하고 여러 목록에서 순위가 높은 항목에 더 높은 중요도를 부여하는 것입니다. 이렇게 하면 최종 순위의 전반적인 품질과 안정성을 향상시킬 수 있으므로 여러 순서가 지정된 검색 결과를 통합하는 작업에 더욱 유용합니다.

참고 항목

2024-09-01-preview의 새로운 기능은 RRF 순위 검색 점수를 구성 요소 하위 점수로 분해하는 기능입니다. 이렇게 하면 올업 점수 컴퍼지션에 대한 투명성을 제공합니다. 자세한 내용은 이 문서의 검색 점수 압축 풀기(미리 보기)를 참조하세요.

RRF 순위 지정 작동 방식

RRF는 여러 메서드에서 검색 결과를 가져와 결과의 각 문서에 상호 순위 점수를 할당한 다음, 점수를 결합하여 새 순위를 만드는 방식으로 작동합니다. 여러 검색 방법에서 최상위 위치에 나타나는 문서는 관련성이 더 높을 가능성이 있으며 결합된 결과에서 더 높은 순위를 매겨야 한다는 개념입니다.

다음은 RRF 프로세스에 대한 간단한 설명입니다.

  1. 동시에 실행되는 여러 쿼리에서 순위가 지정된 검색 결과를 가져옵니다.

  2. 각 순위 목록에서 결과에 대한 상호 순위 점수를 할당합니다. RRF는 각 결과 집합의 각 일치 항목에 대해 새 @search.score 항목을 생성합니다. 검색 결과의 각 문서에 대해 엔진은 목록의 위치에 따라 상호 순위 점수를 할당합니다. 점수는 1/(rank + k)로 계산됩니다. 여기서 rank는 목록에서 문서의 위치이고, k은 상수이며 실험적으로 60과 같은 작은 값으로 설정하면 가장 효과적으로 수행되는 것으로 관찰되었습니다. k 값은 RRF 알고리즘의 상수이며 최근접 항목의 수를 제어하는 k와는 완전히 별개입니다.

  3. 점수를 결합합니다. 각 문서에 대해 엔진은 각 검색 시스템에서 얻은 상호 순위 점수를 합산하여 각 문서에 대해 결합된 점수를 생성합니다. 

  4. 엔진은 결합된 점수를 기준으로 문서의 순위를 지정하고 정렬합니다. 결과 목록은 융합 순위입니다.

인덱스에서 searchable로 표시된 필드나 쿼리의 searchFields만 점수 매기기에 사용됩니다. retrievable로 표시된 필드나 쿼리의 select에 지정된 필드만 검색 점수와 함께 검색 결과에서 반환됩니다.

병렬 쿼리 실행

RRF는 둘 이상의 쿼리 실행이 있을 때마다 사용됩니다. 다음 예제에서는 병렬 쿼리 실행이 발생하는 쿼리 패턴을 보여 줍니다.

  • 전체 텍스트 쿼리와 하나의 벡터 쿼리(간단한 하이브리드 시나리오)는 두 개의 쿼리 실행과 같습니다.
  • 전체 텍스트 쿼리와 2개의 벡터 필드를 대상으로 하는 하나의 벡터 쿼리는 3개의 쿼리 실행과 같습니다.
  • 전체 텍스트 쿼리와 5개의 벡터 필드를 대상으로 하는 2개의 벡터 쿼리는 11개의 쿼리 실행과 같습니다.

하이브리드 검색 결과의 점수

결과 순위가 지정될 때마다 @search.score 속성에는 결과 순서를 지정하는 데 사용되는 값이 포함됩니다. 점수는 각 방법에 따라 달라지는 순위 알고리즘에 의해 생성됩니다. 각 알고리즘에는 자체 범위와 크기가 있습니다.

다음 차트는 각 관련성 순위 알고리즘에 대한 각 일치 항목, 알고리즘 및 점수 범위에 대해 반환된 점수 매기기 속성을 식별합니다.

검색 방법 매개 변수 점수 매기기 알고리즘 범위
전체 텍스트 검색 @search.score BM25 알고리즘 상한 없음
벡터 검색 @search.score HNSW 구성에 지정된 유사성 메트릭을 사용하는 HNSW 알고리즘입니다. 0.333 - 1.00(코사인), 유클리드 및 DotProduct의 경우 0 - 1.
하이브리드 검색 @search.score RRF 알고리즘 상한은 융합되는 쿼리 수에 따라 제한되며 각 쿼리는 RRF 점수에 최대 약 1을 기여합니다. 예를 들어 세 개의 쿼리를 병합하면 두 개의 검색 결과만 병합되는 경우보다 더 높은 RRF 점수가 생성됩니다.
의미 체계 순위 지정 @search.rerankerScore 의미 체계 순위 지정 0.00 - 4.00

의미 체계 순위는 결과를 RRF 병합한 후에 발생합니다. 해당 점수(@search.rerankerScore)는 항상 쿼리 응답에서 별도로 보고됩니다. 의미 순위매기기는 전체 텍스트 및 하이브리드 검색 결과를 다시 표시할 수 있습니다. 이러한 결과에는 의미 체계에 풍부한 콘텐츠가 있는 필드가 포함됩니다. 검색 문서에 의미상 관련된 콘텐츠가 포함된 텍스트 필드가 포함된 경우 순수 벡터 쿼리를 다시 표시할 수 있습니다.

하위 점수로 검색 점수 압축 풀기(미리 보기)

2024-09-01-preview를 사용하여 검색 점수를 분해하여 하위 점수를 볼 수 있습니다.

벡터 쿼리의 경우 이 정보는 벡터 가중치 또는 최소 임계값 설정에 적합한 값을 결정하는 데 도움이 될 수 있습니다.

하위 점수를 얻으려면 다음을 수행합니다.

  • 최신 미리 보기 검색 문서 REST API 또는 기능을 제공하는 Azure SDK 베타 패키지를 사용합니다.

  • 의미 체계 순위자를 사용하는 경우 쿼리 요청을 수정하고 vectordebug semantic 매개 변수 집합을 추가합니다all.

다음은 디버그 모드에서 하위 점수를 반환하는 하이브리드 쿼리의 예입니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        },
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "debug": "vector",
    "top": 10
}

가중 점수

2024-07-01 및 최신 미리 보기 API 버전을 사용하여 하이브리드 쿼리에서 벡터 쿼리의 중요도를 높이거나 줄일 수 있습니다.

특정 문서에 대한 RRF를 계산할 때 검색 엔진은 표시되는 각 결과 집합에 대해 해당 문서의 순위를 확인합니다. 문서가 3개의 별도 검색 결과에 표시된다고 가정합니다. 여기서 결과는 벡터 쿼리 2개와 텍스트 BM25 순위 쿼리 1개입니다. 문서의 위치는 각 결과에 따라 다릅니다.

확인된 일치 항목 결과에서의 위치 @search.score 가중치 승수 @search.score(가중)
벡터 결과 1 위치 1 0.8383955 0.5 0.41919775
벡터 결과 2 위치 5 0.81514114 2.0 1.63028228
BM25 결과 위치 10 0.8577363 해당 없음 0.8577363

각 결과 집합에서 문서의 위치는 해당 문서에 대한 최종 RRF 점수를 만들기 위해 추가되는 초기 점수에 해당합니다.

벡터 가중치를 추가하는 경우 초기 점수는 점수를 늘리거나 줄이는 가중치 승수의 적용을 받습니다. 기본값은 1.0입니다. 이것은 가중치가 없으며 초기 점수가 RRF 점수 매기기에서 있는 그대로 사용됨을 의미합니다. 그러나 가중치 0.5를 추가하면 점수가 줄어들고 결합된 순위에서 그 결과가 덜 중요해집니다. 반대로 가중치 2.0을 추가하면 이 점수는 전체 RRF 점수에서 더 큰 요소가 됩니다.

이 예제에서는 @search.score(가중) 값이 RRF 순위 모델에 전달됩니다.

하이브리드 쿼리 응답의 순위가 지정된 결과 수

기본적으로 페이지 매김을 사용하지 않는 경우 검색 엔진은 전체 텍스트 검색의 경우 상위 50개의 순위 일치 항목을 반환하고, 벡터 검색의 경우 가장 유사한 k 일치 항목을 반환합니다. 하이브리드 쿼리에서 top는 응답의 결과 수를 결정합니다. 기본값에 따라 통합 결과 집합의 상위 50개 순위 일치 항목이 반환됩니다.

종종 검색 엔진은 topk보다 더 많은 결과를 찾습니다. 더 많은 결과를 반환하려면 페이징 매개 변수 topskip next를 사용합니다. 페이징은 각 논리 페이지 결과 수를 결정하고 전체 페이로드를 탐색하는 방법입니다. maxTextRecallSize를 더 큰 값(기본값: 1,000)으로 설정하여 하이브리드 쿼리의 텍스트 쪽에서 더 많은 결과를 반환할 수 있습니다.

기본적으로 전체 텍스트 검색에는 일치 항목 최대 1,000개가 적용됩니다(API 응답 제한 참조). 일치 항목 1,000개가 발견되면 검색 엔진은 더 이상 검색하지 않습니다.

자세한 내용은 검색 결과로 작업하는 방법을 참조하세요.

검색 점수 매기기 워크플로의 다이어그램

다음 다이어그램에서는 점수 매기기 프로필 및 의미 체계 순위를 통해 상승하여 키워드 및 벡터 검색 을 호출하는 하이브리드 쿼리를 보여 줍니다.

사전 필터 다이어그램.

이전 워크플로를 생성하는 쿼리는 다음과 같습니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
   "queryType":"semantic",
   "search":"hello world",
   "searchFields":"field_a, field_b",
   "vectorQueries": [
       {
           "kind":"vector",
           "vector": [1.0, 2.0, 3.0],
           "fields": "field_c, field_d"
       },
       {
           "kind":"vector",
           "vector": [4.0, 5.0, 6.0],
           "fields": "field_d, field_e"
       }
   ],
   "scoringProfile":"my_scoring_profile"
}

참고 항목