利用Supabase和pgvector:构建强大的相似度搜索引擎
在当今数据驱动的世界中,快速而精确的文档检索变得至关重要。Supabase结合PostgreSQL和pgvector提供了一种强大的解决方案。本文旨在引导你通过简单的步骤使用Supabase和pgvector来实现文档的相似度搜索。
主要内容
Supabase和PostgreSQL的结合
Supabase是一个开源的Firebase替代解决方案,利用PostgreSQL作为其数据库引擎,后者以其强大的SQL查询能力和易于集成现有工具而闻名。通过pgvector扩展,Supabase可以高效地处理嵌入向量,从而实现快速的相似度搜索。
环境准备
在开始之前,需要确保以下几点:
- 已启用PostgreSQL的pgvector扩展。
- 安装了必要的软件包,包括
supabase-py和langchain-community。 - 数据库中创建了一个
match_documents函数用于执行相似度查询。 - 在
public模式下创建了一个类似如下结构的表:
-- 启用pgvector扩展来处理嵌入向量
create extension if not exists vector;
-- 创建存储文档的表
create table
documents (
id uuid primary key,
content text,
metadata jsonb,
embedding vector (1536)
);
-- 创建用于搜索文档的函数
create function match_documents (
query_embedding vector (1536),
filter jsonb default '{}'
) returns table (
id uuid,
content text,
metadata jsonb,
similarity float
) language plpgsql as $$
#variable_conflict use_column
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密钥和创建Supabase客户端
为了使用OpenAI的嵌入功能,我们需要获取API密钥。此外,还需要设置Supabase的URL和服务密钥。以下是如何通过环境变量配置:
import os
from dotenv import load_dotenv
load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") # 设置OpenAI API密钥
os.environ["SUPABASE_URL"] = os.getenv("SUPABASE_URL") # 设置Supabase URL
os.environ["SUPABASE_SERVICE_KEY"] = os.getenv("SUPABASE_SERVICE_KEY") # 设置Supabase服务密钥
from supabase.client import Client, create_client
from langchain_openai import OpenAIEmbeddings
supabase_url = os.environ["SUPABASE_URL"]
supabase_key = os.environ["SUPABASE_SERVICE_KEY"]
supabase: Client = create_client(supabase_url, supabase_key) # 使用API代理服务提高访问稳定性
embeddings = OpenAIEmbeddings()
数据加载和向量存储
首先需要加载数据并将其解析为适合存储的格式。接下来,我们将这些文档插入到数据库中,系统会自动为每个文档生成嵌入。
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
# 加载文档
loader = TextLoader("path/to/your/file.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 创建向量存储
from langchain_community.vectorstores import SupabaseVectorStore
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) # 输出与查询最相似的文档内容
常见问题和解决方案
挑战1:API访问不稳定
对于某些地区的开发者而言,访问外部API可能不稳定。建议使用API代理服务来提高访问的稳定性。
挑战2:查询性能
随着数据量的增加,查询性能可能下降。可以通过调整索引、优化查询函数来提高性能。
总结和进一步学习资源
通过本文的介绍,你应该已经了解如何通过Supabase和pgvector来实现文档的相似度检索。要掌握更多信息,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---