searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用pgvector进行向量搜索

2024-10-25 08:57:27
17
0

随着自然语言处理(NLP)、计算机视觉(CV)等领域的快速发展,向量数据库成为处理大量高维数据的关键工具之一。PostgreSQL 作为广泛使用的关系型数据库,通过扩展 pgvector 插件,使其能够支持高效的向量搜索,从而为用户提供一站式的向量存储与检索功能。本文将详细介绍如何安装、配置并使用 pgvector 插件来进行高效的向量搜索。

在本教程中,我们将介绍如何通过 Docker 快速体验带有 pgvector 插件的 PostgreSQL ,并详细演示如何使用 pgvector 进行向量存储与相似性搜索。

什么是pgvector?

pgvector 是一个为 PostgreSQL 提供向量存储和检索功能的插件。通过 pgvector,你可以在 PostgreSQL 中直接存储嵌入向量,并基于多种距离或相似性度量(如欧几里得距离、余弦相似度、内积)进行高效的向量检索。

通过Docker部署pgvector的步骤

步骤1:拉取pgvector镜像

首先,我们需要从 Docker Hub 上获取官方的 pgvector 镜像。你可以通过以下命令拉取基于 PostgreSQL 16 的 pgvector 镜像:

docker pull pgvector/pgvector:pg16

这个镜像已经预装了 PostgreSQL 16 和 pgvector 插件,因此省去了手动安装插件的步骤。

步骤2:启动pgvector容器

接下来,使用 docker run 命令启动带有 pgvector 插件的 PostgreSQL 实例。这个命令会创建并运行一个 PostgreSQL 容器,其中包含了我们所需的 pgvector 插件。

docker run --name pgvector_postgres \
    -e POSTGRES_USER=your_username \
    -e POSTGRES_PASSWORD=your_password \
    -e POSTGRES_DB=your_database \
    -p 5432:5432 \
    -d pgvector/pgvector:pg16

参数说明:

  • --name pgvector_postgres:为容器指定名称,方便后续管理。
  • -e POSTGRES_USER=your_username:指定 PostgreSQL 的用户名。
  • -e POSTGRES_PASSWORD=your_password:设置 PostgreSQL 的密码。
  • -e POSTGRES_DB=your_database:创建默认的数据库。
  • -p 5432:5432:将容器的 PostgreSQL 端口 5432 映射到主机的 5432 端口,方便本地连接。
  • -d:让容器在后台运行。

步骤3:连接到PostgreSQL实例

容器启动后,我们可以使用 PostgreSQL 的 psql 工具或其他数据库管理工具(如 pgAdminDBeaver)来连接到数据库。以下是使用 psql 连接数据库的命令:

psql -h localhost -U your_username -d your_database

系统会提示你输入 PostgreSQL 用户密码,使用你在启动容器时设置的 POSTGRES_PASSWORD

步骤4:验证pgvector插件是否已成功安装

为了确保 pgvector 插件已经正确加载,进入 PostgreSQL 控制台后,执行以下命令来创建 pgvector 扩展:

CREATE EXTENSION IF NOT EXISTS vector;

如果返回消息显示扩展已经存在,说明 pgvector 插件已经成功安装并可以使用。

使用pgvector进行向量操作

接下来,我们演示如何使用 pgvector 插件进行向量的存储、检索和相似度搜索。

创建表并插入向量数据

我们可以在数据库中创建一个带有向量列的表,并插入一些向量数据。例如,假设我们需要存储文本嵌入向量,以下是创建表和插入数据的 SQL 语句:

-- 创建一个包含向量列的表
CREATE TABLE items (
    id serial PRIMARY KEY,
    embedding vector(3)  -- 这里定义了一个3维向量
);

-- 插入一些向量数据
INSERT INTO items (embedding) VALUES ('[1, 2, 3]');
INSERT INTO items (embedding) VALUES ('[4, 5, 6]');
INSERT INTO items (embedding) VALUES ('[7, 8, 9]');

在上述示例中,我们创建了一个 items 表,其中包含 embedding 列,这个列是一个三维向量(vector(3))。你可以根据实际应用的需求调整向量的维度。

向量相似度检索

pgvector 插件支持三种常见的相似度或距离度量方法:欧几里得距离、余弦相似度和内积。我们可以基于这三种方法对插入的数据进行检索。

1. 欧几里得距离

欧几里得距离是一种用于度量两点之间“直线距离”的方式。以下查询会返回与给定向量 [3, 3, 3] 欧几里得距离最小的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <-> '[3, 3, 3]'
LIMIT 1;

<-> 运算符用于计算向量之间的欧几里得距离,并按照从小到大的顺序排序结果。

