跳转到主要内容
Chinese, Simplified

category

pgvector是PostgreSQL的一个扩展,它为在高维空间中处理向量提供了强大的功能。它引入了一种专用的数据类型、运算符和函数,可以直接在PostgreSQL数据库中高效地存储、操作和分析矢量数据。

Timescale从2023年5月开始支持扩展,我们已经在用它做一些很酷的事情。使用它可以查询和分析向量数据以及Timescale中存储的其他结构化数据。如果你正在寻找一个矢量数据库,要知道PostgreSQL就是你所需要的。

Timescale Vector包括pgvector扩展,以及一种新的高性能索引类型Timescale Vector索引,它与pgvector一起工作,以加快对非常大的矢量数据集的查询。了解有关Timescale矢量的更多信息。

让我们来了解一下pgvector PostgreSQL扩展的主要功能和用例。我们还将介绍一些使用pgvector对TimescaleDB中的关系数据和时间序列数据进行分析的例子。

理解pgvector:启用矢量运算


pgvector扩展是存储、修改和查询向量的强大工具。该功能支持各种应用程序,如相似性和语义搜索、检索增强生成、图像搜索、推荐系统、自然语言处理(NLP)和计算机视觉。

以下是pgvector的一些关键功能和用例:

  • 矢量存储:pgvector扩展允许您将高维矢量直接存储在PostgreSQL表中。它为矢量表示提供了一种专用的数据类型,允许有效地存储和检索矢量数据。
  • 相似性搜索:使用pgvector,您可以根据向量相似性度量(如余弦相似性或欧几里得距离)执行相似性搜索。搜索相似的向量有助于应用程序,如基于内容的推荐系统、k近邻搜索和聚类。
  • 语义搜索:大型语言模型(LLM)嵌入是从其他类型的数据(如文本、图像等)创建向量的一种方式。这些嵌入表示底层数据的含义。因此,使用相似性搜索来查找相似的向量会返回具有
  • 自然语言处理(NLP)和文本分析:矢量嵌入功能强大,因为它们可以捕捉文本的基本含义。单词或文档嵌入等技术使您能够捕捉文本中表达的想法。然后,您可以对文本数据执行基于向量的操作,如相似性搜索、聚类或分类。
  • 计算机视觉:pgvector扩展可以处理图像的矢量表示,并实现基于相似性的图像搜索。您可以使用卷积神经网络(CNN)或图像嵌入等技术将图像转换为矢量表示。这允许您在数据库中执行基于内容的图像检索、图像相似性匹配、对象识别和图像聚类。
  • 与SQL查询的集成:pgvector与SQL查询无缝集成。这允许您将矢量相似性搜索与其他过滤或聚合操作相结合,以多种方式实现更复杂的数据分析。例如,您可以在单个SQL查询中而不是在应用程序级联接中将矢量数据轻松地联接到其他结构化数据。

对矢量数据使用pgvector


通过使用pgvector扩展,开发人员可以在PostgreSQL中高效地存储和查询矢量数据,从而更容易地构建具有LLM的生成型人工智能应用程序,以及需要相似性搜索、推荐系统、NLP和其他涉及矢量工作的任务的人工智能应用。

  • 安装:您可以在Timescale中的云数据库服务或自托管PostgreSQL实例上使用pgvector:
    • Timescale的云数据库实例预装了pgvector。因此,您所要做的就是运行CREATE EXTENSION,或者使用Timescale Vector的Python客户端库连接到PostgreSQL服务。开始使用Timescale上的pgvector。它90天免费,之后根据您的使用情况计费。
    • 对于自托管,您需要在服务器上安装pgvector扩展。您可以按照Linux、MacOS和Windows的pgvector安装说明进行操作。安装后,可以使用CREATE extension命令在数据库中启用扩展:CREATE extension vector;
  • 矢量数据类型:pgvector引入了一种新的数据类型,称为表示高维矢量的矢量。可以在数据库表中定义矢量类型列来存储矢量数据。例如,可以有一个名为documents的表,该表具有类型为vector的嵌入列,以将LLM嵌入存储为每个文档的向量。
     

