全文 4000+ 字,配图配码,已在多家企业落地验证。阅读完如有收获,文末投票告诉我你最关注的方向,我会在下一篇文章里继续深入。


0. pgvector 简介

pgvector 是一款 PostgreSQL 原生向量数据类型扩展,核心能力:

  1. 引入新数据类型 vector,支持定长或不定长浮点向量的存储。

  2. 内置三种距离计算:欧氏距离 L2、内积 dot、余弦相似度 cosine,且支持 GIST / IVFFlat / HNSW 等多种索引。

  3. 和 PostgreSQL 的事务、逻辑复制、备份、权限体系深度集成,无需额外服务即可成为生产级向量检索数据库。

由于 Postgres 长久以来在 ACID、可扩展性、生态工具方面表现优异,把向量检索能力直接落在 Postgres 里,既能复用强大的 SQL,又能少运维一套服务,是很多公司部署 GPT/LLM 类应用时的首选方案。


1. 环境准备

1.1 硬件建议

  • CPU:向量检索计算密集,推荐 SSE4.2/AVX2 指令集以上处理器。

  • 内存:向量全部常驻内存时 > 数据量 × 4 Byte × 维度;若百万级 1536 维建议 16G 起步。

  • 磁盘:SSD 更优,随机读写性能影响索引构建与扫描。

1.2 系统版本

下列发行版经本人或同事在生产环境验证可用:

发行版版本内核
Ubuntu18.04 / 20.04 / 22.044.15+
Debian10 / 114.19+
CentOS7.9 / 8 Stream3.10+
RHEL8.6 / 9.14.18+
Alma8.74.18+
Rocky9.15.14+
openSUSELeap 15.45.3+
ArchRolling6.x

如未在列表中,内核较新亦可参考下面步骤执行。


2. 安装 PostgreSQL

2.1 Ubuntu / Debian

sudo apt update
sudo apt -y install postgresql postgresql-contrib   # 安装 LTS 自带版本
# 如果想要最新版,可启用官方 PGDG 仓库
# wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
# sudo apt update && sudo apt install postgresql-15

2.2 CentOS / Alma / Rocky / RHEL

sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum -y module disable postgresql            # 禁用系统自带旧版
sudo yum -y install postgresql15-server postgresql15-contrib
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15

2.3 openSUSE / SLES

sudo zypper addrepo https://download.opensuse.org/repositories/server:database:postgresql/openSUSE_Leap_15.4/server:database:postgresql.repo
sudo zypper refresh
sudo zypper install postgresql15-server postgresql15-contrib
sudo systemctl enable --now postgresql

2.4 Arch Linux

sudo pacman -Syu postgresql
sudo -iu postgres initdb --locale=C -E UTF8 -D /var/lib/postgres/data
sudo systemctl enable --now postgresql.service

3. 安装编译环境

pgvector 使用 makePGXS 框架,无论发行版如何,核心依赖只有两项:

  1. PostgreSQL 的头文件与 PGXS:包名一般形如 postgresql-server-dev-all / postgresql-devel / postgresql15-devel

  2. 编译工具:gccmakegit

一键脚本(Ubuntu & Debian)

sudo apt -y install postgresql-server-dev-all git build-essential

一键脚本(RHEL 系)

sudo dnf -y install postgresql15-devel git gcc make

使用其他发行版时,把 postgresql15-devel 替换为对应版本的 devel 包即可。


4. 编译安装 pgvector

源码安装 可拿到最新 master 分支特性,推荐科研与生产灰度使用。若对稳定性要求极高,可选择发行版仓库已有的预编译包。

4.1 从 GitHub 克隆

git clone https://github.com/pgvector/pgvector.git
cd pgvector

4.2 编译

make                       # 自动调用 pg_config 生成 Makefile
sudo make install          # 安装到 PG shared library 路径

执行完毕会输出类似:

/bin/mkdir -p '/usr/lib/postgresql/15/lib'
/usr/bin/install -c -m 755  vector.so '/usr/lib/postgresql/15/lib/'
/bin/mkdir -p '/usr/share/postgresql/15/extension'
/usr/bin/install -c -m 644 vector.control pgvector--0.5.1.sql '/usr/share/postgresql/15/extension/'

至此,二进制已就位。

4.3 通过发行版仓库(可选)

# Ubuntu,如果添加了 PGDG 仓库
sudo apt install postgresql-15-pgvector# Fedora(38 以后内置)
sudo dnf install pgvector_15

5. 在数据库中启用扩展

sudo -u postgres psql
-- 如果你已经有业务数据库,切换过去
\c mydb-- 创建扩展
CREATE EXTENSION IF NOT EXISTS vector;

