文章目录
- pgvector:在 Postgres 里直接做向量检索
- 1、 它能干什么
- 2、 两种索引,按需选
- 3、 过滤查询和混合搜索
- 4、 数据怎么存,怎么扩
- 5、 安装和上手
- 6、 适合谁用
pgvector:在 Postgres 里直接做向量检索
pgvector 在 GitHub 上已经拿到 21,579 Star。
它是个 Postgres 扩展,做的事情很明确:把向量数据和高维相似度检索直接塞进 Postgres 里。不用额外起服务,不用导数据,建表、插向量、查近邻,全部用 SQL 搞定。
1、 它能干什么
向量检索是 RAG 和推荐系统的核心环节。传统做法是把向量往专门的向量数据库里塞,业务数据留在 Postgres,两边各管各的,查个近邻还得跨服务。
pgvector 把这层拆掉了。向量列和普通列一样建在表上,近邻查询写成 SQL,还能 JOIN、WHERE、GROUP BY 一起用。
它支持的向量类型覆盖常见场景:
- 单精度浮点向量(
vector),最高 2,000 维 - 半精度浮点向量(
halfvec),最高 4,000 维,省一半存储 - 二进制向量(
bit),最高 64,000 维,适合量化加速 - 稀疏向量(
sparsevec),最高 1,000 个非零元素
距离函数也有六种:L2 距离、内积、余弦距离、L1 距离、Hamming 距离、Jaccard 距离。OpenAI 的文本嵌入直接就能用内积查。
2、 两种索引,按需选
精确搜索逐行算距离,结果准确但数据量大时慢。pgvector 提供两种近似索引,在速度和召回率之间取舍。
HNSW是多层图索引,查询性能高,构建慢,内存占用大。不需要先有数据就能建,没有训练步骤。
CREATEINDEXONitemsUSINGhnsw(embedding vector_l2_ops);IVFFlat把向量分到若干列表里,只搜离查询向量最近的那几列表。构建更快,内存更少,查询性能不如 HNSW。
CREATEINDEXONitemsUSINGivfflat(embedding vector_l2_ops)WITH(lists=100);建索引时调maintenance_work_mem能显著缩短构建时间。大批量写入数据时,先导入再建索引,顺序不要反。
3、 过滤查询和混合搜索
带条件的近邻搜索很常见。比如只搜某个分类下的向量,或者距离小于某个阈值的结果。
pgvector 的做法是在过滤列上建普通索引,近邻查询和条件查询一起走。如果过滤条件命中行数少,精确搜索加 Btree 索引就够快。条件命中行数多,可以用近似索引配合迭代扫描,自动扫更多索引直到结果够数。
SEThnsw.iterative_scan=strict_order;它还能和 Postgres 的全文检索混搭做混合搜索。语义相似度和关键词匹配各自跑,再用 RRF 或交叉编码器融合结果。这一套组合不需要引入新的存储组件。
4、 数据怎么存,怎么扩
向量量化的思路是:用低精度或二进制向量建索引做粗筛,原始向量留在表里做精排。pgvector 支持二进制量化表达式索引,查的时候先走 Hamming 距离召回 Top 20,再用原始向量的余弦距离精排取 Top 5。
SELECT*FROM(SELECT*FROMitemsORDERBYbinary_quantize(embedding)::bit(3)<~>binary_quantize('[1,-2,3]')LIMIT20)ORDERBYembedding<=>'[1,-2,3]'LIMIT5;半精度向量也是类似的思路:存储和索引都用halfvec,查询时类型转换一下,省空间又省内存。
子向量索引支持把高维向量拆成低维段分别建索引,适合跨模态检索里不同维度的特征分离场景。
5、 安装和上手
编译安装支持 Postgres 13+,Linux 和 Mac 上就是三板斧:
gitclone--branchv0.8.2 pgvector.gitcdpgvectormake&&makeinstallWindows 用nmake编译。Docker、Homebrew、PGXN、APT、Yum、conda-forge 这些渠道也都有包,Postgres.app 还预装了。
数据库里启用扩展:
CREATEEXTENSION vector;建表插数据:
CREATETABLEitems(id bigserialPRIMARYKEY,embedding vector(3));INSERTINTOitems(embedding)VALUES('[1,2,3]'),('[4,5,6]');查近邻:
SELECT*FROMitemsORDERBYembedding<->'[3,1,2]'LIMIT5;<->是 L2 距离,<#>是内积,<=>是余弦距离。语法和 Postgres 原生查询没有区别。
6、 适合谁用
已经用 Postgres 做业务数据库、不想为向量单独起一套存储的团队,pgvector 是最省事的方案。数据一致性、备份恢复、权限管理全部复用 Postgres 的机制,不需要额外维护一条链路。
做 RAG 系统的开发者也能直接复用,向量库和业务库在一个实例里,JOIN 和事务都天然支持。向量量化和子向量索引给的扩展路径,足够撑到十亿级别向量的场景。
Postgres 的机制,不需要额外维护一条链路。
做 RAG 系统的开发者也能直接复用,向量库和业务库在一个实例里,JOIN 和事务都天然支持。向量量化和子向量索引给的扩展路径,足够撑到十亿级别向量的场景。