docker安装部署PostgreSQL带有pgvector扩展向量数据(高维数组)

1.拉取镜像

bash 复制代码
# 或者已经编译了x86的postgis、pgvector的18.1
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.1
# arrch64架构
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_postgres-with-gis:18.1

2.创建一个 postgres 容器并启动

bash 复制代码
docker run -d \
  --name postgres-gis \
  -e POSTGRES_PASSWORD='Yo5WYypu0mCCheOU' \
  -p 5432:5432 \
  -v /data/postgres:/var/lib/postgresql \
  registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.1

3.执行PostGIS

bash 复制代码
create extension postgis;

create extension postgis_topology;

create extension fuzzystrmatch;

create extension postgis_tiger_geocoder;

create extension address_standardizer;

4.执行pgvector扩展向量

bash 复制代码
CREATE EXTENSION IF NOT EXISTS vector;

5.验证 PostGIS 安装:

bash 复制代码
# 在 PostgreSQL 命令行中执行
SELECT PostGIS_Version();
SELECT PostGIS_Full_Version();

6.验证 pgvector安装:

bash 复制代码
SELECT * FROM pg_extension WHERE extname = 'vector';

pgvector 扩展:向量数据库功能

什么是 pgvector?

pgvector 是一个 PostgreSQL 扩展,它让 PostgreSQL 能够存储、索引和查询向量数据(高维数组),主要用于:

核心功能

存储向量数据 - 存储多维浮点数数组

向量相似性搜索 - 查找最相似的向量

AI/ML 集成 - 与机器学习模型配合使用

主要用途

  1. AI 嵌入向量存储
bash 复制代码
-- 存储 OpenAI、BERT 等模型的文本嵌入
CREATE TABLE documents (
    id BIGSERIAL PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536),  -- OpenAI 的维度
    created_at TIMESTAMP
);
-- 插入向量数据
INSERT INTO documents (content, embedding) VALUES 
('这是一个文档', '[0.1, 0.2, 0.3, ...]');
  1. 相似性搜索
bash 复制代码
-- 查找最相似的文档
SELECT 
    id,
    content,
    embedding <=> '[0.1, 0.2, 0.3]' AS distance  -- 余弦距离
FROM documents
ORDER BY distance
LIMIT 10;
  1. 推荐系统
bash 复制代码
-- 基于向量相似性的产品推荐
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT,
    features VECTOR(128),  -- 产品特征向量
    category TEXT
);

-- 查找相似产品
SELECT 
    p2.name,
    p1.features <=> p2.features AS similarity
FROM products p1
CROSS JOIN products p2
WHERE p1.id = 123 AND p2.id != 123
ORDER BY similarity
LIMIT 5;
  1. 支持的距离度量
    pgvector 支持多种距离计算:
bash 复制代码
-- 1. 欧几里得距离(L2距离)
SELECT embedding <-> '[0.1, 0.2, 0.3]' FROM items;

-- 2. 余弦距离(1 - 余弦相似度)
SELECT embedding <=> '[0.1, 0.2, 0.3]' FROM items;

-- 3. 内积距离
SELECT embedding <#> '[0.1, 0.2, 0.3]' FROM items;
  1. 索引类型
    IVFFlat 索引(推荐)
bash 复制代码
-- 创建 IVFFlat 索引(适合大规模数据)
CREATE INDEX ON items 
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);  -- 聚类数量

-- 用于不同距离度量
USING ivfflat (embedding vector_l2_ops)      -- 欧几里得距离
USING ivfflat (embedding vector_cosine_ops)  -- 余弦距离
USING ivfflat (embedding vector_ip_ops)      -- 内积距离
  1. HNSW 索引(更精确,稍慢)
bash 复制代码
-- 创建 HNSW 索引(精度更高)
CREATE INDEX ON items 
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

实际应用场景

场景 1:语义搜索

python 复制代码
# Python 示例:结合 OpenAI 嵌入
import openai
import psycopg2
from pgvector.psycopg2 import register_vector

# 生成文本嵌入
response = openai.Embedding.create(
    model="text-embedding-ada-002",
    input="如何学习 PostgreSQL"
)
embedding = response['data'][0]['embedding']

