PostgreSQL + pgvector 搭建 AI 向量数据库:VPS 部署完整教程

概述

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);

装好了,下一步就是往表里灌数据了。

这篇文章对你有帮助吗?