CREATE TABLE documents (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
content TEXT,
author_id BIGINT,
embedding VECTOR(1538)
);

  • 索引和矢量搜索:pgvector提供了针对矢量数据的近似近邻搜索而优化的索引机制。可以使用create index命令在矢量列上创建索引,指定hnsw索引类型和vector_cosine_ops运算符类。这使得能够使用余弦距离相似性度量对矢量数据进行快速相似性搜索。然后,您可以使用<=>运算符在查询中执行相似性搜索:
     

CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

--find the closest 5 elements to a given query
SELECT * FROM documents ORDER BY embedding <=> '[10.5, 11.0,...]' LIMIT 5;.
 

 

  • 矢量函数:pgvector附带了一组内置函数,用于对矢量数据进行操作。这些函数允许您计算矢量相似性、执行矢量算术等。例如,可以使用cosine_distance函数来计算两个向量之间的余弦相似度。其他有用的函数是vector_norm(),用于获得欧几里得范数,vector_dims()用于确定向量包含的维数。
  • 矢量聚合:pgvector具有avg(矢量)和sum(矢量)聚合函数,用于计算矢量分析。
  • 与PostgreSQL的其他功能集成:pgvector与PostgreQL的其他功能无缝集成,如事务管理、查询优化和安全。这使您能够利用PostgreSQL的强大功能执行复杂的数据处理任务。将pgvector数据与其他数据类型(如关系数据、时间序列数据和地理空间数据)相结合,是丰富矢量查询数据的一种特别强大的方法。举个简单的例子,您可以返回通过相似性搜索找到的文档的作者信息:

WITH matching_docs as (
 --find 5 closest matches 
 SELECT * 
 FROM documents 
 ORDER BY embedding <=> '[10.5, 11.0,...]' 
 LIMIT 5
)
SELECT d.content, a.first_name, a.last_name
FROM matching_docs d 
INNER JOIN author a ON (a.id = d.author_id).


为什么使用带Timescale的pgvector?


Timescale是PostgreSQL++为时间序列数据、事件和分析而设计的。由于其基于时间的聚合、数据保留策略以及超表和连续聚合等功能,它为存储、检索和分析大量时间序列数据提供了坚实的基础。

许多真实世界的人工智能应用程序都有检索或分析要求,包括向量数据和相似性搜索的时间方面。一些时间很重要的工作量示例是新闻、法律文件和财务报表的嵌入。

在这种情况下,用户通常希望找到既相似又在特定时间范围内的文档。另一个常见的用途是时间加权,用户可能不使用严格的时间过滤器,但仍然更喜欢较新或较旧的数据。对于这样的工作负载,Timescale可以显著提高数据接收和查询速度,这要归功于hypertables——表的自动基于时间的分区。Timescale特别擅长优化基于时间过滤数据的查询,使这些查询能够更高效地运行。

此外,复杂系统使用许多不同类型的数据工作负载,如时间序列、事件、历史、实时和结构化关系数据。将这些不同类型的数据存储在一个数据库中具有许多操作优势。它将备份、恢复和安全等任务整合到一个系统中,从而简化了操作管理,降低了复杂性。

此外,使用联接组合不同的数据类型可以实现更复杂的数据分析。通过将所有内容保存在同一数据库中,您可以避免数据孤岛,加快工作流程,并为用户提供更快的见解。

如何使用带Timescale的pgvector

步骤1。在PostgreSQL实例上设置pgvector和timescaledb。

  • 您可以使用Timescale上的云托管数据库(推荐)或自托管实例来执行此操作。
  • Timescale:最简单的方法是使用Timescale管理的数据库实例,该实例附带已经预装的pgvector和timescaleDB。免费开始使用Timescale Cloud,为期90天。你唯一需要做的就是执行
     

