Postgres扩展之pgvector:向量相似度搜索

简介

pgvector:在 Postgres 中存储和查询向量。您可以将向量数据与其他数据一起存储在 Postgres 中,并进行向量相似性搜索,同时仍然可以利用 Postgres 提供的所有强大功能。

pgvector 扩展与 Postgres 无缝集成 - 允许用户在现有数据库基础设施中利用其功能。通过将向量化处理的能力整合到PostgreSQL中,pgvector允许用户直接在数据库中进行大规模的相似性搜索、机器学习模型预测等多种操作,因为不需要单独的数据存储或复杂的数据传输过程。

核心功能

1.向量存储:

  • pgvector使用高效的二进制编码(如Faiss的IVF索引)来存储和检索高维向量,大大降低了存储空间需求,并提高了查询速度。

  • 支持多种向量类型,包括单精度(Single-precision)、半精度(Half-precision)、二进制(Binary)和稀疏向量(Sparse Vectors),以满足不同场景的需求。

2.相似性搜索:

  • 支持多种相似性度量标准,如L2距离(L2 Distance)、内积(Inner Product)、余弦距离(Cosine Distance)、L1距离(L1 Distance),以便用户根据实际需求选择合适的搜索方法。
  • 提供HNSW和IVFFlat等索引策略,以优化查询性能。

3.集成SQL支持:

  • 与标准PostgreSQL完全兼容,用户可以使用SQL语句来创建、查询和管理向量表,从而简化了开发流程。

  • 提供了一系列内置函数,如余弦相似度计算等,便于在SQL查询中直接进行相似性比较。

4.扩展性与灵活性:

  • 作为开源项目,pgvector允许开发者根据需要对其进行定制和扩展。
  • 支持ACID事务、点时间恢复、JOIN操作以及PostgreSQL的所有其他优秀特性。

应用场景

pgvector适用于多种应用场景,包括但不限于:

  • 推荐系统:通过在数据库内部计算用户行为向量的相似度,实时生成个性化推荐。

  • 图像识别:存储和检索图像特征向量,实现基于内容的图片搜索。

  • 自然语言处理:向量数据库可以存储大量的文本向量数据,通过向量索引技术实现快速的文本搜索和相似度匹配,构建智能问答系统或聊天机器人。

准备工作

登录MemFire Cloud平台,创建一个新应用,如下图所示:

应用创建成功后,即可获得一个云端的Postgres数据库。

启用扩展

1.通过控制台页面开启vector扩展。

(1)转到仪表板中的数据库页面。

(2)点击侧边栏中的 扩展

(3)搜索 "vector" 并启用该扩展。

另外,也可以通过在SQL编辑器页面,执行如下SQL语句来启用/禁用扩展。

 -- Example: enable the "vector" extension.
create extension vector
with
  schema extensions;


-- Example: disable the "vector" extension
drop
  extension if exists vector;

使用教程

以下是一个简单的示例,展示如何使用 pgvector

创建向量表

你可以在创建新表时定义向量列:

CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    vector_col vector(3)  
);

插入向量数据

为了进行测试,我们插入一些数据:

-- 直接插入向量
INSERT INTO documents (content, vector_col) VALUES ('example content1', '[0.1, 0.2, 0.3]');

INSERT INTO documents (content, vector_col) VALUES ('example content2', '[0.3, 0.2, 0.3]');

INSERT INTO documents (content, vector_col) VALUES ('example content3', '[0.1, 0.3, 0.2]');

INSERT INTO documents (content, vector_col) VALUES ('example content4', '[0.2, 0.2, 0.3]');

INSERT INTO documents (content, vector_col) VALUES ('example content5', '[0.1, 0.1, 0.2]');

执行结果如下:

查询数据

pgvector 支持的一些距离函数:

  • 余弦相似度 (cosine_similarity或<=> 运算符): 计算两个向量之间的余弦相似度,这通常用于测量它们在方向上的相似性,值的范围从 -1(完全不相似)到 1(完全相同方向)。

  • 欧几里得距离 (L2 norm<-> 运算符):计算两个向量之间的直线距离,是多维空间中两点之间的实际距离。

  • 曼哈顿距离 (L1 norm<+>运算符): 也称为 L1 距离,是各个维度上距离的总和,常用于表示城市街区中的最短路径。备注说明:在 0.7.0 版本中新增操作;

  • 内积 (inner_product<#> 运算符): 计算两个向量的点积,是它们对应元素乘积的总和,可以用于测量两个向量的相似性。

例如:获取与向量'[0.3, 0.2, 0.3]'直线距离

SELECT vector_col <-> '[0.3, 0.2, 0.3]' AS distance FROM documents

SELECT vector_col <-> '[0.3, 0.2, 0.3]' AS distance FROM documents

执行结果如下:

例如:获取与向量'[0.3, 0.2, 0.3]'的余弦相似度:

SELECT vector_col <=> '[0.3, 0.2, 0.3]' FROM documents;

执行结果如下:

对于内积,乘以 -1(因为 <#> 返回负内积)。

SELECT (vector_col <#> '[0.3, 0.2, 0.3]') * -1 AS inner_product FROM documents;

执行结果如下:

创建索引

默认情况下,pgvector 执行精确最近邻搜索,提供完美召回率。你可以添加索引以使用近似最近邻搜索,这会在速度和召回率之间进行权衡。与典型索引不同,添加近似索引后,查询结果会有所不同。

pgvector 支持的索引类型有:

  • HNSW:比 IVFFlat 有更好的查询性能(在速度-召回率权衡方面),但构建时间更慢,使用的内存更多。此外,由于没有像 IVFFlat 那样的训练步骤,即使表中没有任何数据,也可以创建索引。

  • IVFFlat:IVFFlat 索引将向量划分为列表,然后搜索最接近查询向量的子集列表。它比 HNSW 构建速度更快,使用的内存更少,但在查询性能方面(在速度-召回率权衡方面)较低。

       接下来我们以HNSW索引为例来进行介绍创建索引来加速查询操作。

创建HNSW索引

  使用 CREATE INDEX 命令和 USING 子句来创建HNSW索引。

CREATE INDEX documents_idx
ON documents
USING hnsw (vector_col);

配置索引参数(可选)

HNSW 索引允许你设置一些参数来优化索引的行为,例如 ef_constructM

CREATE INDEX documents_idx
ON documents
USING hnsw (vector_col)
WITH (M=16, ef_construct=200);
  • M 是树的层次数,默认为 16。

  • ef_construct 是构建索引时使用的搜索参数,默认为 64。

使用索引进行查询

创建索引后,你可以使用它来加速向量搜索。例如,使用欧几里得距离进行搜索:

SELECT * FROM documents
ORDER BY vector_col <-> '[0.1, 0.2, 0.3]'::vector
LIMIT 10;

注意事项

  • 确保你的 PostgreSQL 版本与 pgvector 版本兼容。

  • 在生产环境中使用之前,进行充分的测试以验证索引的性能和效果。

  • 根据你的具体需求,可能需要使用不同的距离度量方法或索引参数。

总结

总之,pgvector是PostgreSQL数据库系统的一个强大扩展,它为用户提供了高效的向量存储和查询能力,适用于处理大规模、高维度的向量数据。无论是机器学习、自然语言处理还是其他需要高效相似性搜索的领域,pgvector都能提供有力的支持。

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值