如何在 Azure Cosmos DB for PostgreSQL 上启用和使用 pgvector

适用对象: Azure Cosmos DB for PostgreSQL(由 PostgreSQL 的 Citus 数据库扩展提供支持)

pgvector 扩展将开源向量相似性搜索添加到 PostgreSQL。

本文介绍了 pgvector 启用的额外功能。 它涵盖了矢量相似性和嵌入的概念,并提供有关如何启用 pgvector 扩展的指导。 我们将了解如何创建、存储和查询向量。 可能还需要参阅该项目的官方自述文件

启用扩展

必须先在数据库中启用 PostgreSQL 扩展,然后才能使用它们。 若要启用扩展,请在 psql 工具中运行相应的命令,将打包的对象加载到数据库中。

SELECT CREATE_EXTENSION('vector');

注意

若要禁用扩展,请使用 drop_extension()

概念

向量相似性

向量相似性是一种通过将两个项目表示为向量(即一系列数字)来衡量其之间相似程度的方法。 向量通常用于表示数据点,其中向量的每个元素表示数据点的某个特征或属性。

向量相似性通常使用距离指标(如 Euclidean distancecosine 相似性)进行计算。 欧几里得距离测量 n 维空间中两个向量之间的直线距离,而余弦相似性测量两个向量之间夹角的余弦值。 相似性指标的值通常介于 01 之间,higher 值指示向量之间的相似性更高。

向量相似性广泛应用于各种应用程序,例如推荐系统、文本分类、图像识别和群集。 例如,在推荐系统中,向量相似性可用于根据用户的偏好识别相似项。 在文本分类中,向量相似性可用于根据向量表示形式来确定两个文档或句子之间的相似性。

嵌入

嵌入是一种评估文本、图像、视频或其他类型信息“相关性”的技术。 借助评估,机器学习模型可以有效地识别数据之间的关系和相似性,是算法可识别模式并进行准确的预测。 例如,在情绪分析任务中,具有相似嵌入的词可能具有相似的情绪分数。

使用入门

创建一个表 tblvector,其中包含类型为 vector(3)embedding 列,表示一个三维矢量。

CREATE TABLE tblvector(
    id bigserial PRIMARY KEY,
    embedding vector(3)
    );

使用 OpenAI API 等服务生成嵌入后,可以将生成的矢量存储在数据库中。 将向量定义为 vector(3) 指定三维平面中的 [x,y,z] coordinates。 该命令会使用提供的嵌入将五个新行插入到 tblvector 表中。

INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]'), (3, '[5,4,6]'), (4, '[3,5,7]'), (5, '[7,8,9]');

利用 INSERT INTO ... ON CONFLICT 语句,可以指定替代操作,例如更新符合条件的记录。 这让你能够以有效且更高效的方式处理潜在冲突。

INSERT INTO tblvector (id, embedding) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
ON CONFLICT (id) DO UPDATE SET embedding = EXCLUDED.embedding;

DELETE 命令根据 WHERE 子句中指定的条件从指定表中移除行。 当 WHERE 子句不存在时,表中所有行都将删除。

DELETE FROM tblvector WHERE id = 1;

若要检索向量并计算相似性,请使用 SELECT 语句和内置向量运算符。 例如,查询会计算给定矢量与存储在 tblvector 表中的矢量之间的欧几里得距离(L2 距离),根据计算的距离对结果进行排序,并返回最接近的五个最相似的项。

SELECT * FROM tblvector 
ORDER BY embedding <-> '[3,1,2]' 
LIMIT 5;

查询使用“<->”运算符,这是用于计算多维空间中两个向量之间距离的“距离运算符”。 查询会返回所有与向量 [3,1,2] 的距离小于 6 的行。

SELECT * FROM tblvector WHERE embedding <-> '[3,1,2]' < 6;

命令从“tblvector”表中检索“嵌入”列的平均值。 例如,如果“嵌入”列包含语言模型的词嵌入,则这些嵌入的平均值可用于表示整个句子或文档。

SELECT AVG(embedding) FROM tblvector;

矢量运算符

pgvector 引入了六个可用于矢量的新运算符:

运算符 说明
+ element-wise 相加
- element-wise 相减
* element-wise 相乘
<-> 欧几里得距离
<#> 负内积
<=> 余弦距离

矢量函数

cosine_distance

计算两个矢量之间的余弦距离。

cosine_distance(vector, vector)

自变量

vector

第一步 vector

vector

第二步 vector

返回类型

double precision 作为两个提供的矢量之间的距离。

inner_product

计算两个矢量的内部乘积。

inner_product(vector, vector)

自变量

vector

第一步 vector

vector

第二步 vector

返回类型

double precision 作为两个矢量的内部乘积。

l2_distance

计算两个矢量之间的欧几里得距离(也称为 L2)。

l2_distance(vector, vector)

自变量

vector

第一步 vector

vector

第二步 vector

返回类型

double precision 作为两个矢量之间的欧几里得距离。

l1_distance

计算两个矢量之间的出租车距离(也称为 L1)。

l1_distance(vector, vector)

自变量

vector

第一步 vector

vector

第二步 vector

返回类型

double precision 作为两个矢量之间的出租车距离。

vector_dims(vector)

返回给定矢量的尺寸。

参数

vector

一个 vector

返回类型

integer 表示给定矢量的尺寸数。

vector_norms(vector)

计算给定矢量的欧几里得范数。

参数

vector

一个 vector

返回类型

double precision 表示给定矢量的欧几里得范数。

矢量聚合

AVG

计算已处理矢量的平均值。

参数

vector

一个 vector

返回类型

vector 表示已处理矢量的平均值。

SUM

自变量

vector

一个 vector

返回类型

vector 表示已处理矢量的和。

后续步骤

使用 pgvector 详细了解性能、索引和限制。