pgvector:在 Postgres 里直接做向量检索
2026/6/8 14:27:46 网站建设 项目流程

文章目录

  • 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&&makeinstall

Windows 用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 和事务都天然支持。向量量化和子向量索引给的扩展路径,足够撑到十亿级别向量的场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询