世界を動かす技術を、日本語で。

Turbovec – GoogleのTurboQuantを用いたRustによるベクトル検索

2026年8月19日原文(github.com)

概要

  • turbovec は、Google Researchの TurboQuantアルゴリズム をベースにした、Pythonバインディング付きのRust製ベクトルインデックス。
  • 圧倒的な圧縮率高速な検索性能 で、FAISSを上回る実績。
  • オンライン追加・削除・インクリメンタル保存 など、運用に便利な機能を多数搭載。
  • 検索時フィルタリング外部ID管理、多様なフレームワーク統合に対応。
  • プライバシー重視低レイテンシ用途 のRAG構築に最適。

turbovecの特徴と概要

  • 10Mドキュメントコーパス をfloat32で格納すると 31GB 必要だが、turbovecなら 4GB で収まり、FAISSよりも高速検索可能。
  • TurboQuantアルゴリズム は、データ非依存型の量子化手法。最適に近い歪みで、 トレーニング不要
  • オンラインインジェスト対応。追加したベクトルは即時インデックス化、 再トレーニングやパラメータ調整不要
  • 高速SIMD検索。ARM(NEON SDOT/SMMLA)、x86(AVX-512 VNNI, vpermb, AVX2)に最適化された手書きカーネル。
  • FAISS IndexPQFastScan と比較して、4-bitで平均3.4倍、2-bitで23%高速化(両アーキテクチャで実証)。
  • インクリメンタル保存。sync(path)で差分のみ保存、fsync1回、クラッシュセーフ設計。
  • 検索時フィルタ。idの許可リストやビットマスクを渡せば、その範囲のみからk件返却、 過剰取得やリコール低下なし
  • ローカル完結。データはマシンやVPC外に出ない。オープンソース埋め込みモデルと組み合わせて エアギャップRAG 構築可能。

Pythonでの基本利用例

  • pip install turbovec でインストール。
  • TurboQuantIndexの作成とベクトル追加:
    • from turbovec import TurboQuantIndex
    • index = TurboQuantIndex(dim=1536, bit_width=4)
    • index.add(vectors)
    • index.add(more_vectors)
  • 検索例:
    • scores, indices = index.search(query, k=10)
  • 保存・ロード・インクリメンタル保存:
    • index.write("my_index.tv")
    • loaded = TurboQuantIndex.load("my_index.tv")
    • index.sync("my_index.tv")
  • ベクトル・クエリはfloat32型2次元配列((n, dim))。他の型は明示的に変換が必要。

安定した外部ID運用(IdMapIndex)

  • 外部IDでの追加・削除 が可能なIdMapIndex利用方法:
    • from turbovec import IdMapIndex
    • index = IdMapIndex(dim=1536, bit_width=4)
    • index.add_with_ids(vectors, np.array([1001, 1002, 1003], dtype=np.uint64))
    • scores, ids = index.search(query, k=10)
    • index.remove(1002) # O(1)で削除
    • index.write("my_index.tvim")
    • loaded = IdMapIndex.load("my_index.tvim")
    • index.sync("my_index.tvim")

ハイブリッド検索(フィルタ付き検索)

  • 他システム(SQL, BM25等)で候補IDを絞り、turbovecで再ランキング
    • 検索時にallowlistを渡すことで、 SIMDカーネル内部で効率的にフィルタ処理
    • 許可リストが小さい場合、 SIMDコストの大部分を回避
    • 出力はmin(k, n_allowed)件を厳密に返却。

フレームワーク統合

  • LangChain :langchain_core.vectorstores.InMemoryVectorStoreを置換
  • LlamaIndex :llama_index.core.vector_stores.SimpleVectorStoreを置換
  • Haystack :haystack.document_stores.in_memory.InMemoryDocumentStoreを置換
  • Agno :agno.vectordb.lancedb.LanceDbを置換
  • Rust でもcargo add turbovecで利用可能

TurboQuant vs FAISS 詳細比較

  • TurboQuant(TQ+)はFAISS PQより高リコール (R@1)を複数条件で実現。
  • d=1536やd=3072の高次元埋め込みでは、TQ+がFAISSを上回る。
  • GloVe(低次元)では4-bitでTQ+が優位、2-bitではFAISSがやや優勢だがTQ+校正で逆転。
  • FAISS IndexPQ(LUT256, nbits=8, float32 LUT) を強力なベースラインとして比較。

