ハイブリッド検索の理解

ハイブリッド検索では、すぐに利用可能なスコアリング手法またはカスタム・スコアリング手法を使用して、全文問合せとベクトルベースの類似度問合せを組み合せてドキュメントを検索できます。

ハイブリッド検索を使用する場合の重要な点は次のとおりです:

次の説明のために、「ハイブリッド・ベクトル索引の理解」と同じユースケースを使用しています。

ドキュメント・モードでの純粋なセマンティック

ドキュメント・モードでの純粋なセマンティックでは、ベクトルのみの検索を実行してドキュメント・レベルの結果をフェッチします。

次のSQL文は、このモードでハイブリッド・ベクトル索引を問い合せます:

select json_Serialize(
  DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "vector":
          {
             "search_text"   : "galaxies formation and massive black holes",
             "search_mode"   : "DOCUMENT",
             "aggregator"    : "AVG"
          },
         "return":
          {
             "values"        : [ "rowid", "score", "vector_score" ],
             "topN"          : 10
          }
      }'
    )
  ) RETURNING CLOB pretty);

この問合せの結果は次のようになります。ドキュメントに対応するDOCS表の行のROWIDと、そのベクトル・スコア(vector_score)が表示されます。この場合、キーワード・スコアがないため、最終スコア(score)はベクトル・スコアと同じです。

結果からの抜粋を次に示します:

[
{
    "rowid"        : "AAASBEAAEAAAUpqAAB",
    "score"        : 71.04,
    "vector_score" : 71.04
  },
  {
    "rowid"        : "AAASBEAAEAAAWBKAAE",
    "score"        : 67.82,
    "vector_score" : 67.82
  },
]

この文を解釈する方法を次に示します:

  1. すべてのベクトルに対して類似検索が実行され、最大で上位k件が抽出されます。値kは内部的に計算されます。それぞれにベクトル・スコアが与えられます。

  2. これらのkベクトル(最大)は、ドキュメントID別にグループ化され、識別された各ドキュメントについて、そのドキュメントで見つかった関連する各ベクトルのセマンティック・スコアを使用して、その特定のドキュメントに対するこれらのスコアの平均(この例では)が計算されます。

  3. 平均値が最も高い上位10件のドキュメント(最大)が返されます。

これを図に示すと次のようになります:

チャンク・モードでの純粋なセマンティック

チャンク・モードでの純粋なセマンティックは、SQLセマンティック検索と同等です。このモードでは、ベクトルのみの検索を実行してチャンク結果をフェッチします。

次のSQL文は、このモードでハイブリッド・ベクトル索引を問い合せます:

select json_Serialize(
  dbms_hybrid_vector.search(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "vector":
          {
             "search_text"   : "galaxies formation and massive black holes",
             "search_mode"   : "CHUNK"
          },
         "return":
          {
             "values"        : [ "score", "chunk_text", "chunk_id" ],
             "topN"          : 3
          }
      }'
    )
  ) RETURNING CLOB pretty);

この文を解釈する方法を次に示します:

  1. すべてのベクトルに対して類似検索が実行され、最大で上位k件が抽出されます。値kは内部的に計算されます。それぞれにベクトル・スコアが与えられます。

  2. スコアが最も高い上位3つのチャンク(最大)が返されます。

この問合せの結果は次のようになります。ここでは、セマンティック・スコアに対応するチャンクを確認できます:

[
  {
    "score"      : 61,
    "chunk_text" : "Galaxies form through a complex process that begins with small fluctuations in the density of matter in the early
universe. Massive black holes, typically found at the centers of galaxies, are believed to play a crucial role in their formation and evolution.",
    "chunk_id"   : "1"
  },
  {
    "score"      : 56.64,
    "chunk_text" : "The presence of massive black holes in galaxies is closely linked to their morphological characteristics and star formation rates.
Observations suggest that as galaxies evolve, their central black holes grow in tandem with their host galaxy's mass.",
    "chunk_id"   : "3"
  },
  {
    "score"      : 55.75,
    "chunk_text" : "Black holes grow by accreting gas and merging with other black holes. Their gravitational influence can regulate star
formation and drive powerful jets of energy, which can impact the surrounding galaxy.",
    "chunk_id"   : "2"
  }
]

ドキュメント・モードでの純粋なキーワード

