ブログ

最小スコアで意味的精度を確保

最小スコアしきい値を採用することで意味的精度を向上させます。この記事にはセマンティック検索とハイブリッド検索の具体的な例が含まれています。

セマンティック検索は、検索の関連性を高めるための無限の機会をもたらしました。ELSER、E5、Jina Embedding v4などの高品質な高密度・低密度モデルは、キーワードの一致ではなく、単語の意味に基づいて関連性の高い結果を返します。ただし、セマンティック検索では、テールで無関係な結果が返されたり、インデックス内に関連する結果がないクエリに対して無関係な結果が返されることがあります。この低密度モデルと高密度モデルの特性により、ユーザーを混乱させたり、大規模言語モデル(LLM)の貴重なトークンを無駄にしたりする可能性があります。

この記事では、最小スコアパラメータを使用して、セマンティック検索結果の精度を高める方法を学びます。このブログ記事で示された例を試したい場合は関連するJupyterノートブックをご覧ください。

背景:精度と再現率

検索の関連性において、精度再現率は重要な概念です。まだご存知でない読者の方は、これについて一読されることをおすすめします。以下は要約です。

  • 精度:返される検索結果のうち、ユーザーに関連するものの割合。

  • 再現率:コーパス内のすべての関連ドキュメントのうち、検索結果セットに含まれるドキュメントの割合。

つまり、言い換えれば、精度とは関連する結果のみを返すことであり、再現率はすべての関連する結果を返すことです。ご想像のとおり、これらは競合する要件であることが多いです。セマンティック検索は再現率が非常に高い傾向がありますが、精度に問題が生じる可能性があります。以下では、この特性について説明します。

最小スコアパラメーターの導入

「min_score」パラメーターを使用すると、最小スコアを設定して精度を向上させることができます。これにより、定義されたしきい値未満のスコアを持つ一致が削除され、結果セットが切り捨てられます。以下は簡単な例です。

GET search-movies/_search
{
  "retriever": {
    "linear": {
      "min_score": 4,
      "retrievers": [
        ...
      ]
    }
  }
}

スコアの正規化

最小スコアを設定するのは良いことですが、すべてのセマンティックモデルが静的しきい値に適したスコアを返すわけではありません。例えば、ELSERは無制限のスコアを返します。一部の高密度モデルのスコアは密集してクラスター化されており、特定のクエリのコンテキストでのみ意味を持ちます。

ほとんどのセマンティック検索では、「min_score」を適用する前に正規化アプローチを使用することをお勧めします。正規化により、ドキュメントのスコアが定義された範囲内に収まるようになります。Elasticsearchレトリバーは、「l2_norm」と「minmax」という2つの正規化機能を提供します。最もよく使用されるのは「minmax」です。これは理解しやすく、多くのシナリオでうまく機能するためです。「minmax」の主な特性は次のとおりです。

  • ドキュメントのスコアは0から1の間で配分されます。

  • 最も高いスコアを持つドキュメントには常に1のスコアが付けられます。

  • 最も低いスコアを持つドキュメントには常に0のスコアが付けられます。

    • これにより、キーワード検索に適さなくなる可能性があります。詳細については「ハイブリッド検索」セクションをご覧ください。

以下は、 min_scoreを使用した正規化されたセマンティッククエリの例です。ランクウィンドウのサイズが500に増え、100から始まるより長い検索結果のリストを返すことができます。

GET search-movies/_search
{
  "size": 100,
  "_source": [
    "title", "overview"
  ],
  "retriever": {
    "linear": {
      "rank_window_size": 500,
      "min_score": 0.25,
      "retrievers": [
        {
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "overview_vector",
                  "query": "superhero movie"
                }
              }
            }
          }
        }
      ]
    }
  }
}

サイズは、通常の本番環境で見られるサイズよりも高い値に設定されています。これは、検索結果の品質を検査し、結果を調整できるようにするためです。

線形レトリバーを使用したハイブリッド検索

ハイブリッド検索の場合、最も簡単な方法は、すべてのスコアを正規化し、重みを割り当て、最小スコアを適用することです。合計が1になる重みを選択すると、合計スコアが0~1の範囲内に保たれることに注意してください。これにより、最終スコアの理解やmin_scoreのチューニングが容易になります。以下はその例です。

GET search-movies/_search
{
  "size": 100,
  "_source": ["title", "overview","keywords"],
  "retriever": {
    "linear": {
      "rank_window_size": 500,
      "min_score": 0.25,
      "retrievers": [
        {
          "weight": 0.6,
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "overview_vector",
                  "query": "superhero movie"
                }
              }
            }
          }
        },
        {
          "weight": 0.4,
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "multi_match": {
                  "query": "superhero movie",
                  "fields": ["overview","keywords", "title"],
                  "type": "cross_fields",
                  "minimum_should_match": "2"
                }
              }
            }
          }
        }
      ]
    }
  }
}

RRFを使用したハイブリッド検索

BM25では、多くの場合、 AND演算子やminimum_should_matchを使用するなど、他の手段で精度を制御します。さらに、単一で、正確で、まれな用語からなるクエリは、自然に検索結果の少ない検索結果を引き起こし、多くの場合、すべてが非常に関連性の高いものです。これにより、次のことが発生する可能性があります。

  • 絶対的なBM25スコアが最大スコアのヒットに近い場合でも、結果内のさらに後ろの結果にはBM25レトリバーで低い正規化スコアが割り当てられます。

  • 非常に低いBM25スコアをセマンティックスコアに追加すると、合計がセマンティックスコアとして近似されます。

  • BM25スコアの寄与が不足すると、ドキュメントがmin_score thresholdによって破棄される可能性があります。

解決策として、BM25とセマンティック結果を組み合わせるために、逆順位融合(RRF)を使用することができます。RRFは、各結果セット内の位置に焦点を当てることで、異なる検索アルゴリズムのスコアを比較するという課題を回避します。この場合、min_scoreはセマンティックレトリバーにのみ適用されます。

GET search-movies/_search
{
  "_source": ["title", "overview","keywords"],
  "retriever": {
    "rrf": {
      "rank_window_size": 500,
      "retrievers": [
        {
          "linear": {
            "rank_window_size": 500,
            "min_score": 0.25,
            "retrievers": [
              {
                "normalizer": "minmax",
                "retriever": {
                  "standard": {
                    "query": {
                      "semantic": {
                        "field": "overview_vector",
                        "query": "superhero movie"
                      }
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "standard": {
            "query": {
              "multi_match": {
                "query": "superhero movie",
                "fields": ["overview", "keywords","title"],
                "type": "cross_fields",
                "minimum_should_match": "2"
              }
            }
          }
        }
      ]
    }
  }
}

まとめ

min_scoreを使用することで、セマンティック検索アルゴリズムの高い再現率によって引き起こされる結果セット内の誤検出の数を減らす方法を示しました。レトリバーの詳細については、こちらのブログ記事Elasticsearchのドキュメントをご覧ください。

関連記事

判断リストによる検索クエリの関連性の評価

Jhon Guzmán

MLを使用したフィルターとファセットの生成

Andre Luiz

コンテキストのためのYou Know - パート1:ハイブリッド検索とコンテキストエンジニアリングの進化

Woody Walton

同義語APIを使用して同義語を自動化し、アップロードする方法

Andre Luiz

Elasticsearchでの後期相互作用モデルのスケーリング - パート 2

Peter Straßer

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう