RDS PostgreSQL は、pgvector 拡張を通じて RabitQ インデックス機能を提供します。RabitQ は高圧縮率を実現するベクトル量子化手法であり、ネイティブな pgvector インデックスと比較して、インデックスサイズを大幅に削減しつつ、高い再現率を維持しながらベクトル検索スループットを向上させます。本トピックでは、RabitQ インデックスの基本原理を説明し、その使用方法を示すとともに、ネイティブな pgvector インデックスとのパフォーマンスベンチマークを紹介します。
背景情報
RabitQ は、以下の 3 つのコア原則に基づく高度なベクトル量子化手法です。
高圧縮ベクトル量子化:RabitQ は D 次元空間上の点を単位球面に投影し、内接超立方体の頂点をコードブックとして使用します。各座標は 1/√D または -1/√D のいずれかとなります。これにより、各ベクターを D ビットの文字列として表現できます。ネイティブな pgvector が各ベクターに float32 配列を使用するのに対し、この手法により最大 32 倍の圧縮率を達成します。
高速化された距離計算:RabitQ は、2 つのベクター間の距離計算を、それらのバイナリ文字列に対する効率的なビット演算およびポップカウント演算に変換することで、計算速度を劇的に向上させます。
不偏推定量:他の量子化手法とは異なり、RabitQ は推定距離と正確な距離の誤差について理論的な上限が証明されています。ベクトル検索中は、まず推定距離で候補をフィルターし、その後少数のベクターに対して正確な距離を計算して再ランキングを行うことで、高精度な結果を保証します。
前提条件
RabitQ インデックスを使用するには、ご利用の RDS PostgreSQL インスタンスが以下の要件を満たしている必要があります。
メジャーバージョンが RDS PostgreSQL 14 以降であること。
マイナー カーネルバージョンが 20260330 以降であること。
pgvector 拡張がインストールされており、そのバージョンが 0.8.0.2 以降であること。
使用方法
Alibaba Cloud は、ネイティブな ivfflat アクセスメソッドを RabitQ と統合することで拡張しています。インデックス構築時には、まず IVF クラスタリングを実行し、その後各クラスター内のベクターに RabitQ 量子化を適用します。これにより、既存の ivfflat インデックスとの完全な上位互換性が確保されます。
ステップ 1:pgvector 拡張の確認とアップグレード
対象データベースに接続後、次の SQL コマンドを実行して pgvector 拡張のバージョンを確認します。バージョンが 0.8.0.2 より古い場合は、アップグレードしてください。
postgres=# \dx vector
List of installed extensions
Name | Version | Schema | Description
--------+---------+--------+------------------------------------------------------
vector | 0.8.0.2 | public | vector data type and ivfflat and hnsw access methods
(1 row)
postgres=# ALTER EXTENSION vector UPDATE TO "0.8.0.2";ステップ 2:ivf-RabitQ インデックスの作成
次の SQL コマンドを実行して、ivf-RabitQ インデックスを作成します。
CREATE INDEX ON items USING ivfflat (embedding rabitq_vector_cosine_ops) WITH (lists=1000);この例では、items は対象テーブル名、embedding はベクトルデータを格納するカラム名、rabitq_vector_cosine_ops は余弦類似度用の RabitQ 演算子です。lists は IVF クラスタリングにおける重心の数です。データサイズに応じて適切な値を選択することを推奨します。
ステップ 3:検索パラメーターの調整
ivfflat のインデックス構築およびクエリパラメーターに加え、ivf-RabitQ では以下の表に示す検索パラメーターが新たに導入されています。これらのパラメーターは、SET コマンドを使用してセッションレベルで調整できます。
パラメーター | デフォルト | 値 | 説明 |
| 1.9 | [0.1, 4.0] | 不偏推定量における誤差範囲を計算するための係数です。値を大きくすると再現率が向上します。 |
| 10 | [1, 32768] | 再ランキング段階で正確な距離を計算するベクター数です。取得したいベクター数に設定することを推奨します。 |
| 5000 | [1, INT_MAX] | 再ランキングのためにスキャンするベクター数です。 |
パフォーマンスベンチマーク
テスト環境
項目 | 説明 |
RDS PostgreSQL インスタンス |
|
テストツール | ann-benchmarks |
テストデータセット |
|
テストパラメーター |
|
インデックス構築の比較
以下の表は、同一のデータセットおよびパラメーターを使用して構築した ivf-RabitQ およびネイティブな pgvector ivfflat インデックスの構築時間とインデックスサイズを比較したものです。
インデックスタイプ | 構築時間 | インデックスサイズ |
ivfflat (ネイティブ) | 95.32 s | 7820 MB |
ivf-RabitQ | 78.72 s | 248 MB |
結果から、ネイティブな pgvector ivfflat インデックスと比較して、ivf-RabitQ インデックスはインデックスサイズを 7820 MB から 248 MB に削減し、31 倍以上の圧縮率を達成していることがわかります。また、インデックス構築も高速化されています。
クエリパフォーマンスの比較
ネイティブな pgvector ivfflat インデックスと比較して、RabitQ インデックスは再現率の損失が 1 % 未満でありながら、検索パフォーマンスを数倍向上させることができます。詳細なテスト結果は以下のとおりです。
パラメーター | Ivfflat QPS | Ivf-RabitQ QPS | 高速化比率 | Ivfflat 再現率 | Ivf-RabitQ 再現率 |
nprobes = 1 | 566.36 | 1033.56 | 1.83x | 66.87% | 69.38% |
nprobes = 2 | 350.77 | 758.88 | 2.16x | 79.40% | 80.09% |
nprobes = 4 | 203.78 | 501.56 | 2.47x | 87.84% | 87.96% |
nprobes = 8 | 110.98 | 298.43 | 2.69x | 92.69% | 92.80% |
nprobes = 16 | 56.99 | 162.75 | 2.86x | 95.71% | 95.28% |
nprobes = 32 | 28.56 | 53.98 | 1.89x | 97.37% | 96.84% |
nprobes = 50 | 18.32 | 53.98 | 2.94x | 98.05% | 97.71% |
nprobes = 100 | 9.26 | 26.74 | 2.89x | 98.93% | 98.54% |
以下の図は、複数のインデックスタイプを比較した QPS-再現率曲線を示しています。
pgvector:コミュニティ版のネイティブ HNSW インデックス。pgvector_ivfflat:コミュニティ版のネイティブ ivfflat インデックス。pgvector_ivfrabitq:ivf-RabitQ インデックス。pgvector_hnsw_rabitq:再ランキングステップを含む HNSW-RabitQ インデックス。pgvector_hnsw_rabitq_without_refine:再ランキングステップを省略し、量子化距離を直接使用することでクエリパフォーマンスをさらに高めた HNSW-RabitQ インデックス。
