vector

向量数据类型和 ivfflat / hnsw 访问方法

概览

扩展包名版本分类许可证语言
pgvector0.8.5RAGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
1800vector-
相关扩展pg_bestmatch pg_summarize pg_tiktoken pg4ml pgml pg_similarity smlar pg_search
下游依赖documentdb pgmnemo vchord vectorize vectorscale

PGDG RPM and DEB packages are aligned at pgvector 0.8.5 for PostgreSQL 14-18.

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG0.8.51817161514pgvector-
RPMPGDG0.8.51817161514pgvector_$v-
DEBPGDG0.8.51817161514postgresql-$v-pgvector-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 pgvector 扩展的 RPM / DEB 包:

pig build pkg pgvector         # 构建 RPM / DEB 包

安装

您可以直接安装 pgvector 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgvector;          # 当前活跃 PG 版本安装
pig ext install -y pgvector -v 18  # PG 18
pig ext install -y pgvector -v 17  # PG 17
pig ext install -y pgvector -v 16  # PG 16
pig ext install -y pgvector -v 15  # PG 15
pig ext install -y pgvector -v 14  # PG 14
dnf install -y pgvector_18       # PG 18
dnf install -y pgvector_17       # PG 17
dnf install -y pgvector_16       # PG 16
dnf install -y pgvector_15       # PG 15
dnf install -y pgvector_14       # PG 14
apt install -y postgresql-18-pgvector   # PG 18
apt install -y postgresql-17-pgvector   # PG 17
apt install -y postgresql-16-pgvector   # PG 16
apt install -y postgresql-15-pgvector   # PG 15
apt install -y postgresql-14-pgvector   # PG 14

创建扩展

CREATE EXTENSION vector;

用法

来源:

pgvector 在 PostgreSQL 内部提供了向量相似性搜索功能。扩展名称为 vector,而 Pigsty 将其打包为 pgvector。它支持精确搜索、使用 HNSW 和 IVFFlat 索引的近似最近邻搜索以及多种向量表示形式,包括密集型、半精度、二进制和稀疏嵌入。

版本 0.8.5 在构建小表上的 IVFFlat 索引时减少了内存使用。它保留了当前 README 中记录的 0.8.x HNSW 迭代扫描和维护改进。

创建和查询向量

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE items (
  id bigserial PRIMARY KEY,
  embedding vector(3)
);

INSERT INTO items (embedding)
VALUES ('[1,2,3]'), ('[4,5,6]');

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;

常用的距离操作符:

  • <-> 表示 L2 距离
  • <#> 表示负内积
  • <=> 表示余弦距离
  • <+> 表示 L1 距离
  • <~> 表示二进制向量的汉明距离
  • <%> 表示二进制向量的 Jaccard 距离

由于 PostgreSQL 索引扫描顺序为升序,<#> 返回的是负内积;在显示实际内积时需要乘以 -1

向量类型

CREATE TABLE embeddings (
  id bigserial PRIMARY KEY,
  dense      vector(768),
  half_dense halfvec(768),
  binary_sig bit(1024),
  sparse     sparsevec(100000)
);

vector 是标准的单精度类型。使用 halfvec 可以减少存储和内存压力,使用 bit 用于二进制签名,使用 sparsevec 用于高维稀疏向量。

可以对向量列使用聚合函数如 avg()sum()

SELECT avg(embedding) FROM items;

HNSW 索引

HNSW 提供了速度和召回率之间的强权衡,并不需要训练步骤。

CREATE INDEX items_embedding_hnsw
ON items USING hnsw (embedding vector_l2_ops);

SET hnsw.ef_search = 100;

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

选择与距离匹配的操作符类:

CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);
CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);
CREATE INDEX ON embeddings USING hnsw (half_dense halfvec_l2_ops);
CREATE INDEX ON embeddings USING hnsw (sparse sparsevec_l2_ops);
CREATE INDEX ON embeddings USING hnsw (binary_sig bit_hamming_ops);

有用的调优设置包括 hnsw.ef_searchhnsw.iterative_scanhnsw.max_scan_tupleshnsw.scan_mem_multiplier

IVFFlat 索引

IVFFlat 在索引创建前需要代表性的数据,因为它在构建时会训练聚类列表。

CREATE INDEX items_embedding_ivfflat
ON items USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);

SET ivfflat.probes = 10;

SELECT *
FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

增加 lists 以适应更大的表,并通过增加 ivfflat.probes 来提高召回率。对于过滤查询,请测试是否使用精确的 btree 过滤、部分向量索引或分区可以提供更好的计划。

混合搜索

普通的 PostgreSQL 过滤器可以与向量排序结合使用:

CREATE INDEX ON items (tenant_id);

SELECT *
FROM items
WHERE tenant_id = 42
ORDER BY embedding <=> '[0.1,0.2,0.3]'
LIMIT 20;

对于混合搜索,可以将 pgvector 与 PostgreSQL 全文搜索、三元组搜索或外部排名表达式结合起来:

SELECT id,
       ts_rank_cd(text_tsv, plainto_tsquery('database')) AS text_score,
       1 - (embedding <=> '[0.1,0.2,0.3]') AS vector_score
FROM docs
WHERE text_tsv @@ plainto_tsquery('database')
ORDER BY vector_score DESC
LIMIT 20;

维护

VACUUM items;
REINDEX INDEX CONCURRENTLY items_embedding_hnsw;
ANALYZE items;

HNSW 索引可能很大且构建成本高昂。使用 maintenance_work_mem 进行构建,监控构建通知,并在索引膨胀或召回漂移时安排 REINDEX

注意事项

  • 版本 0.8.5 是一个专注于 IVFFlat 构建内存的补丁;它不会改变 SQL 查询表面。当数据库报告较旧的 SQL 版本时,在安装新的扩展文件后运行 ALTER EXTENSION vector UPDATE
  • 使用与查询操作符匹配的操作符类。余弦索引不会加速 L2 ORDER BY 操作。
  • 近似索引以牺牲精确召回率为代价换取速度。请使用代表性数据和查询过滤器验证召回率。
  • 在加载数据后构建 IVFFlat 索引。如果数据分布发生显著变化,请重新构建索引。
  • 当使用 HNSW 并且存在大量写入和 vacuum 活动时,保持 pgvector 更新;0.8.x 系列包括重要的 HNSW 维护修复。

这里仍采用负内积操作符;版本对比基线是 0.8.4