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 嵌入的应用场景。

相关推荐
像风一样自由20202 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
陈陈CHENCHEN5 小时前
【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务
云原生·容器·kubernetes
江湖有缘6 小时前
Docker实战 | 使用Docker部署rmoments社交平台
jvm·docker·oracle
IvorySQL7 小时前
PostgreSQL 日报|逻辑解码 DDL 子事务缺陷修复(10 月 12 日)
数据库·postgresql
瀚高PG实验室9 小时前
瀚高数据库序列介绍、使用及值不连续、重复写入等现象处理
数据库·postgresql·瀚高数据库
这个DBA有点耶9 小时前
PostgreSQL HOT更新:频繁更新表的索引膨胀根因与fillfactor调优
数据库·sql·postgresql
灯澜忆梦11 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器
TTATTC11 小时前
Android 浏览器死活不弹证书框的那天,我用 .NET MAUI 给 WebView 写了一个 mTLS 拦截器
docker·开源
TTATTC11 小时前
百万行 Trace 交给 AI,方向和验证留给人,一套还原自定义 VMP 保护的分工方法
docker·开源
TTATTC12 小时前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
docker·开源