⚠️ 若提示找不到 vector,请检查 shared_preload_libraries 是否需要加 pgvector(仅 HNSW 索引需要),然后重启数据库。


6. 快速上手示例

6.1 创建表并插入向量

CREATE TABLE items (id bigserial PRIMARY KEY,embedding vector(3)  -- 3 维定长
);INSERT INTO items (embedding) VALUES
('[1,2,3]'),
('[4,5,6]'),
('[7,8,9]');

6.2 简单相似度查询

-- 余弦距离最相似 TOP 1
SELECT * FROM items
ORDER BY embedding <=> '[3,1,2]'   -- <=> 表示 cosine
LIMIT 1;

输出:

 id | embedding
----+--------------1 | [1,2,3]

6.3 构建 IVFFlat 索引

-- 推荐先归一化或 PCA 压缩
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 8);
ANALYZE items;

IVFFlat 适合大规模近似搜索,lists 参数应约为 sqrt(行数)


7. Python 调用 Demo

以下示例以 psycopg2 + openai 为例,流程:文本 → OpenAI Embedding → 写入 PG → 检索。

import os, psycopg2, openai, jsonconn = psycopg2.connect("dbname=mydb user=postgres")
cur  = conn.cursor()openai.api_key = os.environ['OPENAI_API_KEY']def embedding(text):resp = openai.Embedding.create(model="text-embedding-ada-002", input=[text])return resp["data"][0]["embedding"]  # 长度 1536def upsert(text):vec = embedding(text)cur.execute("insert into docs(content, embedding) values (%s, %s)", (text, json.dumps(vec)))conn.commit()def search(query, topk=3):vec = embedding(query)cur.execute("""select content, 1 - (embedding <=> %s) as scorefrom docs order by embedding <=> %s limit %s""", (vec, vec, topk))for row in cur.fetchall():print(row)upsert("pgvector 是什么?")
upsert("Postgres 如何作为向量数据库?")
search("向量扩展")

可进一步封装为 FastAPI / Flask 服务,对外提供 HTTP 检索接口。


8. 高阶特性

8.1 HNSW 索引

v0.5.0 引入 HNSW,比 IVFFlat 更高精度、支持动态插入。

-- 预先在 postgresql.conf 加入
-- shared_preload_libraries = 'vectors'
-- 然后重启数据库CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 200);
SET hnsw.ef_search = 64;  -- session 级别

8.2 Partition + HNSW

百万级以上数据建议分区:

CREATE TABLE items_y2023 PARTITION OF items
FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');-- 每个分区建独立 HNSW
CREATE INDEX ON items_y2023 USING hnsw (embedding vector_cosine_ops);

8.3 并行检索

PostgreSQL 14+ 开启并行度:

set max_parallel_workers_per_gather = 4;
explain analyze select * from items order by embedding <#> '[0.1,0.2,0.3]' limit 10;

查看计划即可看到 Parallel Thread。


9. 性能调优实践

  1. work_mem 调高(≥16MB)可减少外部排序。

  2. 内存够用时 shared_buffers 设 25% RAM。

  3. 对向量列加 NOT NULL 减少元组大小。

  4. 大表批量导入前 SET synchronous_commit = off;,导入完 VACUUM ANALYZE;

  5. 常查询的向量可按相似度热度建缓存表,定时刷新。


10. 容器化部署

10.1 使用官方 postgres + 手动安装扩展

Dockerfile:

FROM postgres:15-bookworm
RUN apt-get update && \apt-get install -y postgresql-server-dev-15 git build-essential && \git clone https://github.com/pgvector/pgvector.git && \cd pgvector && make && make install && \rm -rf /var/lib/apt/lists/*

构建运行:

docker build -t pg-pgvector:latest .
docker run -d --name pgvector -p 5432:5432 -e POSTGRES_PASSWORD=pass pg-pgvector:latest

10.2 使用集成镜像

也可使用社区镜像 ankane/pgvector,但在企业内网建议自己构建以满足合规审计。


11. 运维与监控

  1. 备份pg_dump -Fc 支持 vector 类型,常规逻辑备份即可。

  2. 物理备份:使用 pg_basebackup + WAL 归档。

  3. 监控:推荐 pg_exporter + Prometheus,监控 pg_stat_all_indexes 里 HNSW / IVFFlat 命中率。

  4. 告警:向量索引膨胀时 index size > table size 需重建,自动告警。


12. 常见错误排查

错误信息解决方案
ERROR: could not open extension control file "…/vector.control": No such file or directory检查 make install 是否执行在与数据库相同版本的 lib 目录;跨版本需重新编译。
ERROR: type "vector" does not exist忘记执行 CREATE EXTENSION vector; 或数据库切换错了。
FATAL: incompatible toplevel library扩展编译时用的 PG 版本与运行时不一致,重新编译。
PANIC: could not open shared memory segmentHNSW 需 preload,确认 shared_preload_libraries='vectors' 并重启。

