SupabaseVectorStore
Supabase 是一个开源的 Firebase 替代品。 Supabase 构建于 PostgreSQL 之上,PostgreSQL 提供了强大的 SQL 查询功能,并可以与现有的工具和框架进行简单的接口连接。
LangChain.js 支持使用 Supabase Postgres 数据库作为向量存储,使用 pgvector
扩展。 有关更多信息,请参阅 Supabase 博客文章。
本指南提供了 Supabase 向量存储入门的快速概述。 有关所有 SupabaseVectorStore
功能和配置的详细文档,请访问 API 参考。
概述
集成详情
类 | 包 | PY 支持 | 最新包 |
---|---|---|---|
SupabaseVectorStore | @langchain/community | ✅ | ![]() |
设置
要使用 Supabase 向量存储,您需要设置一个 Supabase 数据库并安装 @langchain/community
集成包。 您还需要安装官方的 @supabase/supabase-js
SDK 作为对等依赖项。
本指南还将使用 OpenAI 嵌入,这需要您安装 @langchain/openai
集成包。 如果您愿意,也可以使用其他支持的嵌入模型。
有关安装集成包的通用说明,请参阅此部分。
- npm
- yarn
- pnpm
npm i @langchain/community @langchain/core @supabase/supabase-js @langchain/openai
yarn add @langchain/community @langchain/core @supabase/supabase-js @langchain/openai
pnpm add @langchain/community @langchain/core @supabase/supabase-js @langchain/openai
创建数据库后,运行以下 SQL 来设置 pgvector
并创建必要的表和函数
-- Enable the pgvector extension to work with embedding vectors
create extension vector;
-- Create a table to store your documents
create table documents (
id bigserial primary key,
content text, -- corresponds to Document.pageContent
metadata jsonb, -- corresponds to Document.metadata
embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);
-- Create a function to search for documents
create function match_documents (
query_embedding vector(1536),
match_count int DEFAULT null,
filter jsonb DEFAULT '{}'
) returns table (
id bigint,
content text,
metadata jsonb,
embedding jsonb,
similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
return query
select
id,
content,
metadata,
(embedding::text)::jsonb as embedding,
1 - (documents.embedding <=> query_embedding) as similarity
from documents
where metadata @> filter
order by documents.embedding <=> query_embedding
limit match_count;
end;
$$;
凭证
完成此操作后,设置 SUPABASE_PRIVATE_KEY
和 SUPABASE_URL
环境变量
process.env.SUPABASE_PRIVATE_KEY = "your-api-key";
process.env.SUPABASE_URL = "your-supabase-db-url";
如果您在本指南中使用 OpenAI 嵌入,则还需要设置您的 OpenAI 密钥
process.env.OPENAI_API_KEY = "YOUR_API_KEY";
如果您想获得模型调用的自动跟踪,您还可以通过取消注释下方内容来设置您的 LangSmith API 密钥
// process.env.LANGSMITH_TRACING="true"
// process.env.LANGSMITH_API_KEY="your-api-key"
实例化
import { SupabaseVectorStore } from "@langchain/community/vectorstores/supabase";
import { OpenAIEmbeddings } from "@langchain/openai";
import { createClient } from "@supabase/supabase-js";
const embeddings = new OpenAIEmbeddings({
model: "text-embedding-3-small",
});
const supabaseClient = createClient(
process.env.SUPABASE_URL,
process.env.SUPABASE_PRIVATE_KEY
);
const vectorStore = new SupabaseVectorStore(embeddings, {
client: supabaseClient,
tableName: "documents",
queryName: "match_documents",
});
管理向量存储
向向量存储添加项目
import type { Document } from "@langchain/core/documents";
const document1: Document = {
pageContent: "The powerhouse of the cell is the mitochondria",
metadata: { source: "https://example.com" },
};
const document2: Document = {
pageContent: "Buildings are made out of brick",
metadata: { source: "https://example.com" },
};
const document3: Document = {
pageContent: "Mitochondria are made out of lipids",
metadata: { source: "https://example.com" },
};
const document4: Document = {
pageContent: "The 2024 Olympics are in Paris",
metadata: { source: "https://example.com" },
};
const documents = [document1, document2, document3, document4];
await vectorStore.addDocuments(documents, { ids: ["1", "2", "3", "4"] });
[ 1, 2, 3, 4 ]
从向量存储删除项目
await vectorStore.delete({ ids: ["4"] });
查询向量存储
创建向量存储并添加相关文档后,您很可能希望在链或 Agent 运行时查询它。
直接查询
可以按如下方式执行简单的相似性搜索
const filter = { source: "https://example.com" };
const similaritySearchResults = await vectorStore.similaritySearch(
"biology",
2,
filter
);
for (const doc of similaritySearchResults) {
console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
}
* The powerhouse of the cell is the mitochondria [{"source":"https://example.com"}]
* Mitochondria are made out of lipids [{"source":"https://example.com"}]
如果您想执行相似性搜索并接收相应的分数,您可以运行
const similaritySearchWithScoreResults =
await vectorStore.similaritySearchWithScore("biology", 2, filter);
for (const [doc, score] of similaritySearchWithScoreResults) {
console.log(
`* [SIM=${score.toFixed(3)}] ${doc.pageContent} [${JSON.stringify(
doc.metadata
)}]`
);
}
* [SIM=0.165] The powerhouse of the cell is the mitochondria [{"source":"https://example.com"}]
* [SIM=0.148] Mitochondria are made out of lipids [{"source":"https://example.com"}]
元数据查询构建器过滤
您还可以使用查询构建器样式的过滤,类似于 Supabase JavaScript 库的工作方式,而不是传递对象。 请注意,由于大多数过滤器属性都在元数据列中,因此您需要使用箭头运算符(->用于整数或 ->>用于文本),如 Postgrest API 文档中所定义,并指定属性的数据类型(例如,列应类似于 metadata->some_int_prop_name::int
)。
import { SupabaseFilterRPCCall } from "@langchain/community/vectorstores/supabase";
const funcFilter: SupabaseFilterRPCCall = (rpc) =>
rpc.filter("metadata->>source", "eq", "https://example.com");
const funcFilterSearchResults = await vectorStore.similaritySearch(
"biology",
2,
funcFilter
);
for (const doc of funcFilterSearchResults) {
console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
}
* The powerhouse of the cell is the mitochondria [{"source":"https://example.com"}]
* Mitochondria are made out of lipids [{"source":"https://example.com"}]
通过转换为检索器进行查询
您还可以将向量存储转换为检索器,以便在您的链中更轻松地使用。
const retriever = vectorStore.asRetriever({
// Optional filter
filter: filter,
k: 2,
});
await retriever.invoke("biology");
[
Document {
pageContent: 'The powerhouse of the cell is the mitochondria',
metadata: { source: 'https://example.com' },
id: undefined
},
Document {
pageContent: 'Mitochondria are made out of lipids',
metadata: { source: 'https://example.com' },
id: undefined
}
]
用于检索增强生成
有关如何使用此向量存储进行检索增强生成 (RAG) 的指南,请参阅以下部分
API 参考
有关所有 SupabaseVectorStore
功能和配置的详细文档,请访问 API 参考。