ドキュメント・モードでの純粋なキーワード検索は、Oracle Textを使用した従来のCONTAINS問合せと同等です。このモードでは、テキストのみの検索を実行してドキュメントレベルの結果をフェッチします。

次のSQL文は、このモードでハイブリッド・ベクトル索引を問い合せます:

select json_Serialize(
  dbms_hybrid_vector.search(
    json(
      '{ "hybrid_index_name" : "my_hybrid_idx",
         "text":
          {
             "contains"      : "galaxies, black holes"
          },
         "return":
          {
             "values"        : [ "rowid", "score" ],
             "topN"          : 3
          }
      }'
    )
  ) RETURNING CLOB pretty);

この文を解釈する方法を次に示します:

  1. ドキュメントの最大数を返すCONTAINS問合せが実行されます。この最大数は内部で計算されます。各ドキュメントにはキーワード・スコアが付けられます。

  2. スコアが最も高い上位3つのドキュメント(最大)が返されます。

この問合せの結果は次のようになります。ここでは、ドキュメントに対応するDOCS表の行のROWIDおよびキーワード・スコアを確認できます:

[
  {
    "rowid" : "AAAR9jAABAAAQeaAAB",
    "score" : 68
  },
  {
    "rowid" : "AAAR9jAABAAAQeaAAA",
    "score" : 35
  },
  {
    "rowid" : "AAAR9jAABAAAQeaAAD",
    "score" : 2
  }
]

ドキュメント・モードでのキーワードおよびセマンティック

キーワード・スコアとセマンティック・スコアが結合されたハイブリッド検索の純粋ではないケースを見てみましょう。

次のSQL文は、キーワードおよびセマンティック検索を実行して、ドキュメントレベルの結果をフェッチします:

select json_Serialize(
  DBMS_HYBRID_VECTOR.SEARCH(
    json(
      '{
         "hybrid_index_name" : "my_hybrid_idx",
         "search_scorer"     : "rsf",
         "search_fusion"     : "UNION",
         "vector":
          {
             "search_text"   : "How can I search with hybrid vector indexes?",
             "search_mode"   : "DOCUMENT",
             "aggregator"    : "MAX",
             "score_weight"  : 1,
             "rank_penalty"  : 5
          },
         "text":
          {
             "contains"      : "hybrid AND vector AND index"
             "score_weight"  : 10,
             "rank_penalty"  : 1
          },
         "return":
          {
             "values"        : [ "rowid", "score", "vector_score", "text_score" ],
             "topN"          : 10
          }
      }'
    )
  ) RETURNING CLOB pretty);

この文を解釈する方法を次に示します:

ドキュメント・モードでは、検索の結果は、識別された最適なファイルのリストに対応する実表のROWIDのリストです。

このリストを取得するために、次の2つの検索が実行されます:

  • キーワード検索: この検索では、検索キーワードのOracle TextのCONTAINS検索式を表すCONTAINS文字列が使用されます。この操作の結果は、CONTAINS式を満たすドキュメント識別子のリストです。取得されるドキュメント識別子の最大数は、内部的に計算されます。

  • 類似検索: この検索では、すべてのドキュメントのすべてのチャンクのベクトル索引に対して、問合せベクトル(SEARCH_TEXT文字列から作成)を使用して類似検索が実行されます。取得されるチャンクの最大数も内部的に計算されます。次に、取得された各チャンクにベクトル・スコアを割り当てます。この検索はDOCUMENT SEARCH_MODEで実行されるため、この類似検索の結果はまずドキュメント識別子でグループ化されます。このプロセスでは、AGGREGATOR関数を使用して識別された各ドキュメントのベクトル・スコアが集計されるようになりました。この類似検索の結果は、SEARCH_TEXTの類似度問合せ文字列を満たすドキュメント識別子のリストです。

検索が完了したら、次に示すように結果をマージしてスコアリングする必要があります:

図8-2 ドキュメント・モードでのキーワードおよびセマンティク検索のスコアリング

図8-2の説明が続きます
「図8-2ドキュメント・モードでのキーワードおよびセマンティック検索のスコアリング」の説明

