BM25 관련성 채점 구성

이 문서에서는 Azure AI 검색에서 전체 텍스트 검색 쿼리에 사용하는 BM25 관련성 채점 알고리즘을 구성하는 방법을 알아봅니다. 또한 이전 검색 서비스에서 BM25를 사용하도록 설정하는 방법도 설명합니다.

BM25는 다음에 적용됩니다.

  • searchable 특성이 있는 텍스트 필드에서 전체 텍스트 검색에 search 매개 변수를 사용하는 쿼리입니다.
  • 채점 범위는 searchFields로 지정되거나 searchFields가 null인 경우 모든 searchable 필드로 범위가 지정됩니다.

검색 엔진은 BM25를 사용하여 지정된 쿼리의 각 일치 항목에 대한 @searchScore를 계산합니다. 일치하는 문서는 검색 점수에 따라 순위가 매겨지고 쿼리 응답에서 상위 결과가 반환됩니다. 동일한 검색 인덱스에서 실행되는 동일한 쿼리에서도 결과에 약간의 점수 변형을 얻을 수 있지만 일반적으로 이러한 변형은 작으며 결과의 전체 순위를 변경하지는 않습니다.

BM25에는 용어 빈도 및 문서 길이에 가중치를 부여하는 기본값이 있습니다. 기본값이 콘텐츠에 적합하지 않은 경우 이러한 속성을 사용자 지정할 수 있습니다. 구성 변경은 개별 인덱스로 범위가 지정되므로 각 인덱스의 특성에 따라 관련성 점수를 조정할 수 있습니다.

기본 채점 알고리즘

검색 서비스의 수명에 따라 Azure AI 검색은 전체 텍스트 검색 쿼리에 대해 두 가지 채점 알고리즘을 지원합니다.

  • Okapi BM25 알고리즘(2020년 7월 15일 이후)
  • 클래식 유사성 알고리즘(2020년 7월 15일 이전)

BM25 순위는 사용자의 기대에 더욱 부합하는 검색 순위를 생성하는 경향이 있기 때문에 기본값입니다. 여기에는 문서 크기와 같은 요인에 따라 결과를 튜닝하기 위한 매개 변수가 포함됩니다. 2020년 7월 이후에 만들어진 검색 서비스의 경우 BM25가 유일한 채점 알고리즘입니다. 새 서비스에서 "유사성"을 ClassicSimilarity로 설정하면 서비스에서 해당 알고리즘을 지원하지 않기 때문에 HTTP 400 오류가 반환됩니다.

이전 서비스의 경우 클래식 유사성이 클래식 알고리즘으로 유지됩니다. 이전 서비스는 인덱스별로 BM25로 업그레이드할 수 있습니다. 클래식에서 BM25로 전환하는 경우 검색 결과가 정렬되는 방식에 대한 몇 가지 차이점을 확인할 수 있습니다.

BM25 매개 변수 설정

BM25 순위는 관련성 점수 계산을 조정하기 위한 두 가지 매개 변수를 제공합니다.

  1. 인덱스 만들기 또는 업데이트 요청을 사용하여 BM25 매개 변수를 설정합니다.

    PUT [service-name].search.windows.net/indexes/[index-name]?api-version=2020-06-30&allowIndexDowntime=true
    {
        "similarity": {
            "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
            "b" : 0.75,
            "k1" : 1.2
        }
    }
    
  2. 인덱스가 활성 상태이면 이전 예제에 표시된 요청에 allowIndexDowntime=true URI 매개 변수를 추가합니다.

    Azure AI 검색은 라이브 인덱스에 대한 업데이트를 허용하지 않으므로 매개 변수를 추가할 수 있도록 인덱스를 오프라인으로 전환해야 합니다. 인덱스가 오프라인 상태인 동안에는 인덱싱 및 쿼리 요청이 실패합니다. 중단 기간은 인덱스를 업데이트하는 데 걸리는 시간으로, 일반적으로 몇 초를 넘지 않습니다. 업데이트가 완료되면 인덱스가 자동으로 돌아옵니다.

  3. "b""k1"를 사용자 지정 값으로 설정한 다음, 요청을 보냅니다.

    속성 Type 설명
    k1 number 각 일치 조건의 용어 빈도와 문서 쿼리 쌍의 최종 관련성 점수 간에 크기 조정 함수를 제어합니다. 값은 일반적으로 0.0~3.0이며 기본값은 1.2입니다.

    값 0.0은 "이진 모델"을 나타냅니다. 여기서 해당 용어가 텍스트에 나타나는 횟수에 관계없이 일치하는 모든 문서에 대해 일치하는 단일 용어의 기여도는 동일합니다. k1 값이 클수록 문서에서 동일한 용어의 인스턴스가 더 많이 발견됨에 따라 점수가 계속 증가합니다.

    검색 쿼리에 여러 용어가 포함된 경우 더 큰 k1 값을 사용하는 것이 중요합니다. 이러한 경우 단일 용어만 여러 번 일치하는 문서보다 더 많은 쿼리 용어와 일치하는 문서를 선호할 수 있습니다. 예를 들어 "Apollo Spaceflight"라는 용어를 쿼리할 때 "Apollo"와 "Spaceflight"를 몇 번만 명시적으로 언급한 다른 문서에 비해 "Spaceflight"를 언급하지 않고도 "Apollo"라는 용어가 포함된 그리스 신화에 대한 문서의 점수를 낮출 수 있습니다.
    b number 문서 길이가 관련성 점수에 미치는 영향을 제어합니다. 값은 0에서 1 사이이며 기본값은 0.75입니다.

    값이 0.0이면 문서의 길이가 점수에 영향을 주지 않습니다. 값이 1.0이면 문서 길이에 따라 용어 빈도가 관련성 점수에 미치는 영향이 정규화됩니다.

    문서 길이에 따라 용어 빈도를 정규화하는 것은 긴 문서에 페널티를 주려는 경우에 유용합니다. 어떤 경우에는 긴 문서(예: 완전한 소설)는 짧은 문서에 비해 관련 없는 용어를 많이 포함할 가능성이 더 높습니다.

이전 서비스에서 BM25 점수 매기기 사용

2014년 3월부터 2020년 7월 15일까지 만들어진 검색 서비스를 실행 중인 경우 새 인덱스에 "유사성" 속성을 설정하여 BM25를 사용하도록 설정할 수 있습니다. 이 속성은 새 인덱스에만 표시되므로 기존 인덱스에 BM25를 사용하려면 "유사성" 속성 집합을 Microsoft.Azure.Search.BM25Similarity로 설정하여 인덱스를 삭제하고 다시 빌드해야 합니다.

"유사성" 속성이 있는 인덱스가 존재하면 BM25Similarity 또는 ClassicSimilarity 간에 전환할 수 있습니다.

다음 링크에서는 Azure SDK의 유사성 속성을 설명합니다.

클라이언트 라이브러리 유사성 속성
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python SearchIndex의 유사성 속성

REST 예제

REST API를 사용할 수도 있습니다. 다음 예에서는 "유사성" 속성 집합이 BM25로 설정된 새 인덱스를 만듭니다.

PUT [service-name].search.windows.net/indexes/[index name]?api-version=2020-06-30
{
    "name": "indexName",
    "fields": [
        {
            "name": "id",
            "type": "Edm.String",
            "key": true
        },
        {
            "name": "name",
            "type": "Edm.String",
            "searchable": true,
            "analyzer": "en.lucene"
        },
        ...
    ],
    "similarity": {
        "@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
    }
}

참고 항목