セマンティック再ランキング

この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

この概要は、セマンティック再ランキングの高レベルの概念とユースケースに焦点を当てています。Elasticsearchでのセマンティック再ランキングの設定と使用方法の完全な実装詳細については、リファレンスドキュメントを参照してください。

再ランキングは、初期段階の取得メカニズムからの結果の関連性を向上させます。セマンティック再ランキングは、クエリとのセマンティック類似性に基づいて検索結果を再順序付けるために機械学習モデルを使用します。

セマンティック再ランキングは、比較的大きく複雑な機械学習モデルを必要とし、クエリに応じてリアルタイムで動作します。この技術は、パイプラインの最終ステップの1つとして、小さなトップ-k結果セットで意味があります。これは、キーワード、セマンティック、またはハイブリッド取得アルゴリズムで同様に機能する、検索の関連性を向上させるための強力な技術です。

次のセクションでは、セマンティック再ランキングの利点、ユースケース、および使用されるモデルタイプについての詳細を提供します。最後のセクションでは、Elasticsearchでのセマンティック再ランキングの実装方法の実用的で高レベルの概要と、完全なリファレンスドキュメントへのリンクを含みます。

ユースケース

セマンティック再ランキングは、さまざまなユースケースを可能にします:

  • レキシカル(BM25)取得結果の再ランキング
    • 既存のレキシカル/BM25取得パイプラインにシンプルなAPIコールを追加することで、すぐに使えるセマンティック検索を実現します。
    • 再インデックスなしで既存のインデックスの上にセマンティック検索機能を追加し、迅速な改善に最適です。
    • 複雑な既存インデックスを持つ環境に最適です。
  • セマンティック取得結果の再ランキング
    • より強力なモデルを使用して、ELSERスパースベクトル埋め込みまたは密ベクトル埋め込みを使用するセマンティックリトリーバーからの結果を改善します。
    • 相互ランキング融合(RRF)を使用してハイブリッド取得の上に洗練の層を追加します。
  • 一般的なアプリケーション
    • 自動かつ透明なチャンク化をサポートし、インデックス時の事前チャンク化の必要を排除します。
    • リトリーバー強化生成(RAG)ユースケースや他の言語モデル(LLM)入力を含むシナリオにおいて、文書の関連性を明示的に制御します。

セマンティック再ランキングの価値を概説したので、次にこのプロセスを支える特定のモデルとそれらの違いを探ります。

クロスエンコーダーとバイエンコーダーモデル

高レベルでは、セマンティック再ランキングには2つのモデルタイプが使用されます:クロスエンコーダーとバイエンコーダー。

このバージョンでは、Elasticsearchはセマンティック再ランキングのためにクロスエンコーダーのみをサポートしています。

  • クロスエンコーダーモデルは、クエリを意識した文書表現を生成するため、より強力でオールインワンのソリューションと考えることができます。クエリと文書のテキストを単一の連結入力として受け取ります。
  • バイエンコーダーモデルは、文書またはクエリテキストのいずれかを入力として受け取ります。文書とクエリの埋め込みは別々に計算されるため、お互いを認識していません。
    • ランキングスコアを計算するには、外部操作が必要です。これは通常、クエリと文書の埋め込み間のドット積またはコサイン類似度を計算することを含みます。

簡単に言えば、クロスエンコーダーは高い精度を提供しますが、リソースを多く消費します。バイエンコーダーはより速く、コスト効果が高いですが、精度は低くなります。

将来のバージョンでは、Elasticsearchはバイエンコーダーもサポートします。クロスエンコーダーとバイエンコーダーの実際の違いについての詳細な分析に興味がある場合は、次のセクションを表示してください。

クロスエンコーダーとバイエンコーダーの比較

