SupabaseVectorStore
Supabase 是一款开源的 Firebase 替代品。Supabase 基于 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 @supabase/supabase-js @langchain/openai
yarn add @langchain/community @supabase/supabase-js @langchain/openai
pnpm add @langchain/community @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.LANGCHAIN_TRACING_V2="true"
// process.env.LANGCHAIN_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"] });
查询向量存储
创建向量存储并添加相关文档后,您可能希望在运行您的链或代理时查询它。
直接查询
可以执行以下操作进行简单的相似性搜索
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 库 的查询构建器风格过滤,而不是传递一个对象。请注意,由于大多数过滤属性都在 metadata 列中,因此您需要使用箭头运算符 (->对于整数或 ->>对于文本) 就像在 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 参考。