pgvector介绍:在PostgreSQL中使用向量相似性搜索
pgvector 介绍:在 PostgreSQL 中使用向量相似性搜索
在当今数据驱动的世界中,我们经常需要处理高维数据,例如图像、文本和音频。这些数据通常表示为向量,也称为嵌入。一个常见的任务是在大型向量数据集中找到与给定查询向量相似的向量。这就是向量相似性搜索发挥作用的地方。
pgvector 是一个开源的 PostgreSQL 扩展,它允许你在 PostgreSQL 中存储和查询向量数据,并执行高效的向量相似性搜索。它为 PostgreSQL 带来了强大的近似最近邻(ANN)搜索功能,使得在大型数据集中查找相似项变得轻而易举。
为什么使用 pgvector?
- 与 PostgreSQL 无缝集成: pgvector 作为一个扩展,可以轻松地集成到现有的 PostgreSQL 数据库中。这意味着你可以利用 PostgreSQL 的所有强大功能,如 ACID 属性、数据完整性和丰富的 SQL 语法,同时享受向量搜索带来的好处。
- 高效的相似性搜索: pgvector 实现了先进的索引技术,如 HNSW (Hierarchical Navigable Small World) 和 IVFFlat (Inverted File with Flat Indexing),以支持快速且准确的近似最近邻搜索。这些算法比暴力搜索快得多,特别是在处理大型数据集时。
- 支持多种距离度量: pgvector 支持常见的距离度量,包括:
- L2 距离 (欧几里得距离): 测量向量空间中两点之间的直线距离。
- 内积 (点积): 测量两个向量之间的角度相似性。当向量被归一化时,内积等价于余弦相似度。
- 余弦距离: 测量两个向量之间的角度,忽略它们的幅度。它在文本相似性等应用中非常有用。
- 易于使用: pgvector 提供了简单的 SQL 语法来创建、插入和查询向量数据。你可以使用熟悉的 SQL 语法来执行相似性搜索,并与其他表格数据进行联合查询。
- 开源和活跃开发: pgvector 是一个开源项目,拥有活跃的社区支持和持续的开发。
pgvector 的核心功能
- 向量数据类型: pgvector 引入了一个新的数据类型
vector
,用于存储向量数据。你可以定义向量的维度,例如vector(1024)
表示一个 1024 维的向量。 - 索引支持: pgvector 支持两种主要的索引类型:
- IVFFlat: 适用于中等规模数据集,提供良好的查询性能和准确性。
- HNSW: 适用于大规模数据集,提供极高的查询性能,但构建索引需要更长的时间。
- 运算符和函数: pgvector 提供了用于执行向量相似性搜索的运算符和函数:
<->
: 计算 L2 距离。<#>
: 计算负内积 (用于最大内积搜索)。<=>
: 计算余弦距离。inner_product(vector, vector)
:计算内积。l2_distance(vector, vector)
:计算 L2 距离。cosine_distance(vector, vector)
:计算余弦距离。
- 近似最近邻搜索: 使用
ORDER BY
子句和距离运算符来执行相似性搜索,并使用LIMIT
子句来限制返回的结果数量。
示例用法
以下是一些演示如何使用 pgvector 的示例:
1. 创建一个包含向量数据的表格:
```sql
CREATE EXTENSION IF NOT EXISTS vector; -- 启用 vector 扩展
CREATE TABLE items (
id SERIAL PRIMARY KEY,
name TEXT,
embedding vector(1536) -- 假设使用 OpenAI 的 1536 维嵌入
);
```
2. 插入一些向量数据:
sql
INSERT INTO items (name, embedding) VALUES
('Item 1', '[0.1, 0.2, 0.3, ..., 0.9]'),
('Item 2', '[0.2, 0.3, 0.4, ..., 0.1]'),
('Item 3', '[0.5, 0.1, 0.8, ..., 0.4]');
3. 创建索引 (例如 IVFFlat):
sql
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
-- 使用 L2 距离度量的 IVFFlat 索引,设置列表数量为 100
-- lists 的数量影响索引构建时间和查询准确性,需要根据数据集大小和性能要求进行调整
-- 构建索引之前可以对参数进行调整,通过以下命令可以查看
-- SHOW vector.lists;
-- SHOW vector.probes;
-- SET vector.lists = 100;
-- SET vector.probes = 10;
4. 执行相似性搜索 (查找与给定向量最相似的 3 个项目):
sql
SELECT id, name, embedding <-> '[0.15, 0.25, 0.35, ..., 0.85]' AS distance
FROM items
ORDER BY distance
LIMIT 3;
5. 使用HNSW索引
sql
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);
-- 使用 L2 距离度量的 HNSW 索引,设置 m 和 ef_construction 参数
-- 这些参数影响索引构建时间和查询准确性,需要根据数据集大小和性能要求进行调整
6. 联合查询
sql
-- 假设我们有一个products表,存储了产品ID和名称,还有一个product_embeddings表,存储了产品ID和对应的嵌入向量
SELECT p.name, (e.embedding <-> '[...]') AS distance
FROM products p
JOIN product_embeddings e ON p.id = e.product_id
ORDER BY distance
LIMIT 10;
应用场景
pgvector 可用于广泛的应用,包括:
- 图像搜索: 查找与给定图像相似的图像。
- 文本搜索: 查找与给定文本片段语义相似的文档。
- 推荐系统: 根据用户历史行为或物品相似性推荐商品或内容。
- 异常检测: 识别数据集中与正常模式不同的异常点。
- 生物信息学: 查找相似的 DNA 或蛋白质序列。
总结
pgvector 是一个强大的工具,它将向量相似性搜索的功能带入了 PostgreSQL。通过利用 PostgreSQL 的现有基础设施和 pgvector 的高效索引算法,你可以轻松地在应用程序中构建和部署向量搜索功能。如果你正在寻找一种在 PostgreSQL 中处理向量数据并执行相似性搜索的方法,那么 pgvector 绝对值得一试。
希望这篇文章能够帮助你了解 pgvector 及其在 PostgreSQL 中进行向量相似性搜索的应用!