数据库

pgvector:嵌入和向量相似性


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

了解更多关于 Supabase 的 AI 和向量 产品。

概念#

向量相似性#

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

嵌入向量#

如果您正在构建使用大型语言模型的 AI 应用程序,这将特别有用。您可以创建和存储 嵌入向量,用于检索增强生成 (RAG)。

用法#

启用扩展#

  1. 转到仪表板中的 数据库 页面。
  2. 在侧边栏中单击 扩展
  3. 搜索 "vector" 并启用该扩展。

用法#

创建表来存储向量#

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

存储向量 / 嵌入向量#

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

1
import { pipeline } from '@xenova/transformers'
2
const generateEmbedding = await pipeline('feature-extraction', 'Supabase/gte-small')
3
4
const title = 'First post!'
5
const body = 'Hello world!'
6
7
// Generate a vector using Transformers.js
8
const output = await generateEmbedding(body, {
9
pooling: 'mean',
10
normalize: true,
11
})
12
13
// Extract the embedding output
14
const embedding = Array.from(output.data)
15
16
// Store the vector in Postgres
17
const { data, error } = await supabase.from('posts').insert({
18
title,
19
body,
20
embedding,
21
})

特定用例#

带有过滤器的查询#

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

例如,以下查询可能返回少于 5 行,即使数据库中存在 5 个对应的行。这是因为嵌入索引可能不会返回与过滤器匹配的 5 行。

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

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

更多 pgvector 和 Supabase 资源#