pgvector:嵌入和向量相似性
pgvector 是一个用于向量相似性搜索的 Postgres 扩展。它也可以用于存储 嵌入向量。
pgvector 的 Postgres 扩展名称是 vector。
了解更多关于 Supabase 的 AI 和向量 产品。
概念#
向量相似性#
向量相似性指的是衡量两个相关项目之间相似性的指标。例如,如果您有一个产品列表,可以使用向量相似性来查找相似的产品。为此,您需要使用数学模型将每个产品转换为数字的“向量”。您可以对文本、图像和其他类型的数据使用类似的模型。一旦所有这些向量都存储在数据库中,您就可以使用向量相似性来查找相似的项目。
嵌入向量#
如果您正在构建使用大型语言模型的 AI 应用程序,这将特别有用。您可以创建和存储 嵌入向量,用于检索增强生成 (RAG)。
用法#
启用扩展#
- 转到仪表板中的 数据库 页面。
- 在侧边栏中单击 扩展。
- 搜索 "vector" 并启用该扩展。
用法#
创建表来存储向量#
1create 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 客户端将其存储在数据库中。
1import { pipeline } from '@xenova/transformers'2const generateEmbedding = await pipeline('feature-extraction', 'Supabase/gte-small')34const title = 'First post!'5const body = 'Hello world!'67// Generate a vector using Transformers.js8const output = await generateEmbedding(body, {9 pooling: 'mean',10 normalize: true,11})1213// Extract the embedding output14const embedding = Array.from(output.data)1516// Store the vector in Postgres17const { data, error } = await supabase.from('posts').insert({18 title,19 body,20 embedding,21})特定用例#
带有过滤器的查询#
如果您使用 IVFFlat 或 HNSW 索引并简单地根据另一个列的值过滤结果,您可能会获得比请求的行数更少的行。
例如,以下查询可能返回少于 5 行,即使数据库中存在 5 个对应的行。这是因为嵌入索引可能不会返回与过滤器匹配的 5 行。
1SELECT * FROM items WHERE category_id = 123 ORDER BY embedding <-> '[3,1,2]' LIMIT 5;要获得请求的确切行数,请使用 迭代搜索 继续扫描索引,直到找到足够的结果。