このトピックでは、条件付きフィルタリング、ベクトル検索、および全文検索の任意の組み合わせを実装するTairVectorベースのハイブリッド検索ソリューションについて説明します。
背景情報
大規模言語モデル (LLM) は、ベクトルを使用して、テキスト、画像、オーディオ、ビデオなどの非構造化データの意味表現を可能にします。 ベクトルベースのk近傍 (kNN) 検索は、セマンティック検索、パーソナライズされた製品推奨、インテリジェントなQ&aなどの分野で主要な役割を果たすことが期待されています。 通常、ほとんどのベクトルデータベースサービスは、条件付きフィルタリング、全文検索、およびベクトル検索のうちの1つまたは2つの検索方法の組み合わせをサポートしています。 これらの方法は明らかな利点と欠点を有する。
条件付きフィルタリング: ブール式を使用してデータをフィルタリングし、データセットとその使用方法に厳密な制約を課します。これにより、特定のシナリオにのみ適しています。
フルテキスト検索: クエリをトークン化してドキュメントの関連性を計算し、クエリに最も関連する結果のリストを返します。 この方法は、入力エラーや文法の問題が発生しやすいテキストベースのクエリに限定されます。
ベクトル検索: セマンティックエンコードを実行し、ベクトル間の類似度を計算して、最も類似した結果のリストを返します。 この方法では、さまざまなシナリオでドキュメント、画像、オーディオ、ビデオなどの複数のタイプの非構造化データを処理できます。 ただし、この方法はLLMに大きく依存しており、企業固有のデータを処理するときに不正確な結果を返す可能性があります。
TairVectorを使用すると、関連するデータベース内で前述の検索方法を任意に組み合わせて実現できます。 単一のステートメントを使用して、これら3つの検索方法を組み合わせることができます。 このステートメントでは、画像、テキスト、オーディオ、およびビデオを使用してベクトル検索を実装し、テキストを使用してフルテキスト検索を実装し、ブール式を使用して条件付きフィルタリングを実装できます。 さらに、TairVectorはこれらのメソッドの結果を重みでソートし、最終的な候補リストを返します。
このようにして、単一の検索方法の限界を超えて、データ取得のヒット率を高めることができます。 具体的には、hybrid_ratioパラメーターを使用して、特定のリクエストに基づいてさまざまな検索方法に割り当てられる重みを調整できます。 詳細については、「ベクター」をご参照ください。
ソリューション
この例では、オープンソースのfashion-product-images-smallのデータセットを使用して、さまざまなソリューションのパフォーマンスを示します。
オープンソースのデータセットを使用する場合は、関連する契約、法律、および規制を遵守する必要があります。
データの説明
このデータセットは、44,000の製品データエントリのデータを含む。 データ形式を次の表に示します。
id (int64) | 性別 (文字列) | masterCategory (文字列) | subCategory (string) | articleType (string) | baseColor (文字列) | シーズン (文字列) | 年 (float64) | usage (string) | productDisplayName (文字列) | イメージ (dict) |
15,970 | 「男性」 | 「アパレル」 | 「トップウェア」 | 「シャツ」 | 「ネイビーブルー」 | 「秋」 | 2,011 | 「カジュアル」 | 「カメチェックメンズネイビーブルーシャツ」 | {"bytes": [ 255、216、255、...] 、"path": null} |
39,386 | 「男性」 | 「アパレル」 | 「ボトムウェア」 | 「ジーンズ」 | 「ブルー」 | 「夏」 | 2,012 | 「カジュアル」 | "Peter England Men Partyブルージーンズ" | {"bytes": [ 255、216、255、...] 、"path": null} |
59,263 | 「女性」 | 「アクセサリー」 | 「時計」 | 「時計」 | 「シルバー」 | 「冬」 | 2,016 | 「カジュアル」 | 「タイタン女性シルバーウォッチ」 | {"bytes": [ 255、216、255、...] 、"path": null} |
データ変換
TairVectorは、Key-Key-(Key-Value)
形式を使用してベクトルを格納します。 最初にベクトルインデックスを作成する必要があります。 例: hybrid_index 次に、次のルールに基づいて、上記の表のフィールドを変換します。
TairVectorで検索するために、idをプライマリキーに変換します。 このフィールドを使用して、ポイントクエリを実装できます。 ポイントクエリは、少量のデータのみをスキャンします。
imageフィールドのデータを、LLMを使用してエンコードされたベクトルに変換します。これらのベクトルに基づいて検索を実装できます。
productDisplayNameフィールドのデータをimageフィールドの対応するデータの説明に変換します。 説明を使用して、フルテキスト検索を実装できます。
他のフィールドをTairVectorの最下位レベルのキーと値のペアに変換します。 これらのキーと値のペアの数に制限はありません。 これらのキーと値のペアを使用して、従来の属性によるフィルタリングを実装できます。
次の図は、TairVectorのデータ構造を示しています。
手順とサンプルコード
データセットを読み込みます。
Tair環境を準備します。
データセットをTairにインポートします。
異なるソリューションを使用してデータを照会します。
詳細については、次をご参照ください: ハイブリッド検索コードプロジェクト
サンプルコードはaです。ipynbファイル。 このファイルを使用する前に、pip install jupyter
コマンドを実行して関連する依存関係をインストールする必要があります。
例
次の例では、さまざまなソリューションを使用して検索を実行し、対応する検索結果を表示する方法について説明します。 これらの例では、hybrid_ratioパラメーターを使用して、Green Kidwear
にクエリを実行する検索メソッドに異なる重みを付けます。 hybrid_ratioは、ベクトル検索方法の重みを指定します。 全文検索方法の重みは、次の式を使用して計算されます。1 - Value of hybrid_ratio
。
Vector search: hybrid_ratioパラメーターを0.9999に設定します。
topk = 20 text = "Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.9999} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)
結果:
全文検索: hybrid_ratioパラメーターを0.0001に設定します。
topk = 20 text = ""Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.0001} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)
結果:
ベクトル検索と全文検索を組み合わせたハイブリッド検索: hybrid_ratioパラメーターを0.5に設定します。
topk = 20 text = ""Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)
結果:
ベクトル検索、全文検索、および条件付きフィルタリングを組み合わせたハイブリッド検索: hybrid_ratioパラメーターを0.5に設定し、
subCategory == "Topwear"
ステートメントを追加します。topk = 20 text = "Green Kidswear" vector = model.encode([text])[0] filter_str = "subCategory == \"Topwear\"" kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) print(result) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)
結果:
概要
上記の結果に基づいて、ベクトル検索とフルテキスト検索の両方がクエリ要件を満たすことができます。 上位にランク付けされた候補セットに基づいて、全文検索のパフォーマンスは、ベクトル検索のパフォーマンスよりもわずかに高くなります。
ハイブリッド検索ソリューションの場合、製品が2つの検索方法で検索された場合、製品は他の製品よりも上位にランクされます。
hybrid_ratioパラメーターを使用して、ハイブリッドソリューションの検索メソッドの重みを調整できます。 このように、結果を再ランク付けして、比較的正確な結果を得ることができる。
条件付きフィルタリングを使用して特定の候補セットを除外し、ベクトル検索のヒット率を向上させることができます。