- SQLiteの標準的な全文検索(FTS5)拡張と
sqlite-vec によるセマンティック検索を組み合わせて、アプリケーションで「ハイブリッド検索」を作成できる
- キーワード優先、
semantic による再ランキング、相互順位融合など、さまざまな方法で結果を結合できる
- 何よりも、すべてがSQLiteに含まれているため、実験やプロトタイプを安価かつ簡単に作成でき、外部サービスも不要
sqlite-vec および他のベクトル検索ツールの主なユースケースは、テキストデータに「セマンティック検索」を提供すること
- 全文検索(キーワード検索)だけでは、常に良い結果が得られるとは限らない
- "climate change" を検索しても、"global warming" のような文書は返ってこない
- セマンティック検索を使えば、「雰囲気」で結果を探し、より意味の豊かな結果を返せる
- しかし、「セマンティック検索」だけを使うと、アプリケーションに悪影響を及ぼす可能性がある
デモ: NBCニュースの見出し
- 2024年1月から8月までの14,500件以上の見出しを含むデータセットを使用
- 合計4.3MBのテキストデータで、非常に小さなデータセット
FTS5テーブルを作成する
fts_headlines 全文検索仮想テーブルを作成
headline 列を宣言
content= および content_rowid= オプションを構成
- 基本の
articles テーブルから直接 INSERT INTO
- FTS5テーブルをクエリするには、単一の
SELECT 文だけでよい
sqlite-vec でベクトル検索を構築する
sqlite-vec はベクトル保存とベクトル比較を提供するが、埋め込みの生成は行わない
- この例では
sqlite-lembed 拡張と Snowflake Artic Embed 1.5 モデルを使用
- テキストを
lembed() で埋め込み、vec0 仮想テーブルに保存
- KNNクエリにも単一の
SELECT 文だけでよい
ハイブリッド手法1: 「キーワード優先」
- まず全文検索の結果を返し、その後で残りをベクトル検索で補完
- CTEで実装できる
- 結果を
UNION ALL で結合
ハイブリッド手法2: 相互順位融合(RRF)
- FTS5とベクトル一致の結果に順位を付ける
- 単一の
SELECT クエリとCTEで実装可能
:weight_fts または :weight_vec を変更して、FTS5/ベクトル結果の順位付けを調整できる
ハイブリッド手法3: 意味に基づく再ランキング
- FTS5検索のみを実行し、ベクトル距離に応じて結果を再ソート
- キーワード一致の結果だけを得つつ、より意味的に適合するものを上位に移動
- BM25の欠点を補うのに役立つ
どのアプローチを選ぶべきか?
- アプリケーションとユースケースによって異なる
- メール受信トレイ向けの検索エンジンを構築するなら、キーワード優先がより適している
- 社内文書向けにRAGを構築するなら、RRFは良い選択肢
- Webアプリに「重複投稿」機能を構築するなら、意味に基づく再ランキングがうまく機能する
今後の改善点
- FTS5クエリは「ハイライト」によって文書内の一致箇所を表示できるが、
sqlite-vec はクエリベクトルと文書間のL2/コサイン距離しか返さない
- FTS5クエリにはフレーズ、
NEAR クエリ、ブール演算子などの機能もあるが、これをベクトル検索で使うと不自然になる
- FTS5 +
sqlite-vec によるハイブリッド検索の拡張はぎこちなくなることがある
- FTS5テーブルは毎回データセット全体に対して全文検索を行うため、メタデータフィルタリングや単一FTS5インデックスのサポートができない
sqlite-vec も同様だが、パーティショニングとメタデータフィルタリングのサポートはまもなく提供される予定
GN⁺の意見
- SQLiteを使ったハイブリッド検索は、実験やプロトタイピングが容易で、さまざまなアプリケーションで有用と思われる。データが単一ファイルに保存され、複数のクエリを単一の
SELECT 文でテストでき、コストがかからず、あらゆるプログラミング言語で動作し、数行のコードで簡単に実装できる点が利点
- ただし、FTS5と
sqlite-vec の間にはまだ改善の余地がある。FTS5は文書内の一致箇所をハイライトできる一方、sqlite-vec はクエリベクトルと文書の間の距離しか返さない。また、FTS5の高度な機能を使う際には、ベクトル検索との組み合わせが不自然になることもある
- こうした制約があるにもかかわらず、SQLiteを使ったハイブリッド検索は、データサイズやアプリケーションの種類を問わず、キーワード検索とセマンティック検索の利点を両方活用できる強力なソリューション
- 非構造化データから情報を抽出し、検索可能な形にすることの重要性が高まる中、FTS5のようなキーワード検索と
sqlite-vec のようなベクトル検索を組み合わせることで、キーワード一致と文脈的関連性の両方を考慮した高度な検索が可能になる
- 既存の検索システムに
sqlite-vec を追加する場合でも、新しい検索アプリケーションを開発する場合でも、SQLiteベースのハイブリッド検索は検討に値する。特に、埋め込みモデル自体をカスタマイズできる点は大きな利点
1件のコメント
プロジェクトで、sqliteに100万件以上のデータを投入して加工する作業を行いました。
データ量が多いなら、良いSSDが必要だと思います。(SATA SSDを使っていたため、処理時間が少し長くなった気がしました)