Supabase AI Stack 2026:pgvector + Edge Functions + 实时流式传输
使用用户级RAG、Edge Functions和流式传输构建全栈AI应用
Supabase AI Stack 2026:pgvector + Edge Functions + 实时流式传输
使用用户级RAG、Edge Functions和流式传输构建全栈AI应用
完整的Supabase AI教程。pgvector用于语义搜索,Edge Functions用于AI推理,实时流式传输,行级安全策略实现用户级RAG,以及一个Next.js聊天组件。
Supabase AI Stack 2026:pgvector + Edge Functions + 实时流式传输
Supabase 为生产级 AI 提供了一切:pgvector、Edge Functions、认证和实时功能,全部集成在一个平台中。
为什么选择 Supabase 做 AI?
使用 pgvector 的数据库模式
sql
CREATE EXTENSION IF NOT EXISTS vector;CREATE TABLE documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
content TEXT NOT NULL,
embedding vector(1536),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
CREATE POLICY user_owns ON documents USING (auth.uid() = user_id);
Edge Function(AI + 流式传输)
typescript
// supabase/functions/chat/index.ts
import { serve } from 'https://deno.land/std@0.208.0/http/server.ts';
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';
import OpenAI from 'https://esm.sh/openai@4';const openai = new OpenAI({ apiKey: Deno.env.get('OPENAI_API_KEY') });
serve(async (req) => {
const { question } = await req.json();
const sb = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_ANON_KEY')!,
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
);
const { data: { user } } = await sb.auth.getUser();
if (!user) return new Response('Unauthorized', { status: 401 });
const emb = await openai.embeddings.create({ model: 'text-embedding-3-small', input: question });
const embedding = emb.data[0].embedding;
const { data: docs } = await sb.rpc('match_docs', { query_embedding: embedding, count: 5 });
const ctx = docs?.map((d: any) => d.content).join('\n\n') || '';
const stream = await openai.chat.completions.create({
model: 'gpt-4o-mini', stream: true,
messages: [
{ role: 'system', content: 'Answer using context:\n\n' + ctx },
{ role: 'user', content: question }
]
});
const enc = new TextEncoder();
const body = new ReadableStream({
async start(ctrl) {
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content || '';
ctrl.enqueue(enc.encode('data: ' + JSON.stringify({ text }) + '\n\n'));
}
ctrl.close();
}
});
return new Response(body, { headers: { 'Content-Type': 'text/event-stream' } });
});
Next.js 聊天 UI
tsx
'use client'
import { createClient } from '@/utils/supabase/client'
import { useState } from 'react'export function Chat() {
const [msgs, setMsgs] = useState<{role: string; content: string}[]>([])
const [input, setInput] = useState('')
const sb = createClient()
async function send() {
const q = input
setInput('')
setMsgs(p => [...p, {role: 'user', content: q}])
const { data: { session } } = await sb.auth.getSession()
const res = await fetch(
process.env.NEXT_PUBLIC_SUPABASE_URL + '/functions/v1/chat',
{
method: 'POST',
headers: { Authorization: 'Bearer ' + session?.access_token },
body: JSON.stringify({ question: q })
}
)
const reader = res.body!.getReader()
let ai = ''
setMsgs(p => [...p, {role: 'assistant', content: ''}])
while (true) {
const { done, value } = await reader.read()
if (done) break
for (const line of new TextDecoder().decode(value).split('\n').filter(l => l.startsWith('data: '))) {
ai += JSON.parse(line.slice(6)).text
setMsgs(p => [...p.slice(0, -1), {role: 'assistant', content: ai}])
}
}
}
return (
{msgs.map((m, i) => {m.role}: {m.content}
)}
setInput(e.target.value)} />
)
}
结论
Supabase 是构建生产级 AI 应用的最快路径,集成了认证、用户级搜索和流式传输。pgvector + Edge Functions + RLS 全部在一个平台中。
相关教程
Supabase与pgvector完整集成指南
无需额外基础设施,为 PostgreSQL 数据库添加语义搜索以支持 RAG
逐步指南:构建一个包含身份验证、用量限制、订阅计费和 AI 功能的生产级 AI SaaS 应用
使用现代 Python AI 栈构建生产级 AI 应用
构建生产级检索增强生成系统,实现大规模向量搜索
使用 TypeScript 和 Vercel AI SDK 在 Next.js 中构建流式 AI 聊天界面、结构化输出和智能体工作流