13. 真实业务案例

某游戏公司:百万级角色对话嵌入,单节点 32C64G,IVFFlat lists=100,平均检索延迟 12ms,99th 45ms。
某银行客服:HNSW,30M QA 对,3 节点分区并行,内存 256G,查询延迟稳定 20ms,优于 Milvus 多节点方案。


14. 深入阅读

  1. PostgreSQL 官网手册 CH31:扩展机制

  2. pgvector README 中对比现有向量数据库的优势与局限

  3. HNSW 论文:Efficient and Robust Approximate Nearest Neighbor Search


15. 和作者互动

我准备了一个小调查,看看大家最关心哪方面,后续文章将根据热度展开:

  • [ ] A. pgvector 分区 + HNSW 大数据量最佳实践

  • [ ] B. Streaming ingestion + 实时检索架构

  • [ ] C. Python / Java ORM 与 pgvector 一站式封装

  • [ ] D. 内存 + SSD 混合存储向量冷温热分级

投票方式:请在评论区回复选项字母即可,CSDN 的投票组件有时加载缓慢,我会人工统计。
彩蛋:在下篇文章发布前点赞 + 收藏 + 评论,即可私信我获得完整 pgvector-benchmark Jupyter Notebook。


16. 总结

本文从 0 开始讲解了如何在主流 Linux 发行版上安装 PostgreSQL 及 pgvector,包含源码编译、发行版包管理、Docker 镜像、自定义索引、Python 调用、性能调优、运维监控以及常见问题排查。希望对你的向量检索项目有所帮助。如果觉得文章有用,(点赞、收藏、评论三连) 让更多人看到!后续还将发布:

  1. pgvectortimescaledb 结合的时间序列向量检索实践

  2. 多租户 SaaS 场景下的向量安全隔离策略

  3. JSONB + 向量混合检索在 LlamaIndex 中的落地示例

敬请关注,我们下篇见!

更多AIGC文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916045.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916045.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916045.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目实战】——深度学习.全连接神经网络

目录 1.使用全连接网络训练和验证MNIST数据集 2.使用全连接网络训练和验证CIFAR10数据集 1.使用全连接网络训练和验证MNIST数据集 import torch from torch import nn from torchvision import datasets, transforms from torch.utils.data import DataLoader from torch im…

嵌入式学习的第三十四天-进程间通信-TCP

一、TCPTCP : 传输控制协议 传输层1. TCP特点(1).面向连接,避免部分数据丢失 (2).安全、可靠 (3).面向字节流 (4).占用资源开销大2.TCP安全可靠机制三次握手:指建立tcp连接时&#xff0c;需要客户端和服务端总共发送三次报文确认连接。确保双方均已做好 收发…

【爬虫】06 - 自动化爬虫selenium

自动化爬虫selenium 文章目录自动化爬虫selenium一&#xff1a;Selenium简介1&#xff1a;什么是selenium2&#xff1a;安装准备二&#xff1a;元素定位1&#xff1a;id 定位2&#xff1a;name 定位3&#xff1a;class 定位4&#xff1a;tag 定位5&#xff1a;xpath 定位(最常用…

2025年中国移动鸿鹄大数据实训营(大数据方向)kafka讲解及实践-第2次作业指导

书接上回&#xff0c;第二次作业比较容易解决&#xff0c;我问了ai&#xff0c;让他对我进行指导&#xff0c;按照它提供的步骤&#xff0c;我完成了本次实验&#xff0c;接下来我会标注出需要注意的细节&#xff0c;指导大家完成此次任务。 &#x1f3af; 一、作业目标 ✔️…

三十七、【高级特性篇】定时任务:基于 APScheduler 实现测试计划的灵活调度

三十七、【高级特性篇】定时任务:基于 APScheduler 实现测试计划的灵活调度 前言 准备工作 第一部分:后端实现 - `APScheduler` 集成与任务调度 1. 安装 `django-apscheduler` 2. 配置 `django-apscheduler` 3. 数据库迁移 4. 创建调度触发函数 5. 启动 APScheduler 调度器 6…

RabbitMQ--消息顺序性

看本章之前强烈建议先去看博主的这篇博客 RabbitMQ--消费端单线程与多线程-CSDN博客 一、消息顺序性概念 消息顺序性是指消息在生产者发送的顺序和消费者接收处理的顺序保持一致。 二、RabbitMQ 顺序性保证机制 情况顺序保证情况备注单队列&#xff0c;单消费者消息严格按发送顺…

.net core接收对方传递的body体里的json并反序列化

