Elasticsearch でのセマンティックリランク

BLOG

1. 前書き

前回に引き続き、ホワイトペーパー「Elasticsearchを使った簡易RAGアプリケーションの作成」に
記載した技術的要素を紹介いたします。(脚注1)1

今回は、セマンティックリランクです。

なお、セマンティックリランクを行うサンプルプログラムを下記の GitHub リポジトリで公開しています。参考にしてみてください。

blogs/2025-05-semantic-rerank at main · sios-elastic-tech/blogs
A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on...

対象者

  • Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む)
  • Elasticsearch の初心者~中級者

できるようになること

  • Elasticsearch で日本語を含むドキュメントのセマンティックリランクを行えるようになる。

前提条件

(2025年05月12日時点の情報を元に記載しています。)

2. セマンティックリランク

2.1. セマンティックリランクとは?

キーワード検索のみを行った場合や、ベクトル検索のみを行った場合に適切なドキュメントが検索上位に来ない場合があります。
その改善策として、キーワード検索とベクトル検索のハイブリッド検索を行う方法があります。

しかし、それでもまだクエリーの検索結果として適切なドキュメントが上位に来ない場合もあります。

このような場合の改善策の一つとして、セマンティックリランクがあります。

セマンティックリランクは、いったん取得した検索結果の一覧を、検索クエリーとの関連度順に並び変えるという手法です。
これにより、クエリーの検索結果として適切なドキュメントが上位になることが期待されます。

2.2. セマンティックリランクの概念図

下記の図がセマンティックリランクの処理フローの概念図です。

キーワード検索とベクトル検索のハイブリッド検索後にセマンティックリランクを行う場合の処理フローの概念図

https://elastic.sios.jp/blog/search-using-user-dictionary-registration-in-elasticsearch/ で作成したインデックス(「桃太郎」を改変した「柿之助」を登録したインデックス)に対して、下記の検索クエリーを実行した例を考えます。

検索クエリー = 「柿之助からおむすびをもらったのは誰?」

キーワード検索 + 密ベクトル検索のハイブリッド検索結果(セマンティックリランク前)

順位検索結果
1
2…ゴリラもおむすびを一つもらって、…
3…鷹もおむすびを一つもらって、…
4
5…猫はおむすびを一つもらって、…

ハイブリッド検索+セマンティックリランク

(検索結果を「柿之助からおむすびをもらったのは誰?」に関連度が高い順に並び変える)

順位検索結果
1…鷹もおむすびを一つもらって、…
2…ゴリラもおむすびを一つもらって、…
3…猫はおむすびを一つもらって、…
4
5

検索クエリーとの関連度が高いものが上位に来るようになります。

2.3. セマンティックリランクの方法

大きく分けると3つの方法があります。

  • a. cross-encoder model を使って、クエリーのベクトルと、検索対象ドキュメントのベクトルを比較し、近いものを見つける。
  • b. bi-encoder model を使って、リランク処理を行う。
  • c. LLMにクエリーと検索対象ドキュメントを渡して、リランクしてもらう。

Elasticsearch では、a. cross-encoder model を利用することができるので、
今回は、a. の cross-encoder model を使う方法を採用します。

2.4. セマンティックリランクのメリットとデメリット

セマンティックリランクにはメリットとデメリットがあります。

  • メリット
    • クエリーとの関連度が高いドキュメントが検索結果の上位に来やすくなる。
  • デメリット
    • リランク処理を行う分、遅くなる。
    • リランク処理のためのコストがかかる場合がある。

リランカーに大量にドキュメントを渡してしまうと、その分だけ処理時間が長くなってしまいます。
また、リランカーが受け取れる量には限界があります(あまりにも大量のドキュメントは受け取ることができません)。

かといって、あまりにも少ないドキュメントだけを渡すと、適切なドキュメントがリランク対象から漏れてしまう可能性があります。
何件のドキュメントをリランカーに渡せばよいのか? は、PoC を行うなどして決めていく必要があります。

3. Elasticsearch でのセマンティックリランク

3.1. セマンティックリランク利用時のおおまかな手順

Semantic reranking | Elastic Docs
Re-rankers improve the relevance of results from earlier-stage retrieval mechanisms. Semantic re-rankers use machine lea...

に手順が掲載されています。

引用となりますが、以下の手順が必要です。

  • 1. リランクモデルを選択し、利用可能な状態とする。
  • 2. Elasticsearch 上でリランク用のエンドポイントを作成する。
  • 3. リランク処理を行うリトリーバーを定義する。

3.2. Elasticsearch で利用可能なセマンティックリランカー

Elasticsearch v8.18.1 では、いくつかのセマンティックリランカーを利用できます。

Create inference API | Elasticsearch Guide [8.18] | Elastic

上記の URL からの引用となりますが、下記を利用可能です。

  • a. AlibabaCloud AI Search の rerank を利用する。
  • b. Cohere の rerank を利用する。
  • c. Elasticsearch の rerank を利用する。
  • d. Google Vertex AI の rerank を利用する。
  • e. VoyageAI の rerank を利用する。
  • f. JinaAI の rerank を利用する。

今回は、b. Cohere Rerank v3.5 を利用します(無償での検証が可能なため)。

※日本語を含むドキュメントをリランクしたい場合、日本語に対応したリランカーを利用する必要があります。Cohere Rerank v3.5 は、日本語に対応しています。

Introducing Rerank 3.5: Precise AI Search
Rerank 3.5 delivers improved reasoning and multilingual capabilities to search complex enterprise data with greater accu...

3.3. Cohere Rerank v3.5 の APIキーの取得

発行した APIキー をメモ帳などに保存しておきます。

