このリポジトリは、RediSearchを使用してベクトル検索(embedding search)を行うサンプルアプリケーションです。AirBnBのリスティングデータとそのテキスト埋め込みを使用して、類似のリスティングを検索する機能を提供します。
- RediSearchを使用したベクトル検索(FLATとHNSWの両方のインデックスタイプをサポート)
- Hugging Faceのデータセット(MongoDB/airbnb_embeddings)の利用
- OpenAI API(text-embedding-3-small モデル)を使用したテキスト埋め込みの生成
- テキスト埋め込みを使用した類似性検索
- 価格範囲によるフィルタリング機能
- FLATとHNSW検索結果の比較機能
- Docker
- Docker Compose
- OpenAI API キー
-
リポジトリのクローン:
git clone https://github.com/dmae3/redisearch-embedding-search-sample.git cd redisearch-embedding-search-sample
-
OpenAI API キーの設定: ホストマシンで環境変数を設定します:
export OPENAI_API_KEY=your_actual_api_key_here
-
Docker Composeを使用してビルドと起動:
docker-compose up --build
注: docker-compose.ymlファイルは環境変数
OPENAI_API_KEY
を使用してAPIキーをコンテナに渡します。 -
アプリケーションの実行: アプリケーションは自動的に起動し、インタラクティブなプロンプトが表示されます。
-
検索の実行:
- プロンプトに従って、検索クエリを入力します。
- 最小価格と最大価格を入力してフィルタリングします。
- WiFiの要件を指定します。
- FLATとHNSWの両方の検索結果が表示されます。
-
アプリケーションの終了: 検索プロンプトで 'quit' と入力するか、Ctrl+Cを押してDocker Composeを終了します。
-
データのロード:
- Hugging Faceの"MongoDB/airbnb_embeddings"データセットをロードします。
- 各リスティングのデータ、埋め込み、およびアメニティ情報をRedisに保存します。
-
インデックスの作成:
- RediSearchを使用して、複数のインデックスを作成します:
- テキスト埋め込みに対するFLATベクトルインデックス
- テキスト埋め込みに対するHNSWベクトルインデックス(近似最近傍探索用)
- アメニティはJSON形式で保存
- 価格に対する数値インデックス
- RediSearchを使用して、複数のインデックスを作成します:
-
検索プロセス: a. クエリ処理:
- ユーザーの入力クエリに対してOpenAI APIを使用して埋め込みを生成
b. プレフィルタリング:
- 指定された価格範囲でフィルタリング(RediSearchのクエリ内で実行)
- 効率的なデータベースレベルでのフィルタリング
c. ベクトル類似性検索:
- FLATインデックスを使用した完全な精度の検索
- HNSWインデックスを使用した高速な近似検索
- 各検索方式で上位K件の類似リスティングを取得
d. ポストフィルタリング:
- WiFi要件がある場合、アメニティリストを確認
- メモリ上でJSONパースされたアメニティリストを検証
- 要件を満たさないリスティングを除外
- 指定された件数(top_k)に達するまで結果を表示
-
結果の表示:
- FLAT検索とHNSW検索の結果を別々に表示
- 各リスティングについて:
- 基本情報(名前、説明、価格、収容人数)
- 類似度スコア
- 利用可能なアメニティの一覧(3列で整形)
- WiFiの利用可能性を明示的に表示
- フィルタリング後の最終的な検索結果数を表示
このアプリケーションでは、2つの異なるベクトル検索方式を実装し、パフォーマンスを比較できます:
-
FLAT検索:
- 完全な精度を提供
- すべてのベクトルとの比較を行うため、データセットが大きい場合は遅くなる可能性がある
- 正確な最近傍探索が必要な場合に適している
-
HNSW検索:
- 近似最近傍探索を使用
- FLATよりも高速な検索が可能
- わずかな精度の低下と引き換えに、大規模データセットでも効率的な検索が可能
- 高速な検索が必要で、完全な精度が必須でない場合に適している
各検索実行時に、以下のパフォーマンス指標が表示されます:
-
検索時間の計測:
- FLAT検索の実行時間(秒)
- HNSW検索の実行時間(秒)
- 両者の速度差(HNSWがFLATの何倍速いか)
-
結果の比較:
- 両方の検索方式による結果を並べて表示
- 類似度スコアの違いを確認可能
- 検索結果の順序や内容の違いを比較可能
この比較機能により、以下のような分析が可能です:
- データセットサイズによる性能の違い
- クエリの複雑さが検索時間に与える影響
- フィルタリング条件による検索時間の変化
- HNSW近似検索の精度と速度のトレードオフ
このプロジェクトは MITライセンス の下で公開されています。