Timescale Cloud:性能、规模、企业级

自托管产品

MST

数据库中的向量使用 vector 列存储在常规 PostgreSQL 表中。vector 列类型由 pgvector 扩展提供。一种常见的存储向量的方式是与它们所索引的数据一起存储。例如,要存储文档的嵌入,常见的表结构是

CREATE TABLE IF NOT EXISTS document_embedding (
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
document_id BIGINT FOREIGN KEY(document.id)
metadata JSONB,
contents TEXT,
embedding VECTOR(1536)
)

此表包含一个主键、一个指向文档表的外键、一些元数据、被嵌入的文本(在 contents 列中)以及嵌入向量。

这可能看起来有点奇怪:为什么嵌入不简单地作为文档表中的单独一列?答案与嵌入模型和大型语言模型的上下文长度限制有关。当嵌入数据时,你可以嵌入的内容长度是有限制的(例如,OpenAI 的 ada-002 的限制为 8191 个 token),因此,如果你要嵌入长文本,必须将其分解成更小的块并单独嵌入每个块。因此,在数据库层面考虑时,被嵌入的数据与嵌入之间通常存在一对多关系,这通过从嵌入到被嵌入数据的外键来表示。

当然,如果你不想在数据库中存储原始数据,而只存储嵌入,那也完全没问题。只需从表中省略外键即可。另一种流行的替代方案是将外键放入元数据 JSONB 中。

向量的典型查询是查找与用户查询嵌入最接近的查询向量。这也被称为查找 K 近邻

在下面的示例查询中,$1 是一个接收查询嵌入的参数,而 <=> 运算符计算查询嵌入与数据库中存储的嵌入向量之间的距离(并返回一个浮点值)。

SELECT *
FROM document_embedding
ORDER BY embedding <=> $1
LIMIT 10

上述查询返回查询嵌入与行嵌入之间距离最小的 10 行。当然,由于这是 PostgreSQL,你可以添加额外的 WHERE 子句(例如对元数据的筛选)、连接等。

上面显示的查询使用了一种称为余弦距离(使用 <=> 运算符)的方法来衡量两个嵌入的相似程度。但是,有多种方法可以量化两个向量之间的距离。

注意

实际上,距离度量的选择并不那么重要,对于大多数应用,建议坚持使用余弦距离。

以下是三种常见向量距离度量的简洁描述

  • 余弦距离(又称角度距离):这衡量的是两个向量之间夹角的余弦值。它在数学意义上并非真正的“距离”,而是一种相似性度量,其中较小的角度对应着较高的相似性。余弦距离在向量幅度(长度)不那么重要的高维空间中特别有用,例如在文本分析或信息检索中。它的取值范围为 -1(表示完全相反)到 1(表示完全相同),0 通常表示正交性(无相似性)。有关 余弦相似度的更多信息,请点击此处。

  • 负内积:这仅仅是两个向量的内积(又称点积)的负值。内积根据向量的幅度以及它们之间夹角的余弦值来衡量向量相似度。较高的内积表示更高的相似度。然而,需要注意的是,与余弦相似度不同,向量的幅度会影响内积。

  • 欧几里得距离:这是欧几里得空间中两点之间的“普通”直线距离。对于向量而言,它是向量对应元素平方差之和的平方根。此度量对向量的幅度很敏感,广泛应用于聚类和最近邻搜索等各个领域。

许多嵌入系统(例如 OpenAI 的 ada-002)使用长度为 1 的向量(单位向量)。对于这些系统,这三种度量的排名(顺序)是相同的。具体来说,

  • 余弦距离是 1−点积
  • 负内积是 −点积
  • 欧几里得距离与点积相关,其中欧几里得距离的平方是 2(1−点积)

建议使用余弦距离,特别是对于单位向量。这些建议基于 OpenAI 的推荐以及单位向量上不同距离的排名保持不变的事实。

在 PostgreSQL 和其他关系型数据库中,索引是一种加速查询的方式。对于向量数据,索引可以加速上面所示的相似性搜索查询,即查找与给定查询嵌入最相似的嵌入。这个问题通常被称为查找 K 近邻

注意

在向量数据库的语境中,“索引”一词具有多种含义。它既可以指数据的存储机制,也可以指提高查询效率的工具。本文档使用后一种含义。

在 PostgreSQL 中查找 K 近邻并不是一个新问题,但现有技术只适用于低维数据。由于“维度诅咒”,这些方法在处理超过大约 10 个维度的数据时就会失效。鉴于嵌入通常由超过一千个维度组成(OpenAI 的为 1,536),因此必须开发新技术。

在如此高维空间中高效搜索尚无已知的精确算法。然而,存在出色的近似算法,它们属于近似最近邻算法的范畴。

Timescale 上的 pgai 提供了 3 种不同的索引算法:StreamingDiskANN、HNSW 和 ivfflat。下表说明了这些算法之间的高级区别

算法构建速度查询速度更新后是否需要重建
StreamingDiskANN最快
HNSW
ivfflat最快最慢

有关每个索引在包含 100 万个 OpenAI 嵌入的数据集上的性能详情,请参阅性能基准

对于大多数应用,推荐使用 StreamingDiskANN 索引。

关键词

在此页面上发现问题?报告问题 或在 GitHub 上编辑此页面