2. 余弦相似度

余弦相似度用于衡量两个向量的夹角,余弦相似度越接近 1,表示两个向量越相似。以下查询会返回与给定向量 [3, 3, 3] 余弦相似度最高的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <=> '[3, 3, 3]'
LIMIT 1;

<=> 运算符用于计算余弦相似度,并按降序排列结果。

3. 内积

内积(Dot Product)用于测量两个向量在相同方向上的相似性,常用于推荐系统。以下查询会返回与给定向量 [3, 3, 3] 内积最大的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <#> '[3, 3, 3]'
LIMIT 1;

<#> 运算符用于计算向量内积,并按降序排列结果。

使用索引优化向量检索

在进行大规模向量检索时,查询性能至关重要。pgvector 支持基于向量的索引来优化查询速度,常见的索引类型包括 ivfflat

创建 ivfflat 索引

ivfflat 索引通过将向量划分为多个列表来加速搜索,可以在需要对大量向量进行快速检索时使用。以下是在 embedding 列上创建 ivfflat 索引的示例:

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

在这里,vector_l2_ops 指定了欧几里得距离为搜索度量标准,lists 参数定义了索引的分区数,可以根据数据规模进行调整。

使用索引进行检索

创建索引后,进行向量搜索时会自动利用该索引来加速查询。例如,查询最相似的向量:

SET enable_seqscan = OFF;

SELECT id, embedding
FROM items
ORDER BY embedding <-> '[3, 3, 3]'
LIMIT 1;

通过禁用顺序扫描并使用索引,查询性能将大幅提升。

总结

通过本文,你学习了如何通过 Docker 快速体验带有 pgvector 插件的 PostgreSQL ,并掌握了 pgvector 插件的基础操作,包括创建向量表、插入向量数据、进行向量相似性检索以及通过索引优化查询性能。

pgvector 使得 PostgreSQL 成为向量数据存储和检索的强大工具,尤其适用于机器学习和数据挖掘的相关场景。在实际项目中,通过 pgvector 你可以轻松构建图像检索、推荐系统、文本检索等应用,充分利用 PostgreSQL 的扩展性与灵活性。

0条评论
0 / 1000
全****琪
3文章数
0粉丝数
全****琪
3 文章 | 0 粉丝
全****琪
3文章数
0粉丝数
全****琪
3 文章 | 0 粉丝
原创

使用pgvector进行向量搜索

2024-10-25 08:57:27
17
0

随着自然语言处理(NLP)、计算机视觉(CV)等领域的快速发展,向量数据库成为处理大量高维数据的关键工具之一。PostgreSQL 作为广泛使用的关系型数据库,通过扩展 pgvector 插件,使其能够支持高效的向量搜索,从而为用户提供一站式的向量存储与检索功能。本文将详细介绍如何安装、配置并使用 pgvector 插件来进行高效的向量搜索。

在本教程中,我们将介绍如何通过 Docker 快速体验带有 pgvector 插件的 PostgreSQL ,并详细演示如何使用 pgvector 进行向量存储与相似性搜索。

什么是pgvector?

pgvector 是一个为 PostgreSQL 提供向量存储和检索功能的插件。通过 pgvector,你可以在 PostgreSQL 中直接存储嵌入向量,并基于多种距离或相似性度量(如欧几里得距离、余弦相似度、内积)进行高效的向量检索。

通过Docker部署pgvector的步骤

步骤1:拉取pgvector镜像

首先,我们需要从 Docker Hub 上获取官方的 pgvector 镜像。你可以通过以下命令拉取基于 PostgreSQL 16 的 pgvector 镜像:

docker pull pgvector/pgvector:pg16

这个镜像已经预装了 PostgreSQL 16 和 pgvector 插件,因此省去了手动安装插件的步骤。

步骤2:启动pgvector容器

接下来,使用 docker run 命令启动带有 pgvector 插件的 PostgreSQL 实例。这个命令会创建并运行一个 PostgreSQL 容器,其中包含了我们所需的 pgvector 插件。

docker run --name pgvector_postgres \
    -e POSTGRES_USER=your_username \
    -e POSTGRES_PASSWORD=your_password \
    -e POSTGRES_DB=your_database \
    -p 5432:5432 \
    -d pgvector/pgvector:pg16

参数说明:

  • --name pgvector_postgres:为容器指定名称,方便后续管理。
  • -e POSTGRES_USER=your_username:指定 PostgreSQL 的用户名。
  • -e POSTGRES_PASSWORD=your_password:设置 PostgreSQL 的密码。
  • -e POSTGRES_DB=your_database:创建默认的数据库。
  • -p 5432:5432:将容器的 PostgreSQL 端口 5432 映射到主机的 5432 端口,方便本地连接。
  • -d:让容器在后台运行。

