ハイブリッド検索とは?

ハイブリッド検索は、複数の検索アルゴリズムを組み合わせることで、検索結果の精度や関連性を向上させる技術です。一般的に、ハイブリッド検索とはキーワード検索とベクトル検索を組み合わせた方法を指します。これら二つのアルゴリズムの強みを活用することで、ユーザーに効果的な検索体験を提供します。
Weaviateベクトルデータベースにおけるハイブリッド検索では、スパースベクトルとデンスベクトルの両方が利用されます。
スパースベクトルにはトークナイザーが必要ですが、Weaviate v1.28 では日本語テキスト向けに新しいトークナイザーKAGOME_JAが導入されました。
このブログ記事では、ハイブリッド検索の基本を学び、日本語テキストでKAGOME_JAトークナイザーを使ったWeaviateのハイブリッド検索の方法を解説します。
ハイブリッド検索の説明
Weaviateのハイブリッド検索は、デンスベクトルとスパースベクトルを統合して、それぞれの検索手法の利点を活かします。 これら二つのベクトルは異なるアルゴリズムによって計算されます。

キーワード検索
キーワード検索にはスパースベクトルを使用します。 スパースベクトルは、主にゼロ値が多く一部に非ゼロ値を持つ構造をしており、デンスベクトルは主に非ゼロ値で構成されています。 スパース埋め込みは、BM25 や SPLADE のようなアルゴリズムから生成されます。 Weaviateにおける現在のハイブリッド検索実装では、BM25/BM25Fが使用されています。
スパース埋め込みを生成するためには、トークナイザーが必要です。 Weaviateでは、日本語テキスト向けに以下の3つのトークナイザーが利用可能です。
| トークナイザー | TRIGAM | GSE | KAGOME_JA(Weaviate v1.28で導入) |
|---|---|---|---|
| メリット | 辞書不要 部分一致する | 辞書にある単語をできるだけ 部分一致する | 辞書にある単語 不要な結果が出ない |
| デメリット | 不自然な単語がある 出てくる単語が多数 | 英単語は1文字ずつに分割 不自然な単語がある 辞書が必要 | 単語中の部分一致はしない 辞書が必要 |
| Source: Jun Ohtani |
ベクトル検索
ベクトル検索にはデンスベクトルを使用します。 デンス埋め込みは、GloVeやTransformersといった機械学習モデルから生成されます。これらのベクトルは情報が密に詰まっており、ほとんどが非ゼロ値で構成されています。ベクトルデータベースはこれらの埋め込みを保存し、二つのベクトル間の距離を計算します。この距離メトリクスにより、二つのベクトル埋め込みがどれほど類似しているか、または異なるかがわかります。検索クエリもデータベクトルと同様にベクトルに変換され、その距離値によってベクトルの近さが決まります。
融合アルゴリズム
キーワード検索とベクトル検索の結果を単一のランキングリストに統合する方法はいくつかあります。Weaviate v1.20以降では、以下の2つのアルゴリズムが利用可能です:
rankedFusionrelativeScoreFusion
これらの融合アルゴリズムについての詳細は、こちらの記事で解説されています。
さらに、alphaパラメータを用いてキーワード検索とベクトル検索の結果の重み付けを調整できます:
alpha = 0:キーワード検索のみalpha = 1:ベクトル検索のみalpha = 0.5:スパースとデンスのベクトルを均等に重み付け
ハイブリット検索のメリット
ハイブリッド検索は、ベクトル検索の機能を活用しつつ、正確なキーワード一致も必要とする検索システムに理想的です。
例えば、「春のドレス」というクエリを考えてみましょう。通常のキーワード検索やベクトル検索に比べて、ハイブリッド検索を使用する方がより良い結果を得られます。デンスベクトル表現では「春」が花柄や軽い素材を意味すると解釈され、キーワード検索では「ドレス」という単語に正確に一致します。 このように、ハイブリッド検索はスパースベクトルとデンスベクトルの両方の利点を活かします。
一般的に、デンスベクトルはクエリの文脈を理解するのに優れており、スパースベクトルはキーワード一致に優れています。
Weaviateのハイブリッド検索 実装
これで、ハイブリッド検索の概要と日本語テキストへの応用がわかるようになったと思います。KAGOME_JAトークナイザーを活用して、Weaviateでさらに効果的な検索を実現しましょう!
data = [
["スポーツ用レギンス", "吸湿速乾性に優れた素材で作られたレギンス。ジムやヨガ、ランニン グに最適です。"],
["点線模様の長靴", "雨の日のおしゃれにぴったりの長靴。ユニークな点線模様が特徴です。"],
["トレンチコート", "クラシックなデザインのトレンチコート。春や秋の軽い羽織りに最適な一着です。"],
["ひまわりの模様のドレス", "明るいひまわり柄が夏らしい印象のドレス。軽やかで涼しい素材が魅力です 。"],
["ライトカーディガン", "肌寒い日の重ね着に便利なライトカーディガン。軽量で持ち運びにも便利です。"],
["フローラルミニスカート", "春や夏にぴったりの花柄ミニスカート。華やかなデザインで女性らしさを引き立てます。"],
["ピンクのスカート", "柔らかなピンク色がかわいらしいスカート。シンプルなデザインで コーディネートしやすいです。"],
["カシミアセーター", "高級感のあるカシミア素材で作られたセーター。寒い冬に暖かさとスタイルを提供します。"],
["ライトウールスカーフ", "秋や冬にぴったりのウールスカーフ。軽量で肌触りが良く、暖かさをプラスします。"],
["ニットドレス", "柔らかく暖かい素材で作られたニットド レス。寒い季節のカジュアルスタイルに最適です。"],
["ミディプリーツスカート", "エレガントなシルエットが特徴のプリーツスカート。どんなトップスとも相性抜群です。"],
["花柄の傘", "雨の日を明るくしてくれる花柄デザインの傘。軽量で使いやすい構造です。"],
["長袖の紺色のドレス", "落ち着いた紺色がエレガントな 長袖ドレス。フォーマルな場にも最適です。"],
["春の花柄ドレス", "春の装いにぴったりの鮮やかな花柄ドレス。柔らかい素材で着心地も抜群です。"],
["ボア付きデニムジャケット", "冬の寒さから守るボア付きデニムジャケット。カジュアルスタイルにぴったりです。"],
["レザーアンクルブーツ", "シックで洗練されたデザイ ンのレザーアンクルブーツ。秋冬の装いにおすすめです。"],
["防水ジャケット", "雨の日の外出を快適にする防水ジャケット。軽量で動きやすいデザインが魅力です。"],
["シンプルな黒のタートルネック", "どんなスタイルにも合わせやすい黒のタートルネック。秋冬の重ね着に最適です。"],
["シフォンブラウス", "軽やかで女 性らしいデザインのシフォンブラウス。春や夏のフォーマルな場にもおすすめです。"]
]
1. Weaviate データベース作成
日本語のKAGOMEトークナイザーを使用したハイブリッド検索をWeaviateで利用するには、Weaviatev1.28以降のバージョンを使用していることを確認する必要があります。以下の手順で、Dockerを使用してWeaviateベクトルデータベースのインスタンスをローカル環境にセットアップできます:
docker run -p 8080:8080 -p 50051:50051 -e ENABLE_TOKENIZER_KAGOME_JA='true' -e ENABLE_MODULES='text2vec-cohere' cr.weaviate.io/semitechnologies/weaviate:1.28.1
次はWeaviate ClientのPythonライブラリを準備します。バージョン4.9.6以上が必要です。
!pip install weaviate-client
2. Weaviateの接続情報をセットアップ
次に、Weaviate Clientを初期化します。Weaviateに接続するための設定では、Cohereの埋め込みモデルを使用するため、CohereのAPIキーが必要です。
import weaviate, os
# Connect to your local Weaviate instance deployed with Docker
client = weaviate.connect_to_local(
headers={
"X-COHERE-Api-Key": os.environ["COHERE_API_KEY"]
}
)