返回

文章详情

Pg_vectorsearch: 比pgvector的IVFFlat和HNSW更快的索引

Hacker News2026年10月14日 11:47

一个用于高性能近似最近邻(ANN)搜索的PostgreSQL扩展。状态:alpha。用于测试,不用于生产。升级到预发布版本时可能无法进行;计划删除并重新创建扩展及其索引。查看变更日志了解已知问题。PRISM索引(100M+向量)—— IVF风格,具有层次路由的RaBitQ量化,具有二阶段搜索的理论误差范围,SIMD优化的距离计算(AVX2,AVX512,NEON)动态更新——插入、更新和删除,通过prism_rebalance进行文档列表拆分(见维护)pgvector兼容——按原样索引现有的向量和halfvec列(见现有的pgvector表)PRISM索引PRISM(Partitioned Routing Index for Similarity Matching)是一个PostgreSQL本地索引访问方法,其概念上类似于pgvector的IVFFlat,但它围绕最先进的量化、路由和分区技术构建。它用C实现,以实现高性能和与PostgreSQL的无缝集成。结果:一个明显比pgvector的IVFFlat和HNSW更快的索引,无论是在查询还是索引构建方面。实际上,与基于图的HNSW相比,在100百万向量数据集上,PRISM在内存四分之一的实例中以等效的召回率更快。为了实现这一性能,PRISM使用层次中心树将向量分成簇,并依赖PostgreSQL缓冲缓存保持该树在内存中温暖。向量经过RaBitQ量化,并以优化的页面布局存储在文档列表中,以便进行SIMD距离计算。RaBitQ编码携带误差范围,使搜索能够排除不可能是最近邻的向量,从而减少需要与存储在表中的全精度向量重新排名的向量数量。查询流程:1.遍历中心树以查找最近的簇(缓冲缓存)2.扫描文档列表以获取候选(缓冲缓存,异步I/O)3.RaBitQ二阶段过滤:估计→误差范围→重新排名4.从堆中进行全精度重新排名5.返回k个最近邻有关详细架构,请参见docs/architecture.md。使用首先安装扩展;请参见构建。有两种方法使用PRISM索引。选择与向量所在位置匹配的那一个:原生类型。全新开始或不使用pgvector?将向量存储在pg_vectorsearch自己的vec32(float32)或vec16(float16)列中。无需其他扩展。现有pgvector表。已经有向量或halfvec列?在pgvector旁安装pg_vectorsearch,并在那些列上按原样构建PRISM索引。你的表和查询保持不变。两种路径构建相同的索引,并使用相同的操作符(<->,<#>,<=>)和调整旋钮。原生类型创建扩展pg_vectorsearch;-- PLAIN保持向量内联。EXTERNAL(默认)对大约2 kB以上的值进行递归处理,然后需要重新排名,计划器不收取额外费用。CREATE TABLE items ( id serial PRIMARY KEY , embedding vec32( 3 ) STORAGE PLAIN ); -- 首先加载;索引大小由CREATE INDEX时的行数决定。-- 500行足够让计划器使用索引。INSERT INTO items (embedding) SELECT ARRAY[i:: real , (i % 7 ):: real , (i % 5 ):: real ]::vec32 FROM generate_series( 1 , 1000 ) i; -- 对于内积或余弦,请参见下面的操作符类。CREATE INDEX ON items USING prism (embedding vec32_l2_ops); -- 0 = 自动(~0.95召回)。提高以提高召回率,降低以提高速度。SET prism . nprobe = 40 ; SELECT * FROM items ORDER BY embedding < - > ' [3,1,2] ' LIMIT 5 ; 使用vec16代替vec32,以减半表中向量所占用的空间,同时使用匹配的vec16_*操作符类。现有pgvector表如果您已经有包含pgvector的向量或halfvec列的表,您可以直接在其上构建PRISM索引。表或查询不需要更改。vec32和vec16与pgvector的向量和halfvec是二进制兼容的,但名称不同,因此两个扩展可以并肩安装,甚至在同一架构中。-- 你已经拥有的表,包含在内以便示例独立运行。CREATE EXTENSION vector; CREATE TABLE documents ( id bigserial PRIMARY KEY , body text , embedding vector( 384 ) ); CREATE INDEX documents_embedding_hnsw ON documents USING hnsw (embedding vector_l2_ops); -- 在pgvector旁安装pg_vectorsearch,并在现有列上构建索引。该列并不会被重写或复制。CREATE EXTENSION pg_vectorsearch; CREATE INDEX documents_embedding_prism ON documents USING prism (embedding vec32_l2_ops); -- 你的查询保持原样。PRISM通常更快,因此 -- 计划者应该更喜欢它而不是HNSW索引,同时两个索引都存在。-- 通过EXPLAIN验证:EXPLAIN (COSTS OFF) SELECT id, body FROM documents ORDER BY embedding < - > ( SELECT embedding FROM documents WHERE id = 42 ) LIMIT 10 ; -- 限制-- InitPlan 1 -- -> Index Scan using documents_pkey on documents documents_1 -- Index Cond: (id

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