BM25 関連性スコアリングを構成する

このアーティクルでは、Azure AI Search でフルテキスト検索クエリに使用した BM25 関連性スコアリング アルゴリズムを構成する方法について説明します。 また、以前の検索サービスで BM25 を有効にする方法についても説明します。

BM25 の適用対象:

  • searchable 属性を含むテキスト フィールドで、フルテキスト検索に search パラメーターを使用するクエリ。
  • スコアリングは searchFields にスコープされ、searchFields が null の場合はすべての searchable フィールドにスコープされます。

検索エンジンは BM25 を使用して、指定されたクエリのそれぞれの一致に対して @searchScore を計算します。 一致するドキュメントは検索スコアによって優先度付けされ、上位の結果がクエリの応答として返されます。 同じクエリが同じ検索インデックス上で実行された場合でも、結果にスコアのばらつきが生じる可能性はありますが、通常はこのようなばらつきは小さく、結果の全体的な優先度付けを変えることはありません。

BM25 には、用語の頻度とドキュメントの長さを重み付けするための既定値が含まれています。 既定値がコンテンツに適していない場合は、これらのプロパティをカスタマイズできます。 構成の変更は、スコープが個々のインデックスに設定されている、各インデックスの特性に基づいて関連性スコアリングを調整できます。

既定のスコアリング アルゴリズム

検索サービスの期間に応じて、Azure AI Search では、フルテキスト検索クエリに2 つのスコアリング アルゴリズムがサポートされます:

  • Okapi BM25 アルゴリズム (2020 年 7 月 15 日以降)
  • 従来版類似性アルゴリズム (2020 年 7 月 15 日以前)

BM25 ランク付けは既定値です。この方が、よりユーザーの期待に合致する検索ランキングが生成される傾向があるためです。 これには、ドキュメント サイズなどの要素に基づいて結果をチューニングするためのパラメーターが用意されています。 2020 年 7 月以降に作成された検索サービスでは、BM25 が唯一のスコアリング アルゴリズムです。 新しいサービスで "類似性" を ClassicSimilarity に設定しようとすると、サービスでそのアルゴリズムがサポートされていないため、エラー 400 が返されます。

古いサービスでは、クラシック類似性は既定のアルゴリズムのままになります。 古いサービスはインデックスごとに BM25 にアップグレードできます。 クラシックから BM25 に切り替えると、検索結果の順序にいくらかの違いが発生すると予想されます。

BM25 パラメーターの設定

BM25 ランキングには、関連性スコアの計算を調整するための 2 つのパラメーターが用意されています。

  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 Search ではライブ インデックスの更新が許可されないため、パラメータを追加できるようにインデックスをオフラインにする必要があります。 インデックスがオフラインの間、インデックス作成やクエリの要求は失敗します。 停止の期間は、インデックスの更新にかかる時間です。通常は数秒以下です。 更新が完了すると、インデックスが自動的に復帰します。

  3. "b""k1" をカスタム値に設定し、要求を送信します。

    プロパティ タイプ 説明
    k1 数値 一致する各単語の出現頻度とドキュメントとクエリのペアの最終的な関連性スコアの間のスケーリング関数が制御されます。 値は通常 0.0 から 3.0 で、既定値は 1.2 です。

    0.0 という値は "バイナリ モデル"を表し、一致する 1 つの用語の寄与率は、その用語がテキスト中に何回表示されるかに関係なく、一致するすべてのドキュメントで同じになります。 k1 の値を大きくすると、ドキュメントで同じ用語がより多く見つかると、スコアが増加し続けます。

    より大きな k1 値を使用することは、検索クエリに複数の用語が含まれる場合に重要です。 このような場合、1 つの語句に複数回一致するドキュメントよりも、より多くのクエリ語句に一致するドキュメントを優先する必要がある場合があります。 たとえば、"Apollo Spaceflight" という言葉を問い合わせるとき、"Spaceflight" は出てこないものの "Apollo" という用語が何度も出てくるギリシャ神話に関する記事のスコアを、"Apollo" と "Spaceflight" の両方がほんの数回だけ出てくる別の記事よりも下げることが推奨される場合があります。
    b 数値 ドキュメントの長さが関連性スコアに与える影響が制御されます。 値は 0 から 1 の間で、既定値は 0.75 です。

    値が 0.0 の場合、ドキュメントの長さはスコアに影響しません。 1.0 という値は、関連性スコアにおける用語の頻度による影響がドキュメントの長さによって正規化されることを意味します。

    ドキュメントの長さで単語の出現頻度を正規化することは、長いドキュメントに罰則を科す場合に役立ちます。 ドキュメントが長いと (1 冊の小説全体など)、それより短いドキュメントに比べ、関係のない単語が多く含まれる可能性が高くなります。

以前のサービスで BM25 スコアリングを有効にする

2014 年 3 月から 2020 年 7 月 15 日までの間に作成された検索サービスを実行している場合は、新しいインデックスで "similarity" プロパティを設定して BM25 を有効にできます。 プロパティは新しいインデックスでのみ公開されます。したがって、既存のインデックスで BM25 が必要な場合は、"similarity" プロパティが Microsoft.Azure.Search.BM25Similarity に設定されたインデックスを削除して再構築する必要があります。

"similarity" プロパティを持つインデックスが存在する場合は、BM25Similarity または ClassicSimilarity を切り替えることができます。

次のリンクでは、Azure SDK の類似性プロパティについて説明しています。

クライアント ライブラリ 類似性プロパティ
.NET SearchIndex.Similarity
Java SearchIndex.setSimilarity
JavaScript SearchIndex.Similarity
Python SearchIndex の類似性プロパティ

REST の例

また、REST API を使用することもできます。 次の例では、"similarity" プロパティが 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"
    }
}

関連項目