数据库

pgvector: 嵌入向量与向量相似度


pgvector 是一个用于向量相似性搜索的Postgres扩展。它也可以用于存储嵌入向量

了解更多关于Supabase的AI与向量功能。

核心概念

向量相似性

向量相似性是指衡量两个相关项目相似程度的指标。例如,如果您有一个产品列表,可以使用向量相似性来查找相似产品。为此,您需要使用数学模型将每个产品转换为数字"向量"。同样的模型可以应用于文本、图像和其他类型的数据。一旦所有这些向量存储在数据库中,就可以使用向量相似性来查找相似项目。

嵌入向量

这在基于OpenAI的GPT-3构建应用时特别有用。您可以创建和存储嵌入向量用于检索增强生成。

使用方法

启用扩展

  1. 进入仪表盘的数据库页面
  2. 在侧边栏点击扩展
  3. 搜索"vector"并启用该扩展

使用方法

创建存储向量的表

1
2
3
4
5
6
create table posts ( id serial primary key, title text not null, body text not null, embedding vector(384));

存储向量/嵌入

在这个示例中,我们将使用Transformer.js生成向量,然后通过Supabase客户端将其存储到数据库中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { pipeline } from '@xenova/transformers'const generateEmbedding = await pipeline('feature-extraction', 'Supabase/gte-small')const title = 'First post!'const body = 'Hello world!'// 使用Transformers.js生成向量const output = await generateEmbedding(body, { pooling: 'mean', normalize: true,})// 提取嵌入输出const embedding = Array.from(output.data)// 将向量存储到Postgres中const { data, error } = await supabase.from('posts').insert({ title, body, embedding,})

特定使用场景

带过滤条件的查询

如果您使用 IVFFlat 或 HNSW 索引,并简单地根据另一列的值过滤结果,可能会返回比请求数量更少的行。

例如,以下查询可能返回少于 5 行,即使数据库中存在 5 条符合条件的记录。这是因为嵌入索引可能无法返回足够数量满足过滤条件的行。

1
SELECT * FROM items WHERE category_id = 123 ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

要获取确切数量的请求行,可以使用迭代搜索继续扫描索引,直到找到足够的结果。

更多 pgvector 和 Supabase 资源