※Cohere のWebサイトは時々変更されるので、画面のコピーは掲載していません。

3.4. リランク用のエンドポイントの作成

以下のリクエストを Elastic Cloud の Console から発行します。

PUT _inference/rerank/cohere_rerank_v3pt5
{
  "service": "cohere",
  "service_settings": {
    "api_key": "<CohereのAPI-KEY>",
    "model_id": "rerank-v3.5",
    "rate_limit": {
      "requests_per_minute": 10
    }
  },
  "task_settings": {
    "top_n": 10,
    "return_documents": true
  }
}
  • <CohereのAPI-Key>には、さきほど取得した Cohere の APIキーを転記します。
  • Trial Key の利用なので、”requests_per_minute”: 10 としておきます。
  • Cohere Rerank v3.5 に渡すドキュメント数は、ひとまず、10 としておきます。(”top_n”: 10)

3.5. セマンティックリランクを行う検索テンプレートの作成

RRFによるハイブリッド検索後にセマンティックリランクを行うリトリーバーを検索テンプレートとして定義します。

下記のリクエストを Elastic Cloud の Console から発行します。

PUT _scripts/rrf_search_template_with_rerank
{
  "script": {
    "lang": "mustache",
    "source": """{
      "_source": false,
      "fields": [ "chunk_no", "content" ],
      "size": "{{size}}{{^size}}10{{/size}}",
      "retriever": {
        "text_similarity_reranker": {
          "retriever": {
            "rrf": {
              "retrievers": [
                {
                  "standard": {
                    "query": {
                      "match": {
                        "content": "{{query_string}}"
                      }
                    }
                  }
                },
                {
                  "standard": {
                    "query": {
                      "semantic": {
                        "field": "content.text_embedding",
                        "query": "{{query_for_vector}}"
                      }
                    }
                  }
                }
             ],
             "rank_window_size": "{{size}}{{^size}}10{{/size}}",
             "rank_constant": "{{rank_constant}}{{^rank_constant}}20{{/rank_constant}}"
            }
          },
          "field": "content",
          "rank_window_size": "{{size}}{{^size}}10{{/size}}",
          "inference_id": "cohere_rerank_v3pt5",
          "inference_text": "{{query_for_vector}}"
        }
      }
      {{#highlight}}
      ,
      "highlight": {
        "fields": {
          "content": {}
        },
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
      }
      {{/highlight}}
    }
    """
  }
}

セマンティックリランクを行う上での重要なキーワードは、”text_similarity_reranker” です。詳細は、Elasticsearch の公式ドキュメントを参照してください。

キーワード検索とベクトル検索のハイブリッド検索の結果上位10件をリランカーに渡しています
リランク用の特別な実装は必要ありません)。

3.6. 検索の実行

さきほど作成した検索テンプレートを使って、検索してみます。

リクエスト

GET /kakinosuke/_search/template
{
  "id": "rrf_search_template_with_rerank",
  "params": [
    "query_string": "柿之助からおむすびをもらったのは誰?",
    "query_for_vector": "柿之助からおむすびをもらったのは誰?"
  ]
}

レスポンス

{
  ...
    "hits": [
      {
        ...
鷹もおむすびを一つもらって、柿之助のあとからついて行きました。
        ...
      },
      {
        ...
ゴリラもおむすびを一つもらって、あとからついて行きました。
        ...
      },
      {
...
猫はおむすびを一つもらって、柿之助のあとから、ついて行きました。
...
      },
      ...
    ]
  }
}

質問との関連度が高いドキュメントが上位に来ています。

4. セマンティックリランクの応用編

さきほどはキーワード検索+密ベクトル検索のハイブリッド検索結果をセマンティックリランクしましたが、

 キーワード検索の上位10件 と ベクトル検索の上位10件 の計20件(ただし重複分を除く)をセマンティックリランクする

といった方法も考えられます。

  • メリット
    • 本当に見つけたいドキュメントがキーワード検索で上位に来るが、ベクトル検索では上位に来ないような場合に見つけやすくなる。
    • 本当に見つけたいドキュメントがベクトル検索で上位に来るが、キーワード検索では上位に来ないような場合に見つけやすくなる。
  • デメリット:
    • リランカーに渡す件数が多くなると遅くなる。
    • リランカーに渡す処理をコーディングする必要がある。

5. サンプルプログラム

下記の GitHub リポジトリでセマンティックリランクを行った検索結果を返すサンプルを公開しています。

blogs/2025-05-semantic-rerank at main · sios-elastic-tech/blogs
A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on...

セマンティックリランクを行うと検索結果の順位が変わります。

セマンティックリランク後に RAG を行うことも可能ですが、このサンプルはドキュメント数が少ないため、セマンティックリランクの有無による RAG での回答の差異は見られませんでした。
(もっと大量のドキュメントがあれば、差異は出てくると思われます。)

6. 参考URL

その他の参考URL です。

7. まとめ

セマンティックリランクを行うことで、クエリーとの関連度が高いドキュメントが上位に来るようになりました。

(その際、リランカーに上位n件を渡す処理や、リランカーからのリランク結果を受け取るための特別な実装は必要ありません。)

RAG での検索結果が適切となり、その後の回答の精度の向上につながることもあります。

要件に合わせて、

  • セマンティックリランクを採用するか否か?
  • 採用するとすれば、どのリランカーを採用するか?
  • リランク前の検索をどうするか?
  • 何件のドキュメントをリランク対象とするか?

などを検討してみてください。


  1. ホワイトペーパー「Elasticsearchを使った簡易RAGアプリケーションの作成」は、下記からダウンロードできます。
    (E-mailアドレスなどの入力が必要です。)
    https://elastic.sios.jp/whitepaper/
    ↩︎