pgvector
PostgreSQL 向量搜索扩展,在数据库内完成最近邻查询
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
PostgreSQL 向量搜索扩展,在数据库内完成最近邻查询
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
pgvector 是一款开源的 PostgreSQL 扩展,让你能像存储普通数据一样存储向量,在数据库内部完成最近邻搜索,无需引入独立的向量数据库。
在 AI 应用中,文本、图片、音频等非结构化数据需要被转换为向量(高维数值数组)才能被计算机处理。一个 1536 维的向量,本质上代表了一个语义空间中的坐标点——语义相近的内容,向量距离也越近。
传统的向量数据库(如 Milvus、Pinecone)功能强大,但引入了新的技术栈和学习成本。而 pgvector 的思路很简单:与其在两个系统之间同步数据,为什么不直接在 Postgres 里做向量运算? 毕竟 Postgres 本身支持 JSON、数组、全文搜索,已经是个"瑞士军刀"了。
pgvector 的作者 Andy Pavlou 和 Tomasz Ludyga 从 2021 年开始维护这个项目,至今已获得超过 21,000 颗 GitHub Stars,被 Supabase、Supermetrics、ADEKA 等知名公司实际部署于生产环境。
pgvector 支持多种向量存储格式,开发者可以根据精度和性能需求灵活选择:
这种多格式支持让 pgvector 可以在从原型验证到生产规模的各个阶段发挥作用——不需要一开始就搭一套复杂的基础设施。
向量相似度的计算方式直接影响搜索结果,pgvector 支持 6 种距离度量:
| 度量方式 | 说明 | 适用场景 |
|---|---|---|
| L2 距离 | 欧氏距离,最直观的空间距离 | 图像/音频相似度 |
| 内积 (Inner Product) | 向量点积 | 文本相似度、推荐系统 |
| 余弦距离 | 方向相似度,与长度无关 | 文本人群聚类 |
| L1 距离 | 曼哈顿距离 | 地理数据、路径规划 |
| Hamming 距离 | 二进制位差异统计 | DNA 序列比对 |
| Jaccard 距离 | 集合交集比例 | 推荐系统、协同过滤 |
pgvector 在 CREATE INDEX 时提供两种索引策略:
IVFFlat(倒排文件索引):将向量空间预先划分成多个聚类,查询时只搜索最近的几个聚类,牺牲少量精度换取速度提升。适合数据量中等(百万级)的场景。
HNSW(分层可导航小世界图):当前最流行的 ANN 算法之一,构建多层图结构实现高速近似搜索。在 100 万向量数据集中,HNSW 可以在毫秒级返回 Top-1 精准度超过 95% 的结果。内存占用较高,但性能最优。
重要提示:生产环境中必须选择近似搜索(HNSW/IVFFlat),精确搜索(seq scan)仅适合小数据集测试。
pgvector 的核心代码完全使用 C 语言编写,紧贴 Postgres 扩展机制(PGXS),对性能有极致追求:
所有索引操作都是 Postgres 的 AM(Access Method)接口实现,与 Postgres 的 MVCC、并发控制、WAL 日志深度集成。这意味着:崩溃恢复、事务隔离、备份复制——所有 Postgres 原生能力都天然继承,无需额外配置。
docker run --name pgvector -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d pgvector/pgvector:0.8.2
一行命令,Postgres + pgvector 全部搞定。对于想快速体验的开发者,这是最简单的方式。
cd /tmp && git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git
cd pgvector && make && sudo make install
在已有 Postgres 13+ 的机器上,编译安装只需几分钟。需要确保安装了 build-essential 和 postgresql-server-dev-*。
安装后只需一条 SQL 即可启用:
CREATE EXTENSION IF NOT EXISTS vector;
import psycopg2
conn = psycopg2.connect("dbname=postgres user=postgres password=secret host=localhost")
cur = conn.cursor()
cur.execute("CREATE EXTENSION IF NOT EXISTS vector")
cur.execute("CREATE TABLE items (id serial, embedding vector(1536))")
cur.execute("INSERT INTO items (embedding) VALUES ('[0.1, 0.2, ...]')")
cur.execute("""
SELECT * FROM items
ORDER BY embedding <=> '[0.3, 0.4, ...]'
LIMIT 5
""")
可以看到,向量查询的语法与普通 SQL 完全一致,学习成本极低。
pgvector 并非万能,以下场景需要谨慎评估:
超大规模数据(亿级):pgvector 的 HNSW 在内存中构建全部索引,超过亿条向量时内存压力显著,此时专用向量数据库(Qdrant、Weaviate)更有优势。
实时更新频繁:HNSW 索引不支持增量更新,每次插入新向量都需要重新调整索引结构。高频写入场景下性能会逐渐下降。
不支持分布式:pgvector 是单节点扩展,不支持水平分片。如果需要分布式向量搜索,需要在上层做数据分片路由。
过滤与向量搜索的组合:带有复杂 WHERE 条件的向量查询,目前 pgvector 的过滤效率不如专用系统。
pgvector 的出现,本质上代表了向量数据库领域的"Postgres 化"趋势——即用成熟的 SQL 生态来承载 AI 时代的新型数据形态。
2023-2024 年,随着 LLM 和 RAG(检索增强生成)热潮,向量搜索需求爆发式增长。pgvector 的 GitHub Stars 从 2023 年初的 3,000 颗增长到 2025 年的 21,000+ 颗,背后是整个行业对"一个数据库搞定一切"理念的认同。
Supabase、Neon、TimescaleDB 等云数据库厂商纷纷将 pgvector 作为标配功能集成,进一步扩大了其影响力。
| 指标 | 数值 |
|---|---|
| 当前版本 | 0.8.2 |
| 支持 Postgres 版本 | 13+ |
| 支持向量维度 | 最高 16,000 维 |
| 索引算法 | IVFFlat、HNSW |
| 距离度量 | L2、内积、余弦、L1、Hamming、Jaccard |
| 开发语言 | C |
| Stars | 21,469 |
| License | PostgreSQL License |