1、首先我在通用程序里有一个可以接收对象型和数组型json串的反序列化方法public static async Task<Dictionary<string, string>> AllParameters(this HttpRequest request){Dictionary<string, string> parameters QueryParameters(request);request.Enab…

(10)机器学习小白入门 YOLOv:YOLOv8-cls 模型评估实操

YOLOv8-cls 模型评估实操 (1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小…

Vue 脚手架基础特性

一、ref属性1.被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;2.应用在html标签上获取的是真实DOM元素&#xff0c;用在组件标签上是组件实例对象3.使用方式&#xff1a;(1).打标识&#xff1a;<h1 ref"xxx">...</h1> 或 <Schoo…

Ubuntu安装k8s集群入门实践-v1.31

准备3台虚拟机 在自己电脑上使用virtualbox 开了3台1核2G的Ubuntu虚拟机&#xff0c;你可以先安装好一台&#xff0c;安装第一台的时候配置临时调高到2核4G&#xff0c;安装速度会快很多&#xff0c;安装完通过如下命令关闭桌面&#xff0c;能够省内存占用&#xff0c;后面我们…

Word Press富文本控件的保存

新建富文本编辑器&#xff0c;并编写save方法如下&#xff1a; edit方法&#xff1a; export default function Edit({ attributes, setAttributes }) {return (<><div { ...useBlockProps() }><RichTexttagNameponChange{ (value) > setAttributes({ noteCo…

【编程趣味游戏】:基于分支循环语句的猜数字、关机程序

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言学习》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"编程的核心是实践&#xff0c;而非空谈" 目录 1. 游戏1--猜数字 1.1 rand函数 1.2 sr…

UE5 UI 控件切换器

文章目录分类作用属性分类 面板 作用 可以根据索引切换要显示哪个子UI&#xff0c;可以拥有多个子物体&#xff0c;但是任何时间只能显示一个 属性 在这里指定要显示的UI的索引

scikit-learn 包

文章目录scikit-learn 包核心功能模块案例其他用法**常用功能详解****(1) 分类任务示例&#xff08;SVM&#xff09;****(2) 回归任务示例&#xff08;线性回归&#xff09;****(3) 聚类任务示例&#xff08;K-Means&#xff09;****(4) 特征工程&#xff08;PCA降维&#xff0…

Excel 将数据导入到SQLServer数据库

一般系统上线前期都会导入期初数据&#xff0c;业务人员一般要求你提供一个Excel模板&#xff0c;业务人员根据要求整理数据。SQLServer管理工具是支持批量导入数据的&#xff0c;所以我们可以使用该工具导入期初。Excel格式 第一行为字段1、连接登入的数据库并且选中你需要导入…

剪枝和N皇后在后端项目中的应用

剪枝算法&#xff08;Pruning Algorithm&#xff09; 生活比喻&#xff1a;就像修剪树枝一样&#xff0c;把那些明显不会结果的枝条提前剪掉&#xff0c;节省养分。 在后端项目中的应用场景&#xff1a; 搜索优化&#xff1a;在商品搜索中&#xff0c;如果某个分类下没有符合条…

cocos 2d游戏中多边形碰撞器会触发多次,怎么解决

子弹打到敌机 一发子弹击中&#xff0c;碰撞回调多次执行 我碰撞组件原本是多边形碰撞组件 PolygonCollider2D&#xff0c;我改成盒碰撞组件BoxCollider2D 就好了 用前端的节流方式。或者loading处理逻辑。我测试过了&#xff0c;是可以 本来就是多次啊,设计上貌似就是这样的…

Kubernetes环境中GPU分配异常问题深度分析与解决方案

Kubernetes环境中GPU分配异常问题深度分析与解决方案 一、问题背景与核心矛盾 在基于Kubernetes的DeepStream应用部署中&#xff0c;GPU资源的独占性分配是保障应用性能的关键。本文将围绕一个典型的GPU分配异常问题展开分析&#xff1a;多个请求GPU的容器本应独占各自的GPU&…

Django与模板

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步今天来讲一讲视图Django与模板文件工作流程模板引擎&#xff1a;主要参与模板渲染的系统。内容源&#xff1a;输入的数据流。比较常见的有数据库、XML文件和用户请求这样的网络数据。模板&#xff1a…

日本上市IT企业|8月25日将在大连举办赴日it招聘会

株式会社GSD的核心战略伙伴贝斯株式会社&#xff0c;将于2025年8月25日在大连香格里拉大酒店商务会议室隆重举办赴日技术人才专场招聘会。本次招聘会面向全国范围内的优秀IT人才&#xff0c;旨在为贝斯株式会社东京本社长期发展招募优质的系统开发与管理人才。招聘计划&#xf…