CREATE EXTENSION vector;

  • 自托管:要在PostgreSQL数据库中安装TimescaleDB扩展,您可以根据您的PostgreSQL版本遵循TimescaleDB提供的安装指南。要安装pgvector,可以按照Linux、MacOS和Windows的安装说明进行操作。

然后,您需要执行以下操作:

CREATE EXTENSION vector;
CREATE EXTENSION timescaledb;


步骤2。创建一个带有矢量列的Timescale超表:

在数据库中创建一个正则表,作为超表的基础。使用TimescaleDB提供的create_hypertable函数将表转换为超表。指定时间列和其他相关选项。

  • CREATE TABLE documents (
     id BIGINT GENERATED ALWAYS AS IDENTITY,
     created_at TIMESTAMPTZ,
     content TEXT,
     embedding VECTOR(1538)
    );
  • SELECT create_hypertable('documents', 'created_at');


步骤3。在超表中插入矢量数据:

使用常规SQL Insert语句将数据插入超表,包括指定矢量列中的矢量数据。确保矢量数据的格式正确,符合pgvector的要求。您需要从嵌入模型(例如,OpenAI text-embedding-3模型,或者,如果您愿意,可以从开源句子转换器)中获得矢量表示。

INSERT INTO documents (created_at, content,embedding)
VALUES ('2023-06-01 00:00:00', 'the quick', '[1,2,3]'),
      ('2023-06-02 00:00:00', 'brown fox', '[4,5,6]'),
      ('2023-06-03 00:00:00', 'jumped over' '[7,8,9]');


步骤4。查询和分析矢量数据。

使用SQL查询可以对存储在超表中的矢量数据执行各种操作。您可以将TimescaleDB的时间序列函数与pgvector的矢量函数结合起来进行分析和查询。

可以执行的查询示例包括:

  • 相似性搜索:使用pgvector提供的<=>运算符查找与给定查询向量相似的向量。将其与其他列(如时间)上的筛选器相结合。
  • 聚合和分组:使用TimescaleDB的时间序列聚合函数来聚合时间间隔或其他维度上的矢量数据。
  • 筛选和选择:使用常规SQL筛选器和条件,根据特定条件选择特定的矢量数据。

-- Similarity search
SELECT *
FROM documents
ORDER BY data <=> '[1,2,3]'::vector
LIMIT 5;

-- Similarity search filtered by time
SELECT *
FROM documents
WHERE time >= '2023-06-02 00:00:00' AND time < '2023-06-03 00:00:00'
ORDER BY data <=> '[1,2,3]'::vector
LIMIT 5;

-- Aggregation and grouping,
SELECT time_bucket('30 day', created_at) AS day, length(data) AS avg_data_length
FROM sensor_data
GROUP BY day
ORDER BY day;

-- Filtering and selection
SELECT *
FROM sensor_data
WHERE time >= '2023-06-02 00:00:00' AND time < '2023-06-03 00:00:00';

步骤5。优化和性能。

根据数据的规模和复杂性,可以考虑优化查询性能,方法是使用具有hnsw索引类型和vector_cosine_ops运算符类的CREATE INDEX命令在矢量列上创建索引。根据您的工作负载和资源需求调整TimescaleDB和PostgreSQL的配置参数,以实现最佳性能。

CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);


接下来的步骤

想了解更多关于pgvector的信息以及如何使用它吗?阅读以下资源:

  • 探索我们关于为您的人工智能应用程序使用pgvector的文档
  • 使用Timescale矢量Python库可以轻松处理矢量数据
  • 如何使用pgvector构建:PostgreSQL作为矢量数据库:使用pgvectors创建、存储和查询OpenAI嵌入
  • 关注性能:我们如何使PostgreSQL成为一个更好的矢量数据库
  • 如何在LangChain中使用pgvector矢量存储构建LLM应用程序
  • 如何自动嵌入PostgreSQL中已存储的数据
原文地址
https://www.timescale.com/learn/postgresql-extensions-pgvector
本文地址
Tags
 
Article

微信

知识星球

微信公众号

视频号