[翻訳] OpenSearch で効果的なハイブリッド検索を構築する: テクニックとベストプラクティス
OpenSearch は、現代の検索ニーズに対応するための幅広い機能を提供しています。BM25 を使用した字句検索 (lexical search) のような従来のキーワードベースの手法から、セマンティック検索やハイブリッド検索といったより高度な手法まで対応しています。BM25 は、キーワードの関連性に依存する多くのアプリケーションにおいて、依然として信頼性が高く効率的な選択肢です。セマンティック検索は、機械学習 (ML) を活用してキーワードを超えた意味を捉えることで、これをさらに発展させます。高度なハイブリッド手法は、字句検索とセマンティック検索のアプローチを組み合わせ、スコアベースやランクベースのアルゴリズムなどの正規化手法を使用して、異なる検索手法からのスコアをバランスよく統合します。これらの手法は、検索の関連性と柔軟性を段階的に向上させ、現代のアプリケーションにおける多様な検索要件に対応します。
このブログ記事では、字句検索、セマンティック検索、ハイブリッド検索のそれぞれの手法を探り、OpenSearch でハイブリッド検索がどのように機能するかを詳しく解説します。
字句検索とセマンティック検索の比較
字句検索とセマンティック検索は、関連するドキュメントを取得するために異なる手法を使用します。以下にそれぞれの比較を示します。
字句検索 (BM25)
BM25 は、OpenSearch でデフォルトで使用される確率的スコアリングアルゴリズムです。OpenSearch の標準的な全文検索機能の一部として提供され、multi_match、range、term などのクエリで使用されます。BM25 はフィールドレベルのブースティングと柔軟なマッチングをサポートしており、EC サイトの商品検索からドキュメント検索まで、多くのアプリケーションで汎用的に使用できます。
リクエスト例
以下のリクエストは、title フィールドで the martian を検索します。
GET /bookstore_catalog/_search
{
"query": {
"match": {
"title": "the martian"
}
}
}
セマンティック検索
セマンティック検索は、ML と自然言語処理を導入して検索結果を向上させます。ドキュメントとクエリの両方を高次元空間で表現するために、密ベクトル埋め込み (dense vector embeddings) を使用します。これらの埋め込みはテキストの意味的な内容を捉え、システムが完全一致のキーワードマッチングを超えた検索を可能にします。
テキスト埋め込みは、大規模なデータセットで学習された大規模言語モデル (LLM) を使用して生成されます。OpenSearch では、埋め込みは密ベクトルフィールドとして保存され、k 近傍法 (k-NN) アルゴリズムを使用して検索されます。検索時には、クエリも埋め込みに変換され、OpenSearch は内積やコサイン類似度などの類似度指標を使用して、クエリベクトルに最も近いベクトルを含むドキュメントを見つけます。
リクエスト例
以下のリクエストは、クエリ science fiction に最も類似した埋め込みを含むドキュメントを取得します。
GET /bookstore_catalog/_search
{
"_source": {
"excludes": [
"passage_embedding"
]
},
"query": {
"neural": {
"title_embedding": {
"query_text": "science fiction",
"k": 100
}
}
}
}
このクエリでは以下のパラメータを使用しています。
-
title_embedding: ドキュメントタイトルの埋め込みを含む密ベクトルフィールド -
query_text: 埋め込みに変換される入力クエリ -
k: 取得する最近傍の数
まとめ
BM25 のような字句検索手法は、高速で正確なキーワードマッチングを提供しますが、クエリの意味やコンテキストを捉えることはできません。一方、セマンティック検索は意図や自然言語の理解に優れていますが、特に事実ベースの検索では重要なキーワードを見逃す可能性があります。
生成 AI を使用するアプリケーションを中心に、キーワードの精度とセマンティックな理解の両方を求めるユースケースが増えるにつれ、ハイブリッド検索が不可欠になっています。OpenSearch のハイブリッド検索は、両方のアプローチの長所を組み合わせて、関連性と柔軟性を向上させます。
ハイブリッド検索: 字句検索とセマンティック検索の組み合わせ
ハイブリッド検索は、キーワードマッチングのための BM25 とセマンティック理解のためのベクトル検索など、複数の検索手法からの結果を統合し、より包括的で正確な結果を提供します。これらの手法は異なるスケールでスコアを生成するため、正規化によってスコアを同じスケールに変換します。これにより、OpenSearch はスコアを公平に比較して組み合わせることができます。
OpenSearch は、2 つの主要な正規化手法をサポートしています。
- スコアベースの正規化: 検索アルゴリズムが返す生のスコアを直接操作します。これらの手法は、実際のスコア値に何らかの形で保持すべき意味のある情報が含まれている場合に有用です。スコアベースの正規化手法には、min-max、L2、z-score (OpenSearch 3.0 でリリース予定) の 3 種類があります。
- ランクベースの正規化: 結果の相対的な順序に焦点を当てます。これらの手法は、生のスコアが異なるスケールを使用し直接比較できない異なるソースからの結果をマージする場合に有用です。ランクベースの正規化は、ドキュメントのランクに基づいてスコアを正規化することでこの問題を解決し、スコアリングシステムが異なるアルゴリズム間でより信頼性の高い結果を提供します。
次のセクションでは、min-max 手法を使用したスコアベースの正規化と、Reciprocal Rank Fusion (RRF) を使用したランク正規化について説明します。
min-max 正規化を使用したハイブリッド検索
min-max 正規化は、個々のサブクエリのスコアを固定範囲 (通常は [0, 1]) にスケーリングしながら、相対的な分布を保持します。例えば、BM25 スコアには固定範囲がありませんが、正規化後は値が 0 から 1 の範囲に収まります。
正規化の式は以下の通りです。
normalized_score = (score - min_score) / (max_score - min_score)
各変数の意味は以下の通りです。
-
score: サブクエリからの元のスコア -
min_scoreとmax_score: そのサブクエリの結果セット内の最低スコアと最高スコア
OpenSearch で min-max 正規化を使用するには、まず検索パイプラインを定義します。
PUT /_search/pipeline/min_max-search-pipeline
{
"description": "Post processor for hybrid search",
"phase_results_processors": [
{
"normalization-processor": {
"normalization": {
"technique": "min_max"
},
"combination": {
"technique": "arithmetic_mean",
"parameters": {
"weights": [0.3, 0.7]
}
}
}
}
]
}
このパイプラインは、各サブクエリの結果に min-max 正規化を適用し、重み付き算術平均 (字句検索 30%、セマンティック検索 70%) を使用して結果を組み合わせます。
次に、パイプラインを使用してハイブリッドクエリを実行します。
GET /bookstore_catalog/_search?search_pipeline=min_max-search-pipeline
{
"query": {
"hybrid": {
"queries": [
{
"match": {
"title": {
"query": "science fiction"
}
}
},
{
"neural": {
"title_embedding": {
"query_text": "science fiction",
"model_id": "aVeif4oB5Vm0Tdw8zYO2",
"k": 5
}
}
}
]
}
}
}
このクエリでは以下のパラメータを使用しています。
-
hybrid: OpenSearch の組み込みハイブリッドクエリタイプ -
search_pipeline: min-max 正規化と重み付きスコアの組み合わせを適用
min-max 正規化の仕組み
min-max 正規化は以下のように動作します。
- OpenSearch が
matchクエリとneuralクエリの両方を実行します。 - パイプラインが min-max スケーリングを使用して各結果セットを正規化します。
- 正規化されたスコアが重み付き平均を使用して組み合わされ、最終スコアが生成されます。
この例では、最終的なドキュメントスコアは以下の式で計算されます。
0.3 * normalized_BM25_score + 0.7 * normalized_neural_score
スコアベースの正規化を使用すべき場合
スコアベースの正規化は、異なる手法からの結果をどのように組み合わせるかを細かく制御したい場合に有用です。以下のような場合に使用を検討してください。
- 重みを調整またはトレーニングできる場合: スコアを正規化する信頼性の高い方法 (例: min-max や L2 ノルム) があり、各検索手法の重みを調整できる場合、線形スコアの組み合わせはランクフュージョンよりも関連性指標でわずかに優れた結果を出すことがあります。
- 一方の手法を強調したい場合: スコア正規化により、ユースケースに対してより信頼性の高いモデルを明示的に強調できます。一般的なドキュメント検索では、一部のクエリは主にキーワードマッチングで回答でき、他のクエリはセマンティックな理解が必要な場合があります。重みを調整する (またはクエリ依存のロジックを使用する) ことで、適切な場合に BM25 またはニューラルモデルにより大きな影響力を与えることができます。
- マージの精密な制御が必要な場合 (誤検出を減らす): 正規化された線形結合により、結果のマージ方法をより細かく制御でき、一方の手法だけで関連性の低いドキュメントがブーストされる可能性を減らすことができます。例えば、セマンティックモデルがやや関連性の低い結果を高いランクで返した場合、ランクベースの正規化 (次のセクションで説明) はそのランクのために高いスコアを適用します。スコアベースのアプローチでは、ドキュメントの正規化された関連性スコアが低くなることでこれを軽減できます (BM25 がそのドキュメントに 0 のスコアを与え、セマンティックスコアだけでは他の組み合わせスコアを上回るには不十分な場合があるため)。したがって、適切に調整されたハイブリッドシステムでは、スコア正規化により、各ドキュメントの最終スコアが字句的およびセマンティックな関連性のバランスを反映するため、より精密なトップ 10 ランキングが得られます。
RRF を使用したハイブリッド検索
ランクベースの手法は、生のスコアではなく、結果セット内のドキュメントの位置に焦点を当てます。これらの手法は、スコアが直接比較できない異なる検索手法からの結果を組み合わせる場合に特に有用です。
Reciprocal Rank Fusion (RRF) はそのような手法の 1 つです。個々のクエリ結果における各ドキュメントのランクを使用して組み合わせスコアを計算し、BM25 やセマンティック検索などの手法間でスコアリングスケールが一致しない場合でも堅牢に動作します。
まず、RRF 検索パイプラインを定義します。
PUT /_search/pipeline/rrf-pipeline
{
"description": "Post processor for hybrid RRF search",
"phase_results_processors": [
{
"score-ranker-processor": {
"combination": {
"technique": "rrf"
}
}
}
]
}
次に、ハイブリッドクエリを実行します。
GET /bookstore_catalog/_search?search_pipeline=rrf-pipeline
{
"query": {
"hybrid": {
"queries": [
{
"match": {
"title": {
"query": "science fiction"
}
}
},
{
"neural": {
"title_embedding": {
"query_text": "science fiction",
"model_id": "aVeif4oB5Vm0Tdw8zYO2",
"k": 5
}
}
}
]
}
}
}
このクエリでは以下のパラメータを使用しています。
-
hybrid: 字句検索とセマンティック検索の結果を組み合わせる -
search_pipeline: RRF の組み合わせロジックを適用して最終結果をランク付け
RRF の仕組み
RRF は以下のように動作します。
-
ドキュメントをスコアでソート: 各クエリ手法がドキュメントをスコアでソートします。
-
ランク位置を割り当て: 各クエリのスコアに基づいてドキュメントにランクが付けられます。
-
RRF スコアを計算: 各ドキュメントについて、以下の式を使用して RRF スコアが計算されます。
rankScore(document_i) = sum((1/(k + query_1_rank), (1/(k + query_2_rank), ..., (1/(k + query_j_rank)))各変数の意味は以下の通りです。
-
k: ランク定数 -
query_j_rank: 特定のクエリ手法におけるドキュメントのランキング
-
-
ランク寄与を加算: ランク計算が組み合わされ、ドキュメントがランクスコアの降順でソートされます。
-
上位結果を返す: クエリサイズに基づいて最高ランクのドキュメントが取得されます。
ランクベースの正規化を使用すべき場合
以下のような状況では、ランクベースの正規化の使用を検討してください。
- 異種のスコア分布: ランクフュージョン (特に RRF) は、BM25 とセマンティックモデルが互換性のないスケールでスコアを生成したり、外れ値を含む場合に優れています。生のスコアではなく結果のランキングのみを使用することで、複雑なスコアのキャリブレーションを回避します。これにより、一方のクエリ手法のスコアリング範囲が正規化スコアリングスキームで他を圧倒する場合でも、安定したランキングが得られます。
- 調整やキャリブレーションが不要: RRF はそのまますぐに使える手法です。事前トレーニング、重みの調整、スコア範囲の知識は必要ありません。多様なクエリとコンテンツを持つ汎用的な検索システムでは、すべてのシナリオに対して手動で重みを調整することは現実的ではありません。キャリブレーション用のラベル付きデータが利用できない場合、ランクフュージョンは堅牢なデフォルトの選択肢となります。
- 外れ値やドメインシフトに対する耐性: RRF は絶対的なスコアの大きさを無視するため、極端に高いスコアの外れ値が結果を歪めることはありません。これは、一部のクエリやドキュメントが一方のモデルを使用した場合に異常に高いスコアを生成する可能性がある一般的なコレクションで有用です。同様に、データ分布やクエリの組み合わせが時間とともに変化しても、RRF は相対的なランク位置を使用するため、再キャリブレーションなしで安定性を維持します。
- 変化する環境への適応性: クエリやデータの性質が時間とともに進化する場合、スコアベースの手法では高い関連性を維持するために重みの継続的な微調整が必要になることがよくあります。RRF は絶対スコアではなく相対ランキングに依存するため、この継続的なメンテナンスの必要性がありません。これは、継続的な再キャリブレーションがリソース集約的であったり現実的でない動的環境で特に価値があります。
まとめ
OpenSearch は、BM25 を使用した精密なキーワードマッチングから、セマンティックモデルを使用した深いコンテキスト検索まで、幅広いニーズに対応するように進化してきました。ハイブリッド検索はこれらの長所を組み合わせ、情報検索に対する柔軟で強力なアプローチを提供します。字句検索とセマンティック手法を組み合わせることで、ハイブリッド検索は関連性、再現率、ランキングの安定性のバランスを取ります。
ハイブリッド検索を実装する際は、以下のベストプラクティスを参考にしてください。
- データとクエリの種類: コンテンツとクエリがどの程度構造化されているか、スパースか、ドメイン固有かに基づいて手法を選択します。
- パフォーマンス要件: 特に大規模アプリケーションでは、検索精度と計算リソースのトレードオフを考慮します。
- 調整とテスト: 特定のユースケースに最適な結果を得るために、各手法を慎重に調整してテストします。
- スケーラビリティ: データ量が増加するにつれて、選択した検索戦略が効果的にスケールできることを確認します。
今後の展望
ML と自然言語処理が進化し続けるにつれ、OpenSearch はモデル統合の改善、微調整されたランキング、実世界のユースケースへのより良いサポートを提供することで、ハイブリッド検索とセマンティック検索の機能を拡張し続けます。
各検索手法の仕組みと使いどころを理解することで、よりスマートで関連性が高く、レスポンシブな検索体験を構築できます。
OpenSearch Project(OSS) の Publicationです。 OpenSearch Tokyo User Group : meetup.com/opensearch-project-tokyo/
Discussion