ハイブリッド検索の理解
ハイブリッド検索では、すぐに利用可能なスコアリング手法またはカスタム・スコアリング手法を使用して、全文問合せとベクトルベースの類似度問合せを組み合せてドキュメントを検索できます。
ハイブリッド検索を使用する場合の重要な点は次のとおりです:
-
ハイブリッド検索は、ハイブリッド・ベクトル索引に対して実行されます(「ハイブリッド・ベクトル索引の管理」を参照)。ハイブリッド・ベクトル索引を問い合せるには、
DBMS_HYBRID_VECTOR.SEARCH
PL/SQLファンクションを使用します。 -
ハイブリッド・ベクトル索引を作成したら、次にまとめた5つの検索モードで索引を問い合せることにより使用できます:
-
キーワードとベクトルの両方のハイブリッド検索を実行すると、結果は1つの結果セットに結合(または融合)されます。このようなハイブリッド検索の結果は、結果を解釈できるように理解するために重要なスコアリング・メカニズムに基づいています。
類似検索では、チャンクのランキングを決定するために
VECTOR_DISTANCE
値の概念が使用されますが、従来のOracle Text検索では、CONTAINS
スコアとも呼ばれるキーワード・スコアの概念が使用されます。これらの2つのメトリックは大きく異なり、一方は他方と比較するために直接使用できません。このため、類似検索の距離は、セマンティック・スコアと呼ばれるCONTAINS
スコアに相当するものに変換または正規化され、その値の範囲は100 (最高)から0 (最低)になります。このように、キーワード・スコアとセマンティック・スコアは、ハイブリッド検索の実行時に比較できます。
次の説明のために、「ハイブリッド・ベクトル索引の理解」と同じユースケースを使用しています。
ドキュメント・モードでの純粋なセマンティック
ドキュメント・モードでの純粋なセマンティックでは、ベクトルのみの検索を実行してドキュメント・レベルの結果をフェッチします。
次の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
},
]
この文を解釈する方法を次に示します:
-
すべてのベクトルに対して類似検索が実行され、最大で上位k件が抽出されます。値kは内部的に計算されます。それぞれにベクトル・スコアが与えられます。
-
これらのkベクトル(最大)は、ドキュメントID別にグループ化され、識別された各ドキュメントについて、そのドキュメントで見つかった関連する各ベクトルのセマンティック・スコアを使用して、その特定のドキュメントに対するこれらのスコアの平均(この例では)が計算されます。
-
平均値が最も高い上位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);
この文を解釈する方法を次に示します:
-
すべてのベクトルに対して類似検索が実行され、最大で上位k件が抽出されます。値kは内部的に計算されます。それぞれにベクトル・スコアが与えられます。
-
スコアが最も高い上位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);
この文を解釈する方法を次に示します:
-
ドキュメントの最大数を返す
CONTAINS
問合せが実行されます。この最大数は内部で計算されます。各ドキュメントにはキーワード・スコアが付けられます。 -
スコアが最も高い上位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
の類似度問合せ文字列を満たすドキュメント識別子のリストです。
検索が完了したら、次に示すように結果をマージしてスコアリングする必要があります:
前述の図で概説したように、
-
最初に、両方の検索結果が
UNION ALL
操作を使用して追加されます。 -
最終スコアリングの前に、
SEARCH_FUSION
操作を指定して、この中間結果セットから保持する内容を定義できます。 -
次に、Reciprocal Rank Fusion (RRF)やRelative Score Fusion (RSF)などの定義された
SEARCH_SCORER
アルゴリズムを使用して、最終スコアリングが計算されます。最終スコアリングでは、取得した各ドキュメント識別子に対して、取得元のソート操作に応じて、指定されたSCORE_WEIGHT
およびRANK_PENALTY
値を使用できます。 -
最後に、定義された最大
topN
件のドキュメント識別子が返されます。
使用可能な融合演算子を次に示します:
チャンク・モードでのキーワードおよびセマンティック
キーワード・スコアとセマンティック・スコアを結合してチャンク結果がフェッチされる、ハイブリッド検索の別の純粋ではないケースを見てみましょう。
次の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
類似度問合せ文字列を満たすチャンク識別子および関連するドキュメント識別子のリストです。
検索が完了したら、次に示すように結果をマージしてスコアリングする必要があります:
前述の図で概説したように、
-
最初に、両方の検索結果がドキュメント識別子の
RIGHT OUTER JOIN
操作に送信されます。 -
最終スコアリングの前に、
SEARCH_FUSION
操作を指定して、この中間結果セットから保持する内容を定義できます。 -
次に、Reciprocal Rank Fusion (RRF)やRelative Score Fusion (RSF)などの定義された
SEARCH_SCORER
アルゴリズムを使用して、最終スコアリングが計算されます。最終スコアリングでは、取得した各ドキュメント識別子に対して、取得元のソート操作に応じて、指定されたSCORE_WEIGHT
およびRANK_PENALTY
値を使用できます。 -
最後に、定義された最大
topN
件のチャンク識別子が返されます。
使用可能な融合演算子を次に示します:
MINUS_VECTOR
、UNION
およびTEXT_ONLY
は無視されます。MINUS_VECTOR
を指定すると、すべての結果が除外されます。TEXT_ONLY
およびUNION
は、右外部結合で重複しないテキスト結果が除外されるため、使用できません。
関連トピック
親トピック: ハイブリッド検索の実行