在当今的数据驱动世界中,智能搜索功能变得越来越重要。本文将介绍如何使用Supabase,一个开源的Firebase替代品,结合pgvector扩展和Postgres数据库,来构建一个强大的向量存储系统,支持自然语言的语义搜索。
1. 引言
Supabase是一个开源的Firebase替代品,提供实时的Postgres数据库、身份验证和文件存储等功能。通过集成pgvector扩展,Supabase可以用于处理高维向量数据,这对于实现向量搜索功能非常有用。本文将介绍如何在Supabase中使用pgvector来创建向量存储,并进行相似度搜索。
2. 主要内容
2.1 设置环境
要开始使用Supabase进行向量存储,首先需要在Postgres数据库中启用pgvector扩展。以下是一些基本步骤:
-- 启用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嵌入,可以根据需要更改
);
2.2 创建匹配文档函数
接下来,我们创建一个Postgres函数,用于计算向量的余弦相似度:
-- 创建用于搜索文档的函数
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;
$$;
3. 代码示例
以下是一个集成Supabase和OpenAI的Python代码示例,展示了如何进行相似度搜索:
import os
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import Client, create_client
# 使用API代理服务提高访问稳定性
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase: Client = create_client(supabase_url, supabase_key)
embeddings = OpenAIEmbeddings()
# 从文档创建向量存储
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)
4. 常见问题和解决方案
- 网络不稳定:某些地区对API访问有限制,建议使用API代理服务来提高访问稳定性。
- 大数据量处理:对于大量数据,建议对chunk_size逐步调整,以适应不同的系统性能。
5. 总结和进一步学习资源
通过结合Supabase和pgvector,我们能够非常方便地实现一个强大的自然语言处理搜索系统。推荐阅读Supabase和Postgres的官方文档以深入理解其功能:
6. 参考资料
- Supabase 官方文档
- Postgres 官方文档
- Langchain 社区资源
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---