RyanCodrai/turbovec
A vector index built on TurboQuant, written in Rust with Python bindings
解決する課題
turbovecは、大規模なベクトル検索に関連する高いメモリ使用量とレイテンシの問題を解決します。これにより、膨大なコーパス(例:1,000万ドキュメント)を、高い検索速度と再現率を維持しながら、RAMのわずかな割合(float32の31 GBに対し4 GB)で保存することができ、高価な学習フェーズや頻繁なインデックスの再構築の必要性を排除します。
仕組み
データに依存しない量子化器であるTurboQuantアルゴリズムを実装しており、別途学習フェーズなしでベクトルを圧縮します。プロセスは以下の通りです:
- Normalization: ベクトルをハイパースフィア上の単位方向に変換します。
- Random Rotation: 座標分布を予測可能(Beta分布)にするため、ベクトルにランダムな直交行列を乗算します。
- Calibration (TQ+): 再現率を向上させるため、経験的な分位数をコードブックのセントロイドにマッピングするための、オプションの座標ごとのシフトとスケールを適用します。
- Lloyd-Max Quantization: 事前に計算された最適な境界に基づいて、座標を小さな整数にバケット化します(例:2ビットの場合は4バケット、4ビットの場合は16バケット)。
- Bit-packing: これらの整数をバイト内に密にパッキングして、極限まで圧縮します。
- SIMD Acceleration: 手書きのカーネル(ARMにはNEON、x86にはAVX-512)が、圧縮されたデータ上で直接、高速な検索とフィルタリングを実行します。
対象ユーザー
プライバシー、メモリ効率、低レイテンシが極めて重要となる、Retrieval-Augmented Generation (RAG) システムを構築する開発者、特にエアギャップ環境やローカル環境で運用する開発者向けに設計されています。
ハイライト
- 学習フェーズなし: オンラインインジェストにより、パラメータ調整やインデックスの再構築なしでベクトルを追加できます。
- 極限の圧縮: float32と比較して、メモリ使用量を最大16倍削減します。
- 高いパフォーマンス: ARMおよびx86アーキテクチャの両方において、検索速度でFAISS IndexPQFastScanを上回ります。
- インクリメンタルな永続化:
sync(path)メソッドは、前回の同期以降の変更のみを保存するため、クラッシュに強く高速な更新が可能です。 - 検索時のフィルタリング: IDの許可リストをサポートしており、過剰なフェッチを避けるためにSIMDカーネル内で直接処理されます。
- フレームワーク対応: LangChain、LlamaIndex、Haystack、Agnoのベクトルストアのドロップイン・リプレイスメントを提供します。
関連
- Dispatch
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト