探索 RAG 与 Supabase:轻松实现智能文档检索

180 阅读3分钟

引言

近年来,随着深度学习技术的进步,基于嵌入技术的文档检索(Retriever-Augmented Generation, RAG)成为了一个热门话题。Supabase 作为一个开源的 Firebase 替代方案,与 PostgreSQL 相结合,为实现这种智能文档检索提供了一个理想的解决方案。本文将详细介绍如何利用 Supabase 和 OpenAI 嵌入模型来设置和使用 RAG 系统。

主要内容

Supabase 概述

Supabase 是一个基于 PostgreSQL 的开源实时数据库平台,可以作为 Firebase 的替代。它提供了全面的数据库管理功能和实时同步能力,使得开发者可以快速构建强大的数据库应用。

环境设置

配置 API 密钥

要访问 OpenAI 模型,我们首先需要设置 OPENAI_API_KEY 环境变量。在你的 OpenAI 帐户下获取 API 密钥并设置如下:

export OPENAI_API_KEY=<your-openai-api-key>

同样,获取你的 Supabase 项目的 SUPABASE_URLSUPABASE_SERVICE_KEY

export SUPABASE_URL=<your-supabase-url>
export SUPABASE_SERVICE_KEY=<your-supabase-service-key>

初始化 Supabase 数据库

通过以下步骤来设置你的 Supabase 数据库:

  1. 访问 database.new 来初始化你的 Supabase 数据库。

  2. 打开 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;
$$;

使用 LangChain

安装 LangChain CLI:

pip install -U langchain-cli

创建一个新的 LangChain 项目:

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

server.py 文件中添加以下代码来集成 RAG:

from rag_supabase.chain import chain as rag_supabase_chain

add_routes(app, rag_supabase_chain, path="/rag-supabase")

代码示例

以下是一个简单的代码示例,展示如何使用 Supabase 和 OpenAI 来实现文档检索:

from langserve.client import RemoteRunnable

runnable = RemoteRunnable("http://localhost:8000/rag-supabase") # 使用API代理服务提高访问稳定性

# 假设我们要查找与某个查询向量相匹配的文档
query_embedding = get_query_embedding("你的查询内容")
results = runnable.run({
    "query_embedding": query_embedding
})

for result in results:
    print(f"文档ID: {result['id']}, 相似性: {result['similarity']}")

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,可能无法直接访问 OpenAI API。解决方案是使用代理服务以提高 API 访问的稳定性。

  2. 向量维度不匹配:确保数据库中设置的向量维度与 OpenAI 提供的嵌入维度一致。

  3. API 密钥泄漏风险:始终确保环境变量的保密性,不要将敏感信息写入版本控制系统。

总结和进一步学习资源

本文探讨了如何利用 Supabase 和 OpenAI 来实现 RAG 系统。通过结合这两个强大的工具,你可以构建具有智能文档检索能力的应用程序。以下是一些推荐的学习资源:

参考资料

  1. Supabase 官方文档
  2. OpenAI API 参考文档
  3. LangChain GitHub 仓库

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

---END---