前述の図で概説したように、

  • 最初に、両方の検索結果がUNION ALL操作を使用して追加されます。

  • 最終スコアリングの前に、SEARCH_FUSION操作を指定して、この中間結果セットから保持する内容を定義できます。

  • 次に、Reciprocal Rank Fusion (RRF)やRelative Score Fusion (RSF)などの定義されたSEARCH_SCORERアルゴリズムを使用して、最終スコアリングが計算されます。最終スコアリングでは、取得した各ドキュメント識別子に対して、取得元のソート操作に応じて、指定されたSCORE_WEIGHTおよびRANK_PENALTY値を使用できます。

  • 最後に、定義された最大topN件のドキュメント識別子が返されます。

使用可能な融合演算子を次に示します:

図8-3 ドキュメント検索モードでの融合操作

例8-3の説明が続きます
「図8-3 ドキュメント検索モードでの融合操作」の説明

チャンク・モードでのキーワードおよびセマンティック

キーワード・スコアとセマンティック・スコアを結合してチャンク結果がフェッチされる、ハイブリッド検索の別の純粋ではないケースを見てみましょう。

次のSQL文は、チャンク・モードでキーワードおよびセマンティック検索を実行します:

select json_Serialize(
  DBMS_HYBRID_VECTOR.SEARCH(
    json(
         '{
            "hybrid_index_name" : "my_hybrid_vector_idx",
            "search_scorer"     : "rsf",
            "search_fusion"     : "UNION",
            "vector":
                      {
                        "search_text"   : "How can I search with hybrid vector indexes?",
                        "search_mode"   : "CHUNK",
                        "score_weight"  : 1
                      },
            "text":
                      {
                       "contains"       : "hybrid AND vector AND index",
                       "score_weight"   : 1
                      },
            "return":
                      {
                        "values"        : [ "chunk_id", "score", "vector_score", "text_score" ],
                        "topN"          : 10
                      }
          }'
    )
  ) RETURNING CLOB pretty);

この文を解釈する方法を次に示します:

チャンク・モードでは、検索の結果は、実表を使用して格納されたファイルからの最適なチャンク識別子のリストです。

このリストを取得するために、次の2つの検索が実行されます:

  • キーワード検索: この検索では、検索キーワードのOracle TextのCONTAINS検索式を表すCONTAINS文字列が使用されます。この操作の結果は、CONTAINS式を満たすドキュメント識別子のリストです。取得されるドキュメント識別子の最大数は、内部的に計算されます。

  • 類似検索: この検索では、すべてのドキュメントのすべてのチャンクのベクトル索引に対して、問合せベクトル(SEARCH_TEXT文字列から作成)を使用して類似検索が実行されます。取得されるチャンクの最大数も内部的に計算されます。次に、取得された各チャンクにベクトル・スコアを割り当てます。この検索はCHUNK SEARCH_MODEで実行されるため、この類似検索の結果はチャンク・ベクトル・スコアでソートされます。この類似検索の結果は、SEARCH_TEXT類似度問合せ文字列を満たすチャンク識別子および関連するドキュメント識別子のリストです。

検索が完了したら、次に示すように結果をマージしてスコアリングする必要があります:

図8-4 チャンク・モードでのキーワードおよびセマンティック検索のスコアリング

図8-4の説明が続きます
「図8-4 チャンク・モードでのキーワードおよびセマンティック検索のスコアリング」の説明

前述の図で概説したように、

  • 最初に、両方の検索結果がドキュメント識別子のRIGHT OUTER JOIN操作に送信されます。

  • 最終スコアリングの前に、SEARCH_FUSION操作を指定して、この中間結果セットから保持する内容を定義できます。

  • 次に、Reciprocal Rank Fusion (RRF)やRelative Score Fusion (RSF)などの定義されたSEARCH_SCORERアルゴリズムを使用して、最終スコアリングが計算されます。最終スコアリングでは、取得した各ドキュメント識別子に対して、取得元のソート操作に応じて、指定されたSCORE_WEIGHTおよびRANK_PENALTY値を使用できます。

  • 最後に、定義された最大topN件のチャンク識別子が返されます。

使用可能な融合演算子を次に示します:

図8-5 チャンク検索モードでの融合操作

例8-5の説明が続きます
「図8-5 チャンク検索モードでの融合操作」の説明

MINUS_VECTORUNIONおよびTEXT_ONLYは無視されます。MINUS_VECTORを指定すると、すべての結果が除外されます。TEXT_ONLYおよびUNIONは、右外部結合で重複しないテキスト結果が除外されるため、使用できません。