ベンチマーク結果と性能

  • 検索速度 :100Kベクトル、1Kクエリ、k=64、5回中央値
    • ARM:4-bitで3.5倍、2-bitで26%高速(SDOT/SMMLAカーネル)
    • x86:4-bitで3.4倍、2-bitで20%高速(AVX-512 VNNIカーネル)
  • 挿入・削除レイテンシ
    • 1ベクトルaddで6.3–19.7μs(FAISSの7.6–13.9倍高速)
    • 100ベクトルバッチで4.6–16.3μs/ベクトル
    • 削除は0.44–1.37μs/回、FAISSは0.19–1.02秒(100K時、桁違いの高速化)
  • 保存・ロード
    • TurboQuantは単一.tvファイルへfsync+アトミックリネーム
    • 再開・最初のクエリまでのラウンドトリップも高速

TurboQuantの仕組み

  • 各ベクトルは高次元球面上の方向ベクトルとして扱う。
  • 正規化 :ノルムを除去し、方向のみを単位球面上に配置。
  • ランダム回転 :全ベクトルを同じランダム直交行列で回転。各座標が既知の分布(Beta分布)になる。
  • 座標ごとの校正(TQ+) :有限次元では分布が理想からズレるため、各座標に2スカラー(シフト・スケール)を適用し、分布を補正。
  • Lloyd-Max符号本 で目標分布に量子化。

利用シーンとメリット

  • プライバシー重視メモリ効率低レイテンシ が求められるRAG用途に最適。
  • エアギャップ構成独自埋め込みモデル との組み合わせで、完全ローカル運用が可能。
  • 大規模コーパス でも低メモリ・高速・高精度を維持。

より詳細なAPIやドキュメントは docs/api.md を参照。

Hackerたちの意見

READMEがもうちょっと人間らしく書かれてたらいいな。実際にみんなに使ってもらいたいプロジェクトなんだから。

Anthropicの社員です。これがクールエイドを飲んだときの脳の状態だよ。

すごい!10百万のドキュメントで4GBって。これなら逆インデックスを前よりもずっと早く作れるし、デバッグやパフォーマンステストみたいな開発プロセスもスムーズになるね。sqliteのバインディングが出るのが待ちきれない!

削除のレイテンシが対数スケールになってるのも、かなりヤバいね。

これはローカルでプライバシー重視の検索にぴったりだけど、Rustで作られてるから、ブラウザ拡張機能の中で直接WASMにコンパイルする試みをした人いる?

興味ある!

oxirsは埋め込みやGraphRAG、Tantivyを使った全文検索を行ってる。oxirs-vec、oxirs-graphragもあるし、RDFとSPARQLのバインディングを持つoxirs-wasmもあって、クエリバジェットがある。Tantivy-wasmのリリースWASMバンドルは1.5MBって言ってる。cool-japan/oxirs: https://github.com/cool-japan/oxirs oxirs-wasm: https://crates.io/crates/oxirs-wasm tantivy-wasm: https://github.com/phiresky/tantivy-wasm MCPローカルメモリインターフェースを追加する利点って、Rust CLIの使い方に関するエージェントの指示よりあるのかな?それから、トークンとリンクデータグラフでないエージェント用に、Google OKFのようなフロントマターYAMLメタデータを持つMarkdownドキュメントを書くのはどう? https://github.com/GoogleCloudPlatform/knowledge-catalog/blo...

WASMってAVX512-VNNI使えるの?

既存のパイプラインに適応させたい人がいたら、私は似たようなアイデアを使ってジョブ検索用にベクトルを圧縮してるよ。約8倍の圧縮率で、品質は約3.5%落ちる感じ。私の実験はこちら: https://corvi.careers/blog/vector-search-embedding-compressi...

うわ、これはすごい!O_O 素晴らしい仕事だね!

なんでQdrantを使わないの?もう何ヶ月もTurboQuantと統合してるし、うまく動いてるよ。

FAISSはもうSoTAには遠いね。: https://ann-benchmarks.com/index.html https://vector-index-bench.github.io/ https://big-ann-benchmarks.com/neurips23.html

Hacker Newsで議論の続きを見る