RDS PostgreSQL基於pgvector外掛程式提供RabitQ索引能力。RabitQ是一種高壓縮比的向量量化索引方法,相較於pgvector原生索引,可大幅降低索引儲存空間,並顯著提升向量搜尋吞吐,同時保持較高的召回精度。本文介紹RabitQ索引的基本原理、使用方式以及與pgvector原生索引的效能測試對比。
背景
RabitQ是一種先進的向量量化方法,其核心理論包括以下三方面:
高壓縮比的向量量化:把D維空間上的點投影到單位球面上,RabitQ的碼本是這個單位球面上內接立方體的所有頂點。每一維的取值都是 1/√D 或 -1/√D。這樣碼本上的每一條向量都可以用一個D-bit的串來表示,相較於原生pgvector使用float32數組表示每一條向量,實現了高達32倍的壓縮比。
距離計算加速:通過數學推導,RabitQ下兩條向量的距離運算可以被轉換成二進位串的位元運算和popcount運算,極大增加了距離運算效率。
無偏估計器:相較於其它的量化方式,RabitQ證明了估計距離和實際精確距離的理論最大誤差值。在向量搜尋時可以先根據估算距離初篩,再對少量向量計算精確距離並rerank,實現高精度的向量搜尋。
前提條件
如需啟用RabitQ索引,RDS PostgreSQL執行個體需滿足以下要求:
執行個體大版本為RDS PostgreSQL 14或以上。
執行個體核心小版本為20260330或以上。
執行個體已安裝pgvector外掛程式,且外掛程式版本為0.8.0.2或以上。
使用方式
阿里雲在pgvector原生的ivfflat access method上拓展了RabitQ與ivf索引結合的能力。索引構建時,先進行ivf聚類,然後對每個cluster下的向量進行RabitQ量化,並保證了對存量ivfflat索引的完全向前相容。
步驟一:檢查並升級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";步驟二:建立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聚類的中心數量,建議根據資料規模選擇合適的值。
步驟三:調整搜尋參數
ivf-RabitQ在原有ivfflat的索引構建參數和查詢參數基礎上,引入了下表所列的搜尋參數。您可以通過SET命令在會話層級調整這些參數。
參數名 | 預設值 | 取值範圍 | 說明 |
| 1.9 | [0.1, 4.0] | 無偏估計器裡計算誤差的係數。設定越大,召回率越高。 |
| 10 | [1, 32768] | rerank階段,調整計算精確距離的向量數量。建議設定等於向量召回的數量。 |
| 5000 | [1, INT_MAX] | rerank階段,調整重排序的向量數量。 |
效能測試
測試環境
測試項 | 說明 |
RDS PostgreSQL執行個體 |
|
測試載入器 | ann-benchmarks |
測試資料集 |
|
測試參數 |
|
索引構建對比
在相同資料集和構建參數下,對比ivf-RabitQ與pgvector原生ivfflat索引的構建時間和佔用空間:
索引類型 | 建立時間 | 索引空間 |
ivfflat(原生) | 95.32s | 7820MB |
ivf-RabitQ | 78.72s | 248MB |
從結果可以看出,相比pgvector原生ivfflat索引,ivf-RabitQ將索引空間從7820MB降至248MB,壓縮比約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-Recall曲線如下圖所示,包含多種索引類型的對比測試結果:
pgvector:社區原生hnsw索引。pgvector_ivfflat:社區原生ivfflat索引。pgvector_ivfrabitq:ivf-RabitQ索引。pgvector_hnsw_rabitq:hnsw-RabitQ索引,引入重排序。pgvector_hnsw_rabitq_without_refine:直接使用量化距離,以換取更高的查詢效能。
