pgvector: 嵌入向量与向量相似度
pgvector 是一个用于向量相似性搜索的Postgres扩展。它也可以用于存储嵌入向量。
pgvector的Postgres扩展名是vector。
了解更多关于Supabase的AI与向量功能。
核心概念
向量相似性
向量相似性是指衡量两个相关项目相似程度的指标。例如,如果您有一个产品列表,可以使用向量相似性来查找相似产品。为此,您需要使用数学模型将每个产品转换为数字"向量"。同样的模型可以应用于文本、图像和其他类型的数据。一旦所有这些向量存储在数据库中,就可以使用向量相似性来查找相似项目。
嵌入向量
这在基于OpenAI的GPT-3构建应用时特别有用。您可以创建和存储嵌入向量用于检索增强生成。
使用方法
启用扩展
- 进入仪表盘的数据库页面
- 在侧边栏点击扩展
- 搜索"vector"并启用该扩展
使用方法
创建存储向量的表
123456create table posts ( id serial primary key, title text not null, body text not null, embedding vector(384));
存储向量/嵌入
在这个示例中,我们将使用Transformer.js生成向量,然后通过Supabase客户端将其存储到数据库中。
123456789101112131415161718192021import { 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 条符合条件的记录。这是因为嵌入索引可能无法返回足够数量满足过滤条件的行。
1SELECT * FROM items WHERE category_id = 123 ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
要获取确切数量的请求行,可以使用迭代搜索继续扫描索引,直到找到足够的结果。