文章目录
PostgreSQL 是一个功能强大的开源关系型数据库管理系统,支持 SQL 标准并提供了高级功能如事务处理、复杂查询和多种数据类型扩展。
配置 pgvector 扩展后,PostgreSQL 能够高效存储和查询向量数据,支持相似性搜索(如余弦相似度、欧氏距离等),使数据库可以直接处理 AI 模型生成的嵌入向量(如文本、图像嵌入),从而简化推荐系统、语义搜索和 RAG(检索增强生成)等 AI 应用的开发,无需依赖外部向量数据库。
- PostgreSQL 官网:https://www.postgresql.org/
- pgvector Github项目地址:https://github.com/pgvector/pgvector
在本篇博客中,我们介绍两种安装 PostgreSQL数据库并配置 pgvector的方式。
方式 1:docker-compose 安装 PostgreSQL + 容器内安装 pgvector
1.1 基于 docker-compose 安装 PostgreSQL 数据库
参考博客:
下面介绍如何以 docker compose
形式启动PostgreSQL服务。
- 安装相关依赖包,推荐使用系统自带的 docker compose:
sudo apt-get update
sudo apt-get install docker-compose-plugin # 新版本
注意: 这里,如果安装的是新版本的 docker-compose-plugin
,后续命令为 docker compose
(没有中间的横线-
)
注意事项:
- 不要使用 pip 安装 docker compose,特别是当您使用 Anaconda 环境时。
- 使用系统包管理器(apt/yum)安装 docker compose
这里,笔者之前在 Anaconda 的虚拟环境中 使用
pip install docker-compose
就出现了报错,所以大家最好 使用 系统包管理器(apt/yum)来安装 docker-compose。
- 编写 docker-compose 所需的配置文件。
这里我们的配置文件为docker-compose.yaml
,文件内容为:
services:
postgres:
image: postgres:15 # 指定具体版本
container_name: postgres_db
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
TZ: Asia/Shanghai # 设置时区
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
healthcheck: # 健康检查
test: ["CMD", "pg_isready", "-U", "nange"]
interval: 10s
timeout: 5s
retries: 5
command: ["postgres", "-c", "max_connections=200"] # 自定义配置
volumes:
pgdata:
这里,我们配置的容器名称为 postgres_db
。
- 运行下面命令启动PostgreSQL数据库服务:
sudo docker compose up -d
这个命令会:
- 以后台模式 (-d) 启动所有定义的服务
- 如果本地有 postgres:15 镜像,则直接加载使用。若没有 postgres:15 镜像,会自动从镜像仓库拉取。
- 创建名为 pgdata 的持久化卷
- 启动容器并应用所有配置
运行成功的话会出现如下界面:
- 检查容器是否正常运行:
docker compose ps
或查看所有容器状态:
docker ps
- 连接数据库
您可以通过以下方式连接数据库:
方式一:在容器内使用 psql
docker compose exec postgres_db psql -U postgres
方式二:从外部客户端连接
使用任何 PostgreSQL 客户端工具连接,如Navicat可视化工具。
- 停止服务(当需要时)
docker compose down
如果要同时删除数据卷(慎用,会删除所有数据):
docker compose down --volumes
1.2 容器内配置 pgvector
在容器中按照如下步骤进行操作。
- 进入容器
docker exec -it postgres_db bash
其中,postgres_db
为容器名称。
- 容器内安装依赖
apt update
apt install -y git build-essential postgresql-server-dev-15
【报错记录】:这里,笔者运行时出现报错:
W: Failed to fetch http://deb.debian.org/debian/dists/bookworm/InRelease Could not connect to debian.map.fastlydns.net:80 (151.101.90.132)
W: Failed to fetch http://apt.postgresql.org/pub/repos/apt/dists/bookworm-pgdg/InRelease Could not connect to apt.postgresql.org:80 (151.101.91.52), connection timed out
需要检查下服务器是否开通了 http://deb.debian.org
和 http://apt.postgresql.org
的访问权限。如果没有权限,可以申请开通,或者使用国内清华或阿里云的镜像源。
- 容器内编译并安装 pgvector
这里主要参考 pgvector 官网:https://github.com/pgvector/pgvector
cd /tmp
git clone https://github.com/pgvector/pgvector.git
cd pgvector
make
make install
【容器环境无法连接github 网络的解决方案】:这里,我们的容器环境无法连接 github 网络,所以我们先本地PC环境手动下载 github 上的 pgvector 文件,再手动上传至服务器环境中,再通过 docker cp
命令将服务器上的文件拷贝至容器内。
注意:如果需要数据持久化,一定要使用Volume卷挂载的方式!!!
- docker cp 不会持久化数据,如果容器被删除(docker rm),复制的文件会丢失。
- 如果需要持久化存储,应该使用 Docker Volume(卷) 或 Bind Mount(绑定挂载):
# 命令语法
docker cp /源文件夹 容器名或ID:/容器内/目标路径/
# 这里,我们使用的命令为:
docker cp ./pgvector 010f4d6fa849:/tmp
其中 010f4d6fa849 为容器ID。
拷贝成功后,再进入容器内的 /tmp/pgvector 目录, 依次运行:
docker exec -it postgres_db
cd /tmp/pgvector
make
make install
出现如下界面:
- 检查扩展文件是否安装成功
ls -l /usr/share/postgresql/15/extension/vector*
出现如下界面说明扩展文件安装成功:
- 启用pgvector扩展
首先,在容器内部,使用 psql 登录 PostgreSQL 数据库:
psql -U postgres -d postgres
- psql:PostgreSQL 的交互式终端程序
- -U postgres:指定使用 postgres 用户身份连接
- -d postgres:指定连接到名为 postgres 的默认数据库
连接成功后出现如下界面:
然后,使用PostgreSQL 数据库中的 SQL 命令,安装名为 vector 的扩展(extension):
# -- 在psql中执行
CREATE EXTENSION vector;
# 或
CREATE EXTENSION IF NOT EXISTS vector; # 仅在扩展未安装时执行
出现如下界面说明创建成功:
关于vector 扩展:
- 这是 PostgreSQL 的一个扩展,用于支持向量(vector)数据类型和向量相似性搜索;
- 常用于机器学习、AI应用,特别是需要存储和查询嵌入向量(embeddings)的场景;
- 提供向量运算、相似度计算(如余弦相似度、欧氏距离等)功能。
- 验证安装是否成功
基于 PostgreSQL 的查询语句,检查数据库中是否已安装名为 vector 的扩展(extension):
SELECT * FROM pg_extension WHERE extname = 'vector';
出现如下界面:
方式 2:docker-compose + Dockerfile 直接配置PostgreSQL数据库及 pgvector
参考博客:
- 创建 Dockerfile
# 使用 PostgreSQL 15 基础镜像
FROM postgres:15
# 安装 pgvector
RUN apt-get update && \
apt-get install -y postgresql-16-pgvector && \
rm -rf /var/lib/apt/lists/*
# 设置启动命令
CMD ["postgres"]
注意:在上面的 Dockerfile 中使用 apt-get install -y postgresql-16-pgvector
命令安装依赖包,可能会存在找不到相关安装包的问题,pgvector官方推荐的是直接基于 github 项目源码进行编译的方式安装,具体可以参考本博客的 方法1的容器内安装 pgvector
的步骤。
- 创建 docker-compose.yaml
services:
postgres:
build:
context: .
dockerfile: Dockerfile
container_name: postgres_db
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
TZ: Asia/Shanghai # 设置时区
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
healthcheck: # 健康检查
test: ["CMD", "pg_isready", "-U", "nange"]
interval: 10s
timeout: 5s
retries: 5
command: ["postgres", "-c", "max_connections=200"] # 自定义配置
volumes:
pgdata:
- 构建Dockerfile
docker compose build
- 运行容器
docker compose up -d
- 进入 postgres_db 容器
docker exec -it postgres_db bash
psql -U postgres -d postgres_db
- 判断vector工具是否安装成功
CREATE EXTENSION IF NOT EXISTS vector;