x-lin7
A
分屏 专注

pgvector 入门

8 分钟阅读 · 更新于 2026-05-29T04:34:26.234808Z · #pgvector #postgres #rag

概览

pgvector 是 PostgreSQL 的向量扩展,把向量存储和相似度检索内置到关系库里。对于「数据已经在 Postgres」的团队,它消除了再维护一个专用向量库的运维成本。

不是所有人都需要 Pinecone / Weaviate / Milvus。如果你的向量量在千万级以内、QPS 在三位数以内、且数据已经在 Postgres —— pgvector 极可能是更优解。

安装

CREATE EXTENSION IF NOT EXISTS vector;

大部分托管 PG(Supabase、Neon、RDS 16+)已经预装,直接 CREATE EXTENSION 即可。

建表

CREATE TABLE items (
  id bigserial PRIMARY KEY,
  content text,
  embedding vector(1536)
);

维度要和你用的嵌入模型一致;OpenAI text-embedding-3-small 是 1536。

写入

INSERT INTO items (content, embedding) VALUES
  ('...', '[0.1, 0.2, ...]');

索引选型

ivfflat

经典的倒排聚类索引。建索引快、查询稍慢,需要先 ANALYZE 提供数据分布。

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

lists 经验值 ≈ √行数。查询时 SET ivfflat.probes = 10 控制召回精度 / 速度 trade-off。

hnsw

pgvector 0.5+ 支持。图索引,读快写慢,内存占用大。

CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

查询时 SET hnsw.ef_search = 40 调速度精度。

选哪个

场景推荐
数据量 < 100 万 + 写多ivfflat
数据量 > 100 万 + 读多hnsw
内存紧张ivfflat
召回延迟敏感hnsw

查询

SELECT content, 1 - (embedding <=> $1) AS similarity
FROM items
ORDER BY embedding <=> $1
LIMIT 10;

<=> 是余弦距离(值越小越近)。<-> 欧氏距离、<#> 负内积也可用。

性能

实测 50 万向量 + ivfflat (lists=200, probes=10) 在 16C/32G 机器上 ~ P95 23ms / 1.2k QPS。比专用向量库性能略低,但数据一致性 / 事务 / join 能力是巨大加分项。

不适合

  • 亿级向量(专用库更稳)
  • 强实时(毫秒级)大规模流式写入
  • 多租户隔离要求强(pg 分区是答案,但运维复杂)

参考

1638 2 3 3
⌘P 跳转 · ⌘K 搜索 · ⌘. 切栏 · ⌘E 编辑