基于RDS Supabase构建Agentic RAG应用:高效开发AI智能系统
通过全托管PostgreSQL与Supabase能力,实现知识处理与智能决策一体化的快速落地
本文介绍如何利用云数据库RDS PostgreSQL全托管Supabase服务,快速构建具备知识处理与智能决策能力的Agentic RAG应用。从数据准备到部署上线,全流程开发效率显著提升,适用于企业级AI应用创新场景。
前言
云数据库RDS PostgreSQL全托管Supabase服务,正在成为AI应用开发的新范式。相比传统架构,其一体化服务能力大幅缩短开发周期,并在成本、可扩展性方面展现出显著优势。
- 开发部署效率:传统应用多层耦合,开发周期以月计;RDS Supabase提供开箱即用的一体化后端能力,支持天级部署上线。
- 成本优化:全托管模式降低资源与人力维护成本,综合开销可减少50%以上。
- 可扩展性:基于PostgreSQL插件生态和Serverless弹性架构,轻松应对业务流量增长。
什么是Supabase?
Supabase是开源的后端即服务(BaaS)平台,基于PostgreSQL构建,旨在替代Firebase等商业方案。它整合多个开源框架,提供API化的数据库管理、用户认证、对象存储及实时通信能力,极大简化全栈开发流程,避免复杂基础设施维护问题。
Supabase适用场景
Supabase集成数据库、认证、存储和实时通信等核心功能,实现“开发即交付”的MVP快速验证模式。开发者可快速搭建产品原型,显著降低试错成本,适用于初创项目及企业创新探索。
Supabase核心能力
Supabase提供认证、数据库管理、实时通信和对象存储四大核心能力,全面支撑现代应用开发需求。
认证 & 用户管理 (Auth)
- 用户管理:支持注册、注销、角色管理及匿名用户机制。
- 认证授权:通过GoTrue实现邮箱密码、手机登录、无密码登录、SSO及OAuth(支持GitHub、Google等第三方平台)。
- 会话控制:基于JWT实现细粒度权限管理。
- 安全隔离:用户角色与PostgreSQL行级安全策略(RLS)绑定,确保数据访问隔离,如“仅查看本人任务”。
数据库管理 (REST & GraphQL)
Supabase通过RESTful和GraphQL接口直接操作数据库对象,无需额外开发DAO层,大幅提升开发效率。
- RESTful接口:基于PostgREST实现API到SQL自动转换,内置连接池保障高并发稳定性。
- GraphQL支持:通过pg_graphql插件提供灵活查询能力,返回结构化JSONB格式数据。
例如,创建messages表后,系统自动生成/rest/v1/messages端点,支持增删改查操作。
实时通信(Realtime)
基于WebSocket协议和PostgreSQL逻辑复制机制,Realtime组件可监听数据变更并实时推送至客户端,适用于聊天应用、协作工具等高交互场景。
当用户A发送消息时,所有订阅该频道的设备(如用户B)将即时收到更新,无需轮询。
Storage(兼容S3的对象存储)
封装兼容S3标准的OSS接口,利用PostgreSQL存储Bucket与文件元信息,并结合Auth的RLS策略实现细粒度访问控制。
RDS Supabase:全托管+BaaS企业级解决方案
RDS Supabase是基于阿里云RDS PostgreSQL的全托管Supabase平台,融合BaaS服务与企业级数据库能力,提供免运维、高可用、易扩展的后端架构,加速AI应用上线进程。
整体架构
RDS Supabase增强能力
基于阿里云RDS PostgreSQL构建,100%兼容开源Supabase,支持通过控制台或OpenAPI进行实例管理,在性能、弹性、容灾和AI能力上实现全面增强。
性能优化
RDS PostgreSQL在计算与存储层均支持弹性扩展:
- 传统Serverless:适用于开发测试或流量波动大的场景,按需自动扩缩容。
- 承诺型Serverless:采用“急弹缓降+本地扩容”策略,确保业务无损:
- 性能兜底保障核心业务稳定。
- 突破I/O瓶颈,单实例吞吐可达4GB/s。
- 动态资源池化提升资源利用率与响应速度。
容灾能力
开放物理复制权限,结合云盘快照与全托管CEN网络,支持一键跨Region容灾、云上云下同步及PITR恢复,满足不同RTO/RPO要求,保障数据安全。
AI增强能力
RDS PostgreSQL提供100+可扩展插件,支持构建GraphRAG、知识库混合搜索等AI应用:
- 通过
pgvector实现向量检索。 - 集成
Apache Age支持图数据库。 - 使用
RUM优化全文检索。
针对高维大数据集场景,传统ivfflat与HNSW索引表现不佳,RDS引入开源disk_ann索引,在保证精度前提下显著提升构建速度与空间效率;结合承诺型Serverless与高性能云盘,进一步加速向量查询性能。
实战:构建简易Agentic RAG应用
项目背景
本项目演示如何基于RDS Supabase与LangChain快速搭建Agentic RAG系统,实现知识处理与智能决策闭环。
核心能力
知识处理链路
- 向量化:使用DashScope Embedding将PDF/Word文档转换为向量。
- 向量存储:依托RDS Supabase + pgvector构建高性能向量数据库。
- 智能决策:通过LangChain的tool_call机制动态调度检索-生成流程。
对话交互系统
- 大模型驱动:集成通义千问实现自然语言理解与生成。
- 会话管理:采用Streamlit框架维护上下文状态,支持多轮对话。
该类Agentic RAG应用广泛适用于智能客服、企业知识库、自动化报告生成等实际场景。
基于RDS Supabase构建智能问答系统:快速实现PDF/Word语义检索
通过阿里云RDS与DashScope集成,高效部署支持多模态内容处理的Agentic RAG应用
- 企业知识库问答:构建支持PDF/Word文档语义检索的智能助手;
- 医疗健康咨询:基于专业医学文献提供个性化健康建议;
- 多模态客服系统:结合Qwen多模态能力,处理图文混合咨询场景。
该方案支持开发者在RDS控制台完成从数据准备到应用部署的全流程,显著提升开发效率。
操作步骤
- 登录云数据库RDS控制台,创建RDS Supabase实例;
- 安装vector插件并建表,启用PostgreSQL的向量处理能力:
-- 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 if 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 formula-0;
- 配置环境变量:
DASHSCOPE_API_KEY = "sk-*****"
SUPABASE_URL = "http://*.*.*.*:*"
SUPABASE_SERVICE_KEY = "eyJhbGc****BBNWN8Bu4GE"
- 对documents/目录下的PDF文件进行Embedding处理,并将结果存入Supabase:
import os
from dotenv import load_dotenv
# import langchain
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_community.embeddings.dashscope import DashScopeEmbeddings
# import supabase
from supabase import create_client, Client
# 加载环境变量
load_dotenv()
# 获取配置
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
# 简化初始化
supabase: Client = create_client(supabase_url, supabase_key)
# initiate embeddings model
embeddings = DashScopeEmbeddings(model="text-embedding-v2", dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
# load pdf docs from folder 'documents'
loader = PyPDFDirectoryLoader("documents")
# split the documents in multiple chunks
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
docs = text_splitter.split_documents(documents)
# store chunks in vector store
vector_store = SupabaseVectorStore.from_documents(
docs,
embeddings,
client=supabase,
table_name="documents",
query_name="match_documents",
chunk_size=1000,
)
- 构建Agentic RAG系统,使用Qwen作为对话大模型进行单次问答:
# import basics
import os
from dotenv import load_dotenv
from langchain.agents import AgentExecutor
from langchain.agents import create_tool_calling_agent
from langchain_community.vectorstores import SupabaseVectorStore
from langchain import hub
from supabase.client import Client, create_client
from langchain_core.tools import tool
from langchain_community.embeddings.dashscope import DashScopeEmbeddings
from langchain_community.chat_models.tongyi import ChatTongyi
# load environment variables
load_dotenv()
# initiate supabase database
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase: Client = create_client(supabase_url, supabase_key)
# initiate embeddings model
embeddings = DashScopeEmbeddings(model="text-embedding-v2", dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
# initiate vector store
vector_store = SupabaseVectorStore(
embedding=embeddings,
client=supabase,
table_name="documents",
query_name="match_documents",
)
# initiate large language model (temperature = 0)
llm = ChatTongyi(streaming=True)
# fetch the prompt from the prompt hub
prompt = hub.pull("hwchase17/openai-functions-agent")
# create the tools
@tool(response_format="content_and_artifact")
def retrieve(query: str):
"""Retrieve information related to a query."""
retrieved_docs = vector_store.similarity_search(query, k=2)
serialized = "\n\n".join(
(f"Source: {doc.metadata}\n" f"Content: {doc.page_content}")
for doc in retrieved_docs
)
return serialized, retrieved_docs
# combine the tools and provide to the llm
tools = [retrieve]
agent = create_tool_calling_agent(llm, tools, prompt)
# create the agent executor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# invoke the agent
response = agent_executor.invoke({"input": "why is agentic rag better than naive rag?"})
# put the result on the screen
print(response["output"])
基于Streamlit构建支持会话的智能RAG聊天机器人
结合Supabase向量库与LangChain实现实时多轮对话
通过Streamlit维护会话状态,开发者可快速搭建具备多轮对话能力的Agentic RAG聊天机器人。
streamlit run agentic_rag_streamlit.py
核心实现流程包括:加载环境变量,初始化Supabase客户端及DashScope嵌入模型,构建基于Supabase的向量存储,并集成ChatTongyi大语言模型。通过LangChain框架调用预设Prompt模板("hwchase17/openai-functions-agent"),创建具备工具调用能力的Agent,结合自定义的检索工具实现知识库查询。
系统采用SupabaseVectorStore进行相似性搜索,返回Top 2相关文档并格式化输出源信息与内容。聊天界面通过Streamlit构建,自动管理用户与AI消息的历史记录(st.session_state.messages),支持持续对话。
每轮交互中,用户输入触发Agent执行流程,结合聊天历史调用agent_executor.invoke生成响应,并将人机双方消息持续追加至会话状态,实现上下文连贯的交互体验。
该架构有效融合RDS、Supabase与AI模型能力,显著降低AI应用开发成本,提升构建效率,推动“代码即基础设施”理念落地。