# 存储到 PostgreSQL
conn = psycopg2.connect("dbname=test user=postgres")
register_vector(conn)

cur = conn.cursor()
cur.execute(
    "INSERT INTO documents (content, embedding) VALUES (%s, %s)",
    ("如何学习 PostgreSQL", embedding)
)

# 语义搜索
search_query = "PostgreSQL 教程"
search_embedding = get_embedding(search_query)  # 获取查询的嵌入

cur.execute("""
    SELECT content, embedding <=> %s AS distance
    FROM documents
    ORDER BY distance
    LIMIT 5
""", (search_embedding,))
场景 2:图像相似性搜索
sql
-- 存储图像特征向量
CREATE TABLE images (
    id SERIAL PRIMARY KEY,
    image_path TEXT,
    features VECTOR(512),  -- ResNet/VGG 等模型提取的特征
    tags TEXT[]
);

-- 查找相似图像
SELECT 
    image_path,
    tags,
    features <=> (SELECT features FROM images WHERE id = 123) AS similarity
FROM images
WHERE id != 123
ORDER BY similarity
LIMIT 10;

场景 3:用户画像匹配

bash 复制代码
-- 基于用户行为向量的推荐
CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    behavior_vector VECTOR(256),  -- 用户行为向量
    preferences JSONB
);

-- 查找相似用户(用于协同过滤)
SELECT 
    u2.user_id,
    u1.behavior_vector <=> u2.behavior_vector AS similarity
FROM user_profiles u1
JOIN user_profiles u2 ON u1.user_id != u2.user_id
WHERE u1.user_id = 1001
ORDER BY similarity
LIMIT 10;

性能优化技巧

bash 复制代码
-- 1. 设置合适的索引参数
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 1000);  -- 对于大数据集增加 lists 值

-- 2. 使用分区表
CREATE TABLE embeddings_partitioned (
    id BIGINT,
    embedding VECTOR(1536),
    created_date DATE
) PARTITION BY RANGE (created_date);

-- 3. 调整搜索参数
SET ivfflat.probes = 10;  -- 增加以提高准确性(默认 1)
SET hnsw.ef_search = 100; -- HNSW 搜索参数
与其他工具的集成
与 LangChain 集成 - 用于 AI 应用
与 OpenAI API 集成 - 存储和查询嵌入
与 Hugging Face 集成 - 使用开源模型
与 MLflow 集成 - 模型特征存储

优势

无需额外基础设施 - 直接在 PostgreSQL 中使用

ACID 保证 - 完整的数据库事务支持

SQL 接口 - 使用熟悉的 SQL 语法

与其他数据一起查询 - 向量 + 结构化数据联合查询

开源免费 - MIT 许可证

简单总结

pgvector = PostgreSQL + 向量数据库能力

把 PostgreSQL 变成了一个既能处理传统关系型数据,又能处理 AI 向量数据的多模数据库。特别适合需要同时处理结构化数据和 AI 嵌入的应用场景。

相关推荐
IT_Octopus2 小时前
Docker 镜像打的包有1.3个G 多阶段构建缩小镜像体积(不算成功)
运维·docker·容器
Kendra9193 小时前
K8s集群组件启动不成功排查
云原生·容器·kubernetes
努力搬砖的咸鱼3 小时前
用 Minikube 或 Kind 在本地跑起 Kubernetes
微服务·云原生·容器·架构·kubernetes·kind
噎住佩奇3 小时前
单节点K8s集群中安装StorageClass(SC)
云原生·容器·kubernetes
陈陈CHENCHEN3 小时前
【Kubernetes】镜像拉取密钥 - Docker Registry
docker·kubernetes
Bits to Atoms3 小时前
宇树机器人二次开发环境配置 -- docker创建
运维·docker·容器
不想画图4 小时前
Kubernetes(八)——PV和PVC
云原生·容器·kubernetes
码农小卡拉6 小时前
Docker Compose部署EMQX集群详细教程(Ubuntu环境优化版)
mqtt·ubuntu·docker·容器·emqx
WilliamHu.7 小时前
Windows 环境下使用 Docker 成功部署 Dify(完整实战记录)
运维·docker·容器