技术背景介绍
Supabase 是一个开源的 Firebase 替代品,建立在 PostgreSQL 数据库管理系统的基础上。我们可以利用 Supabase 和 pgvector 扩展来存储和检索向量嵌入,从而实现基于向量的检索增强生成(Retrieval-Augmented Generation,RAG)。这种方法可以将外部知识与生成模型相结合,生成更有针对性的回答。
核心原理解析
RAG的核心思想是对输入问题生成相应的嵌入向量,然后在向量数据库中进行向量匹配,检索最相关的文档,再将这些文档作为上下文输入给生成模型,从而生成更为精准的答案。Supabase 使用 pgvector 扩展来存储和索引嵌入向量,是实现 RAG 的理想工具。
代码实现演示
环境配置
首先,我们需要设置环境变量来访问 OpenAI 模型和 Supabase 服务。
- 获取
OPENAI_API_KEY
- 获取
SUPABASE_URL
和SUPABASE_SERVICE_KEY
在终端中设置这些环境变量:
export SUPABASE_URL=<your-supabase-url>
export SUPABASE_SERVICE_KEY=<your-supabase-service-key>
export OPENAI_API_KEY=<your-openai-api-key>
Supabase 数据库设置
如果你还没有设置 Supabase 数据库,可以按如下步骤操作:
- 访问 Supabase 以创建一个新的数据库。
- 在你的 Supabase 控制台中,打开 SQL 编辑器,运行以下脚本以启用 pgvector 并设置文档表:
-- Enable the pgvector extension to work with embedding vectors
create extension if not exists vector;
-- Create a table to store your documents
create table
documents (
id uuid primary key,
content text, -- corresponds to Document.pageContent
metadata jsonb, -- corresponds to Document.metadata
embedding vector (1536) -- 1536 works for OpenAI embeddings, change as needed
);
-- Create a function to search for documents
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:
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")
启动 LangServe 实例
在项目根目录下运行以下命令启动 LangServe 实例:
langchain serve
测试 RAG 功能
本地服务器会在 http://localhost:8000 启动,你可以在浏览器中访问以下端点:
- 接口文档: http://127.0.0.1:8000/docs
- RAG Playground: http://127.0.0.1:8000/rag-supabase/playground
我们还可以使用以下代码来从远程访问这个模板:
from langserve.client import RemoteRunnable
runnable = RemoteRunnable("http://localhost:8000/rag-supabase")
response = runnable.run({"query": "你的问题"})
print(response)
应用场景分析
这种 RAG 方法可以应用于各种场景,例如:
- 客服系统:为了回答复杂问题,使用知识库来补充生成模型。
- 搜索引擎:根据用户查询检索相关文档并生成简洁答案。
- 教育平台:为学生的问题提供详细确切的答案。
实践建议
- 确保你的文档数据库丰富且更新及时,以保证生成内容的准确性。
- 对用于生成嵌入的模型进行微调,以适应特定领域的应用场景。
- 定期评估并优化向量搜索功能,以提高检索效率和准确性。
如果遇到问题欢迎在评论区交流。
—END—