步骤3:连接到PostgreSQL实例

容器启动后,我们可以使用 PostgreSQL 的 psql 工具或其他数据库管理工具(如 pgAdminDBeaver)来连接到数据库。以下是使用 psql 连接数据库的命令:

psql -h localhost -U your_username -d your_database

系统会提示你输入 PostgreSQL 用户密码,使用你在启动容器时设置的 POSTGRES_PASSWORD

步骤4:验证pgvector插件是否已成功安装

为了确保 pgvector 插件已经正确加载,进入 PostgreSQL 控制台后,执行以下命令来创建 pgvector 扩展:

CREATE EXTENSION IF NOT EXISTS vector;

如果返回消息显示扩展已经存在,说明 pgvector 插件已经成功安装并可以使用。

使用pgvector进行向量操作

接下来,我们演示如何使用 pgvector 插件进行向量的存储、检索和相似度搜索。

创建表并插入向量数据

我们可以在数据库中创建一个带有向量列的表,并插入一些向量数据。例如,假设我们需要存储文本嵌入向量,以下是创建表和插入数据的 SQL 语句:

-- 创建一个包含向量列的表
CREATE TABLE items (
    id serial PRIMARY KEY,
    embedding vector(3)  -- 这里定义了一个3维向量
);

-- 插入一些向量数据
INSERT INTO items (embedding) VALUES ('[1, 2, 3]');
INSERT INTO items (embedding) VALUES ('[4, 5, 6]');
INSERT INTO items (embedding) VALUES ('[7, 8, 9]');

在上述示例中,我们创建了一个 items 表,其中包含 embedding 列,这个列是一个三维向量(vector(3))。你可以根据实际应用的需求调整向量的维度。

向量相似度检索

pgvector 插件支持三种常见的相似度或距离度量方法:欧几里得距离、余弦相似度和内积。我们可以基于这三种方法对插入的数据进行检索。

1. 欧几里得距离

欧几里得距离是一种用于度量两点之间“直线距离”的方式。以下查询会返回与给定向量 [3, 3, 3] 欧几里得距离最小的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <-> '[3, 3, 3]'
LIMIT 1;

<-> 运算符用于计算向量之间的欧几里得距离,并按照从小到大的顺序排序结果。

2. 余弦相似度

余弦相似度用于衡量两个向量的夹角,余弦相似度越接近 1,表示两个向量越相似。以下查询会返回与给定向量 [3, 3, 3] 余弦相似度最高的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <=> '[3, 3, 3]'
LIMIT 1;

<=> 运算符用于计算余弦相似度,并按降序排列结果。

3. 内积

内积(Dot Product)用于测量两个向量在相同方向上的相似性,常用于推荐系统。以下查询会返回与给定向量 [3, 3, 3] 内积最大的记录:

SELECT id, embedding
FROM items
ORDER BY embedding <#> '[3, 3, 3]'
LIMIT 1;

<#> 运算符用于计算向量内积,并按降序排列结果。

使用索引优化向量检索

在进行大规模向量检索时,查询性能至关重要。pgvector 支持基于向量的索引来优化查询速度,常见的索引类型包括 ivfflat

创建 ivfflat 索引

ivfflat 索引通过将向量划分为多个列表来加速搜索,可以在需要对大量向量进行快速检索时使用。以下是在 embedding 列上创建 ivfflat 索引的示例:

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);

在这里,vector_l2_ops 指定了欧几里得距离为搜索度量标准,lists 参数定义了索引的分区数,可以根据数据规模进行调整。

使用索引进行检索

创建索引后,进行向量搜索时会自动利用该索引来加速查询。例如,查询最相似的向量:

SET enable_seqscan = OFF;

SELECT id, embedding
FROM items
ORDER BY embedding <-> '[3, 3, 3]'
LIMIT 1;

通过禁用顺序扫描并使用索引,查询性能将大幅提升。

总结

通过本文,你学习了如何通过 Docker 快速体验带有 pgvector 插件的 PostgreSQL ,并掌握了 pgvector 插件的基础操作,包括创建向量表、插入向量数据、进行向量相似性检索以及通过索引优化查询性能。

pgvector 使得 PostgreSQL 成为向量数据存储和检索的强大工具,尤其适用于机器学习和数据挖掘的相关场景。在实际项目中,通过 pgvector 你可以轻松构建图像检索、推荐系统、文本检索等应用,充分利用 PostgreSQL 的扩展性与灵活性。

文章来自个人专栏
javassss
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0