共计 2073 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
传统方式编译安装 PostgreSQL 需要处理各种依赖,往往耗费数小时。特别是在 AI 应用中,向量数据库的重要性日益凸显,但手动编译 pgvector 扩展时,版本兼容性问题频频出现,让开发者头疼不已。

技术选型
源码编译虽然灵活,但维护成本高,而 Yum 安装提供了官方维护的稳定版本。PostgreSQL 15 官方仓库不仅更新及时,还提供了预编译的 contrib 模块,大幅降低了部署复杂度。
核心实现
1. 配置 PostgreSQL 15 官方 Yum 仓库
CentOS 7 和 8 的配置略有不同,以下是具体步骤:
# CentOS 7
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# CentOS 8
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
2. 安装 PostgreSQL 15 及 contrib 模块
sudo yum install -y postgresql15-server postgresql15-contrib
3. 初始化数据库
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15
4. 编译安装 pgvector 扩展
首先安装编译依赖:
sudo yum install -y gcc make postgresql15-devel
然后下载并编译 pgvector:
git clone https://github.com/pgvector/pgvector.git
cd pgvector
make PG_CONFIG=/usr/pgsql-15/bin/pg_config
sudo make PG_CONFIG=/usr/pgsql-15/bin/pg_config install
代码示例
postgresql.conf 关键参数配置
# 内存分配
shared_buffers = 4GB # 25% of total RAM
work_mem = 16MB # per-operation memory
maintenance_work_mem = 512MB # for index builds
# 向量相关
max_parallel_workers_per_gather = 4 # 并行查询
创建向量字段和索引
-- 创建扩展
CREATE EXTENSION vector;
-- 创建带向量字段的表
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(384) -- 384 维向量
);
-- 创建 HNSW 索引
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
生产建议
- 内存调优
- shared_buffers 建议设为总内存的 25%
-
work_mem 根据并发量调整,避免 OOM
-
维度限制
- pgvector 支持最高 16000 维,但实际建议控制在 1024 维以内
-
高维数据考虑使用 PCA 降维
-
常见错误
- 遇到 libstdc++ 冲突时:
sudo yum install -y libstdc++-static
验证环节
用 Python 测试向量搜索:
import psycopg2
import numpy as np
conn = psycopg2.connect("dbname=postgres user=postgres")
cur = conn.cursor()
# 插入测试数据
embedding = np.random.rand(384).tolist()
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding,))
conn.commit()
# 相似度查询
query_vec = np.random.rand(384).tolist()
cur.execute("""
SELECT id, embedding <=> %s AS distance
FROM items
ORDER BY embedding <=> %s
LIMIT 5
""", (query_vec, query_vec))
print(cur.fetchall())
思考
pgvector 与其他专用向量数据库(如 Milvus、Pinecone)相比,在易用性和 PostgreSQL 生态集成上有优势,但在超大规模向量搜索场景下可能遇到性能瓶颈。实际选择时,需要考虑:
1. 数据规模(百万级以内 pgvector 表现良好)
2. 实时性要求(pgvector 事务支持更完善)
3. 现有技术栈(已用 PostgreSQL 可优先考虑)
建议在项目初期用 pgvector 快速验证,待数据量增长后再评估是否需要迁移到专用向量数据库。
正文完
发表至: 未分类
近一天内
