当前位置: 首页 > article >正文

2-PostgreSQL docker compose 安装教程-Pgvector

在这里插入图片描述

pgvector介绍

Postgres: 开源的向量相似度搜索

存储你的向量数据与你其余的数据一起。支持:

  • 精确和近似最近邻搜索
  • 单精度,半精度,二进制,以及稀疏向量
  • L2 距离, 内积, 余弦距离, L1 距离, 哈明距离, 和杰卡德距离
  • 任何带有 Postgres 客户端的语言
  • 加上 ACID 兼容性、即时恢复、JOIN 操作,以及 Postgres 的其他所有出色功能

快速安装PostgreSQL和pgvector

https://www.postgresql.org/
https://github.com/pgvector/pgvector

1、创建Dockerfile文件,代码如下:

# 使用 PostgreSQL 16 基础镜像
FROM postgres:16

# 安装 pgvector
RUN apt-get update && \
    apt-get install -y postgresql-16-pgvector && \
    rm -rf /var/lib/apt/lists/*

# 设置启动命令
CMD ["postgres"]

2、创建docker-compose.yaml文件。

version: '3.8'
services:
  postgres:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres   # 密码
      POSTGRES_DB: postgres            # 默认数据库
    ports:
      - "5432:5432"
    volumes:
      - ${postgre_location}/postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # 初始化脚本
    restart: always
    networks:
      - outside
networks:
  outside:
    external: true

3、创建初始化脚本init.sql,docker启动时,初始化postgre

-- 启用 pgvector 扩展
CREATE EXTENSION IF NOT EXISTS vector;

文档结构如下

your-project/
├── docker-compose.yaml
├── Dockerfile
└── init.sql  # 内容为 CREATE EXTENSION vector;  

启动docker
docker compose up -d

在这里插入图片描述

4、 登录postgres

在这里插入图片描述

5、验证vector安装

SELECT * FROM pg_extension;
在这里插入图片描述
您已成功使用 Docker Compose 安装 pgvector 。此设置允许您利用 pgvector 在 PostgreSQL 数据库中存储和搜索嵌入。有关详细信息,请参阅 pgvector GitHub 官方文档。

使用 pgvector 进行向量操作

当处理小型数据集时,pgvector 允许进行精确的最近邻搜索而不需要近似。您可以使用各种距离函数,如 L2余弦距离内积余弦相似度来找到最接近的匹配项。每个距离函数都使用其自己的运算符实现,可以无缝集成到 SQL 查询中:

距离函数与操作符映射

距离函数操作符索引运算符
L2 距离<->vector_in_ops
内积<#>vector_l2_ops
余弦距离<=>vector_cosine_ops
余弦相似度1 - (a <=> b)vector_cosine_ops

说明

  • L2 距离:使用操作符 <-> 和索引运算符 vector_in_ops
  • 内积:使用操作符 <#> 和索引运算符 vector_l2_ops
  • 余弦距离:使用操作符 <=> 和索引运算符 vector_cosine_ops
  • 余弦相似度:通过计算 1 - (a <=> b) 得到,并使用索引运算符 vector_cosine_ops

向量

向量是多维空间中的数值表示,常用于语义搜索等任务。在 PostgreSQL 中,向量被视为·标准数据类型·,可以与其他数据类型一起存储和查询。
pgvector 扩展增强了 PostgreSQL 的向量操作,包括内积余弦距离ANN 搜索功能。

通过文本生成向量模型生成向量

pgvector 进行向量操作的完整学习示例

步骤 1: 创建测试表

创建一个包含向量字段的表 products,存储商品信息及其向量化特征

-- 创建表
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    description TEXT,
    embedding VECTOR(3)  -- 假设使用 3 维向量(实际场景中维度可能为 512、768 等)
);
步骤 2: 插入示例数据

插入 5 条示例数据,模拟不同商品的向量特征:

INSERT INTO products (name, description, embedding) VALUES
('Laptop', '高性能笔记本电脑', '[0.9, 0.1, 0.2]'),
('Smartphone', '5G智能手机', '[0.8, 0.3, 0.1]'),
('Headphones', '降噪耳机', '[0.2, 0.7, 0.4]'),
('Camera', '4K数码相机', '[0.6, 0.5, 0.3]'),
('Watch', '智能手表', '[0.3, 0.6, 0.8]');
步骤 3: 执行相似性搜索

示例 1: 欧氏距离 (L2 距离)
查找与目标向量 [0.7, 0.2, 0.3] 最相似的商品:

select
	name ,
	description ,
	embedding <-> '[0.7,0.2,0.3]' as distance
from
	products
order by
	distance
limit 3 ;

在这里插入图片描述

示例 2: 余弦相似度
计算与目标向量 [0.7, 0.2, 0.3] 的余弦相似度(值越大越相似):

SELECT 
    name, 
    description, 
    1 - (embedding <=> '[0.7, 0.2, 0.3]') AS cosine_similarity
FROM products
ORDER BY cosine_similarity DESC
LIMIT 3;

在这里插入图片描述

步骤 4: 创建索引优化查询

为提升搜索性能,对向量字段创建 HNSW (分层的导航小世界) 索引(适合高维向量):

这条 SQL 语句在 products 表的 embedding 列上创建了一个基于 HNSW 算法的索引,使用余弦相似度作为度量标准,并通过设置 m 和 ef_construction 参数来优化索引性能。这种索引非常适合处理高维向量数据的快速相似度搜索任务。

CREATE INDEX ON products 
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

SQL 语句解释
  1. 创建索引

    • CREATE INDEX ON products:在 products 表上创建一个索引。
  2. 索引类型

    • USING hnsw:使用 HNSW(Hierarchical Navigable Small World)索引方法。HNSW 是一种高效的近似最近邻搜索算法,特别适用于高维向量数据的快速相似度查询。
  3. 索引列和操作符类

    • (embedding vector_cosine_ops):对 embedding 列创建索引,并使用 vector_cosine_ops 操作符类。这表示该索引将基于余弦相似度进行优化,适用于计算向量之间的余弦距离或相似度。
  4. 索引参数

    • WITH (m = 16, ef_construction = 64):指定 HNSW 索引的构建参数。
      • m = 16:控制每个节点的最大连接数(出度)。较大的值可以提高查询精度,但会增加索引构建时间和存储空间。
      • ef_construction = 64:控制索引构建时的候选节点数量。较大的值可以提高索引质量,但也增加了构建时间。
步骤 5: 复杂查询示例

结合文本筛选和向量搜索,查找描述中包含「智能」且与目标向量相似的商品:

SELECT 
    name, 
    description, 
    embedding <=> '[0.7, 0.2, 0.3]' AS cosine_distance
FROM products
WHERE description LIKE '%智能%'
ORDER BY cosine_distance
LIMIT 3;

在这里插入图片描述
以下是一个使用 pgvector 进行向量操作的完整学习示例,涵盖数据插入、相似性搜索和索引优化。假设你已经安装并启用了 pgvector 扩展(基于之前的 Docker 环境)。


关键概念解释
  1. 距离度量

    • 欧氏距离 (L2)<-> 运算符,值越小表示越相似。
    • 余弦相似度<=> 运算符,值越小表示余弦距离越近(等价于 1 - 余弦相似度)。
  2. 索引类型

    • HNSW:适合高维向量,查询速度快,但索引体积较大。
    • IVFFlat:适合低维向量,需在数据插入后创建,支持更快构建。
  3. 维度对齐
    确保插入的向量维度与表定义中的 VECTOR(N) 一致(本例为 3 维)。


实际应用场景

  1. 推荐系统
    根据用户行为向量推荐相似商品。
  2. 语义搜索
    将文本编码为向量后搜索相似内容。
  3. 图像检索
    用图像特征向量搜索相似图片。

性能优化建议

  1. 批量插入数据后创建索引
    避免频繁更新索引带来的性能损耗。
  2. 合理选择索引参数
    例如 m(HNSW 的邻接节点数)和 ef_search(搜索深度)。
  3. 归一化向量
    使用余弦相似度时,提前将向量归一化可提升精度。

基础语法

https://postgresql.mosong.cc/guide/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


http://www.kler.cn/a/568099.html

相关文章:

  • 【软考-架构】1.1、计算机硬件-CPU校验码
  • Redis 五大核心数据结构详解
  • SSL域名证书怎么续期?
  • 最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
  • 6-1 定时中断
  • 手写线程池
  • 一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)
  • Java 9模块与Maven的深度结合
  • Deepseek 开源周第一天:FlashMLA
  • 2025年证券从业资格考试报名全流程图解✅
  • 期权帮|国内期权交易投资人做卖出期权价差交易收取的保证金是单边的还是双向的?
  • OpenWebUI配置异常的外部模型导致页面无法打开
  • C# 牵手DeepSeek:打造本地AI超能力
  • 杰发科技AC7801——滴答定时器获取时间戳
  • 2025春新生培训数据结构(树,图)
  • HTML 日常开发常用标签
  • RabbitMQ—保障消费者的可靠性和机制与策略
  • 【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js
  • 怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载
  • 【造个轮子】使用Golang实现简易令牌桶算法