以下は、セマンティック再ランキングのためにクロスエンコーダーとバイエンコーダーのどちらを選択するかを考慮する際の非網羅的なリストです:

  • クロスエンコーダーモデルは、クエリと文書のテキストを同時に処理するため、関連性をよりよく推測でき、バイエンコーダーよりも再ランキングとしてより効果的です。
  • クロスエンコーダーモデルは一般的に大きく、計算集約的であるため、レイテンシが高く、計算コストが増加します。
  • オープンソースのクロスエンコーダーは非常に少なく、バイエンコーダーはさまざまなサイズ、言語、その他のトレードオフを提供します。
  • クロスエンコーダーの効果は、セマンティックリトリーバーの関連性を向上させることもできます。たとえば、単語の順序を考慮する能力は、密またはスパース埋め込み取得を改善できます。
  • 特定のリトリーバー(レキシカル/BM25など)と同時にトレーニングされた場合、クロスエンコーダーはそれらのリトリーバーによって行われる典型的なエラーを「修正」できます。
  • クロスエンコーダーは、クエリ間で一貫したスコアを出力します。これにより、すべてのクエリに対して最小スコアの閾値を設定することで、結果セットの関連性を高く維持できます。たとえば、これはRAGワークフローで結果を使用する場合や、結果をLLMに供給する場合に重要です。バイエンコーダー/埋め込みの類似度スコアはクエリ依存であるため、普遍的なカットオフを設定することはできません。
  • バイエンコーダーは埋め込みを使用して再ランキングします。埋め込みをインジェスト時に作成することで、再ランキングのレイテンシを改善できます。これらの埋め込みは、取得のためにインデックスされることなく再ランキングのために保存でき、メモリフットプリントを削減します。

Elasticsearchにおけるセマンティック再ランキング

Elasticsearchでは、セマンティック再ランキングはElasticsearchの推論APIリトリーバーを使用して実装されています。

Elasticsearchでセマンティック再ランキングを使用するには、次の手順が必要です:

  • 1. 再ランキングモデルを選択します。現在、次のことができます:
  • 2. Elasticsearch推論APIを使用してrerankタスクを作成します。推論APIは推論エンドポイントを作成し、選択した機械学習モデルを再ランキングタスクを実行するように構成します。
  • 3. 検索リクエストでtext_similarity_rerankerリトリーバーを定義します。リトリーバー構文は、単一のAPIコールで検索結果の取得と再ランキングの両方を簡単に構成できるようにします。

セマンティック再ランキングを使用した検索リクエストの例

以下の例は、クエリに対するセマンティック類似性に基づいてトップ-k文書を再順序付けるためにセマンティック再ランキングを使用した検索リクエストを示しています。

Python

  1. resp = client.search(
  2. retriever={
  3. "text_similarity_reranker": {
  4. "retriever": {
  5. "standard": {
  6. "query": {
  7. "match": {
  8. "text": "How often does the moon hide the sun?"
  9. }
  10. }
  11. }
  12. },
  13. "field": "text",
  14. "inference_id": "my-cohere-rerank-model",
  15. "inference_text": "How often does the moon hide the sun?",
  16. "rank_window_size": 100,
  17. "min_score": 0.5
  18. }
  19. },
  20. )
  21. print(resp)

Js

  1. const response = await client.search({
  2. retriever: {
  3. text_similarity_reranker: {
  4. retriever: {
  5. standard: {
  6. query: {
  7. match: {
  8. text: "How often does the moon hide the sun?",
  9. },
  10. },
  11. },
  12. },
  13. field: "text",
  14. inference_id: "my-cohere-rerank-model",
  15. inference_text: "How often does the moon hide the sun?",
  16. rank_window_size: 100,
  17. min_score: 0.5,
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. POST _search
  2. {
  3. "retriever": {
  4. "text_similarity_reranker": {
  5. "retriever": {
  6. "standard": {
  7. "query": {
  8. "match": {
  9. "text": "How often does the moon hide the sun?"
  10. }
  11. }
  12. }
  13. },
  14. "field": "text",
  15. "inference_id": "my-cohere-rerank-model",
  16. "inference_text": "How often does the moon hide the sun?",
  17. "rank_window_size": 100,
  18. "min_score": 0.5
  19. }
  20. }
  21. }

詳細を学ぶ