このガイドでは、次の内容を学びます。
- ベクトル検索 の基本を簡単に理解する
- 近似最近傍 (ANN) と Hierarchical Navigable Small World (HNSW) について学ぶ
- 量子化ビット (QBit) について学ぶ
- DBPedia dataset を使って、QBit で ベクトル検索 を実行する
ベクトル検索の基礎
埋め込みを理解する
近似最近傍 (ANN)
量子化
- 量子化したコピーを元のカラムと併せて保持する - ストレージは 2 倍になりますが、いつでも完全な精度の値にフォールバックできるため安全です
- 元の値を完全に置き換える (INSERT 時にダウンキャストする) - 容量と I/O を節約できますが、後戻りはできません
Hierarchical Navigable Small World (HNSW)
アプローチの比較
QBit の詳細解説
量子化ビット (QBit)
BFloat16、Float32、Float64 の値を格納できる新しいデータ構造です。
各数値を丸ごと格納するのではなく、QBit は値をビットプレーンに分割します。つまり、1 番目のビットをまとめたもの、2 番目のビットをまとめたもの、3 番目のビットをまとめたもの、という形です。
この手法により、従来の量子化における主な制約を解消できます。重複データを保存する必要がなく、値が意味を失うリスクもありません。また、QBit はインメモリ索引を維持するのではなく、保存されたデータを直接処理するため、HNSW の RAM ボトルネックも回避できます。
制限QBit はベクトル検索を高速化しますが、計算量は依然として O(n) のままです。つまり、データセットが十分に小さく、HNSW 索引が RAM に余裕を持って収まるのであれば、依然としてそれが最速の選択肢です。
データ型
FixedString(N) カラムに格納されます。これは長さ N バイトの固定長文字列で、メモリ上では区切りなしで連続して格納されます。こうしたグループはすべて単一の Tuple にまとめられ、これが QBit の基盤となる構造を構成します。
例: 8×Float64 要素のベクトルから始めると、各グループには 8 ビットが含まれます。Float64 は 64 ビットなので、最終的に 64 個のグループ (各ビットに1つ) になります。したがって、QBit(Float64, 8) の内部レイアウトは 64×FixedString(1) カラムからなる Tuple のようになります。
距離の計算
L2DistanceTransposed 関数に精度パラメータを指定して使用します。
I/O 最適化
計算の最適化
BFloat16 の最適化
Float64 の複雑さ
DBpedia を使った例
セットアップ
検索クエリ
総当たり検索との性能比較
総当たり検索との性能比較
重要な知見
結論
2025年10月28日公開の、Raufs Dunamalijevs によるブログ記事をもとに編集