跳到內容

Technology

開源|pg_vectorsearch:在 PostgreSQL 裡用 IVF 加 RaBitQ 量化做向量近似搜尋的 PRISM 索引

Tiger Data(Timescale)的 PostgreSQL 擴充套件 pg_vectorsearch 提供新的索引方法 prism,可以直接建在 pgvector 既有的欄位上。整理它的階層式 centroid 路由、RaBitQ 誤差上界兩階段篩選、VPSHUFB fastscan 頁面,以及 alpha 版本的限制。

Published: at 10:00 AM
編輯本頁下載圖卡

專案 GitHub:timescale/pg_vectorsearch

重點

以 2026 年 10 月 20 日從 GitHub API 查到的資料,專案有 393 顆星、13 個 fork、46 個開啟中的 issue,授權是 PostgreSQL License。repo 在 2026 年 1 月就已建立,v0.1.0 正式版於 10 月 13 日 21

(台北時間)發布,之前有兩個 release candidate。Hacker News 上的發表串拿到 211 分。

內容根據 README、CHANGELOG.md、docs/architecture.md、docs/fastscan-design.md,以及 src/quant/rabitq.h、src/pg/bufstorage.c、src/index/query_scan.c 等原始碼。

它解決什麼問題

在 PostgreSQL 裡做向量搜尋,最常見的是 pgvector 提供的兩種索引:

PRISM(Partitioned Routing Index for Similarity Matching)走 IVF 路線,architecture.md 自述設計參考 SPANN、SPFresh 和 ScaNN。重點是讓分群裡存的東西變小、讓距離估計可以安全地排除候選。

怎麼運作

README 列出的查詢流程:

  1. 走 centroid 樹找出最近的幾個群(在 buffer cache 裡)
  2. 掃這些群的 posting list 取得候選
  3. RaBitQ 兩階段篩選:估距離、套誤差上界、留下需要重排的
  4. 回 heap 讀全精度向量重排
  5. 回傳前 k 個

RaBitQ:1 bit 加誤差上界

src/quant/rabitq.h 的註解寫了演算法:

  1. 用隨機正交矩陣旋轉向量,讓各維的分布接近等向;
  2. 算向量減去所屬群中心的殘差;
  3. 每一維只留正負號,D 維向量壓成 D bit(32 倍壓縮);
  4. 另外存幾個浮點因子(f_add、f_rescale、f_error);
  5. 查詢時,估計距離等於 f_add + f_rescale × 內積,下界是估計值減去誤差項。

如果某個候選的距離下界已經比目前第 k 名還遠,它就不可能是答案,不必回表。這是 IVFFlat 做不到的事。RaBitQ 的方法來自 Gao 與 Long 在 SIGMOD 2024 的論文。

Fastscan:一個指令查 32 筆

docs/fastscan-design.md 說明了 posting list 的第二種頁面格式。原本的做法是逐個向量算「查詢向量在 bit 為 1 的那些維度的總和」,768 維就是約 768 次浮點加法。

Fastscan 每 4 維組成一個子量化器,4 個 bit 共有 16 種正負號組合,事先為每個子量化器算一張 16 格的 uint8 查表。1 bit 碼重新打包成 4 bit 一組,用 x86 的 VPSHUFB 一個指令查出 32 個向量的部分距離。768 維時共 96 個 VPSHUFB 處理 32 個向量。

設定(cohere-1M、nprobe=10,專案自述)原本的 1 bit 核心fastscan
QPS52967789
召回率0.7990.791
內積時間136μs46μs

同一條群的頁面鏈裡可以混放兩種頁面,以頁面 flag PRISM_POSTING_PAGE_FASTSCAN 區分。大量建索引和插入時寫一般的 AoS 頁,之後再轉換成 fastscan 頁。

其他元件

跟常見做法比

pgvector IVFFlatpgvector HNSWPRISM
結構分群圖階層式分群
群內存什麼全精度向量全精度向量RaBitQ 碼
排除候選無圖搜尋本身誤差上界
記憶體需求低高低(專案自述)

官方發表文的說法是,在 1 億筆向量的資料集上,PRISM 在同樣召回率下比 HNSW 快,而且用的機器記憶體只有四分之一。這是專案自述的數字。

同公司另有 pgvectorscale,用 Rust 寫、走 DiskANN 圖索引路線。pg_vectorsearch 用 C 寫,走 IVF 路線。

限制與成熟度

參考資料

註釋

編輯本頁

Podcast

關於語音摘要

此語音摘要由 Google NotebookLM 提供,不完全代表作者本人對文章的理解。