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

相关推荐
陈桴浮海1 小时前
Kustomize实战:从0到1实现K8s多环境配置管理与资源部署
云原生·容器·kubernetes
70asunflower3 小时前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
ShiLiu_mtx4 小时前
k8s - 7
云原生·容器·kubernetes
春日见4 小时前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设
xuhe24 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
l1t5 小时前
DeepSeek总结的PostgreSQL的GPT推理SQL移植到DuckDB的性能优化方法
sql·gpt·postgresql
星火s漫天5 小时前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
MonkeyKing_sunyuhua7 小时前
docker compose up -d --build 完全使用新代码打包的方法
docker·容器·eureka
醇氧7 小时前
【docker】mysql 8 的健康检查(Health Check)
mysql·docker·容器
技术路上的探险家8 小时前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker