概述
PostgreSQL 本身不擅长处理向量。装上 pgvector 插件后,它立刻就能存向量、做余弦相似度搜索。这套组合拳是很多 AI 应用的底层选择,比如本地知识库、语义搜索引擎、推荐系统。
Docker 容器跑 PG + pgvector 比系统级安装干净得多,数据持久化也不麻烦。今天用一条 docker-compose 把这事儿搞定。
准备工作
- 一台 VPS(2 核 CPU、2 GB 内存以上推荐)
- 已安装 Docker 和 Docker Compose
- 有 sudo 权限
- 磁盘 10 GB 以上
步骤
第一步:创建项目目录
mkdir -p ~/pgvector-db && cd ~/pgvector-db
第二步:写 docker-compose.yml
version: '3.8'
services:
postgres:
image: pgvector/pgvector:pg16
container_name: pgvector-db
restart: unless-stopped
environment:
POSTGRES_USER: aiuser
POSTGRES_PASSWORD: aipass2024!
POSTGRES_DB: aivector
volumes:
- pgvector_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
pgvector_data:
注意:POSTGRES_PASSWORD 改成你自己的强密码。
第三步:启动服务
docker-compose up -d
启动后检查容器状态:
docker-compose ps
输出应该显示 Up 状态,端口 0.0.0.0:5432->5432/tcp。
第四步:验证 pgvector 已安装
docker-compose exec postgres psql -U aiuser -d aivector -c "CREATE EXTENSION vector;"
如果返回 CREATE EXTENSION,说明插件加载成功。再确认一下:
docker-compose exec postgres psql -U aiuser -d aivector -c "SELECT extversion FROM pg_extension WHERE extname = 'vector';"
应该输出 0.7.4 或更高版本(取决于镜像里的 pgvector 版本)。
第五步:建一张向量表并测试
docker-compose exec postgres psql -U aiuser -d aivector <<'SQL'
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(384)
);
INSERT INTO documents (content, embedding) VALUES
('Docker 容器技术介绍', '[0.1, 0.2, 0.3, 0.4]'),
('Kubernetes 编排系统', '[0.5, 0.6, 0.7, 0.8]'),
('Python 数据处理入门', '[0.1, 0.2, 0.3, 0.5]');
SELECT id, content FROM documents ORDER BY embedding <=> '[0.15, 0.25, 0.35, 0.45]' LIMIT 3;
SQL
查询结果应该把第一条(内容最接近)排在最前面。<=> 是 pgvector 的余弦距离操作符,ORDER BY embedding <=> query_embedding 就是相似度排序。
常见问题
Q: 远程连接报"拒绝连接"?
PostgreSQL 默认只监听 localhost。容器里改配置:
docker-compose exec postgres sed -i "s/^listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/postgresql/data/postgresql.conf
docker-compose restart postgres
宿主机防火墙也要放行 5432 端口(UFW:sudo ufw allow 5432)。
Q: 启动失败,报端口被占用?
sudo lsof -i :5432
杀掉占用进程或改 docker-compose.yml 里的端口映射("5433:5432")。
Q: 数据怎么备份?
docker-compose exec -T postgres pg_dump -U aiuser aivector > backup_$(date +%Y%m%d).sql
下一步
pgvector 支持 HNSW 索引,数据量大时加上索引查询速度飞快。建索引命令:
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
装好了,下一步就是往表里灌数据了。