Yapay zeka uygulamaları geliştirirken en kritik bileşenlerden biri veri katmanıdır. Embedding'leri nerede saklayacaksın? Semantik aramayı nasıl yapacaksın? Geleneksel keyword arama ile vektör aramayı nasıl birleştireceksin? İşte Supabase, 2025 yılında $5 milyar değerlemeye ulaşarak bu soruların hepsine tek bir platformdan cevap veriyor. PostgreSQL üzerine inşa edilmiş bu açık kaynak platform, pgvector entegrasyonu ile AI-native bir altyapı sunuyor. Haydi, Supabase'in AI yeteneklerini, hybrid search mimarisini ve production'da nasıl kullanacağını derinlemesine inceleyelim.
💡 Not: Bu yazıdaki tüm kod örnekleri Supabase JS SDK v2.x ve pgvector 0.7+ ile test edilmiştir. Güncel API referansı için Supabase Docs adresini ziyaret edebilirsin. Açık kaynak repoyu GitHub üzerinden inceleyebilirsin.
İçindekiler
- Supabase Nedir ve Neden $5B?
- pgvector ile Vektör Arama
- Hybrid Search: BM25 + Vector
- Vector Buckets ve Büyük Ölçek
- postgres.new: Tarayıcıda PostgreSQL
- RAG Pipeline Oluşturma
- Firebase vs Supabase Karşılaştırma
- Hızlı Başlangıç: match_documents RPC
- Production Best Practices
- Sonuç ve Öneriler
Supabase Nedir ve Neden $5B?
Supabase, "açık kaynak Firebase alternatifi" sloganıyla 2020'de yola çıktı. Ancak 2025'e geldiğimizde Firebase'den çok daha fazlası oldu. PostgreSQL'in gücünü doğrudan kullanabilmen, Row Level Security (RLS) ile güvenlik, real-time subscriptions, Edge Functions ve en önemlisi pgvector ile AI-native vektör arama — bunların hepsi tek bir platformda.
Değerleme Yolculuğu
Yıl | Değerleme | Önemli Gelişme |
|---|---|---|
2020 | $6M (Seed) | İlk lansman, "Open Source Firebase" |
2021 | $116M (Series A) | Auth, Storage, Edge Functions |
2022 | $500M (Series B) | pgvector entegrasyonu, Realtime v2 |
2023 | $1B (Series C) | Vector columns, AI toolkit |
2024 | $2B | Branching, postgres.new |
2025 | $5B (Series D) | Hybrid Search, Vector Buckets, Enterprise |
Bu büyüme tesadüf değil. AI dalgası PostgreSQL tabanlı çözümlere olan talebi patlattı. Supabase, "her şeyi Postgres'te tut" felsefesiyle bu dalgayı mükemmel yakaladı. Detaylı yol haritası için Supabase Blog adresini takip edebilirsin.
Temel Mimari
Supabase'in arkasında tamamen açık kaynak bileşenler var:
- PostgreSQL — Ana veritabanı (pgvector, pg_bm25 extension'ları dahil)
- PostgREST — Otomatik REST API
- GoTrue — Authentication
- Realtime — WebSocket tabanlı real-time subscriptions
- Storage — S3 uyumlu dosya depolama
- Edge Functions — Deno tabanlı serverless fonksiyonlar
- pg_graphql — Otomatik GraphQL API
🔍 Pro Tip: Supabase'i sadece Firebase alternatifi olarak düşünme. pgvector + RLS + Edge Functions kombinasyonu, onu AI uygulamaları için ideal bir backend yapıyor. Firebase Advanced yazımızda Firebase'in güçlü yönlerini de incelemiştik.
pgvector ile Vektör Arama
pgvector, PostgreSQL'e vektör veri tipi ve benzerlik arama yetenekleri ekleyen bir extension. Supabase, bunu out-of-the-box olarak sunuyor.
Extension Kurulumu
sql
1-- Supabase Dashboard'dan veya SQL Editor'den2CREATE EXTENSION IF NOT EXISTS vector;3 4-- Vektör kolonu olan tablo oluştur5CREATE TABLE documents (6 id BIGSERIAL PRIMARY KEY,7 content TEXT NOT NULL,8 embedding VECTOR(1536), -- OpenAI text-embedding-3-small boyutu9 metadata JSONB DEFAULT '{}',10 created_at TIMESTAMPTZ DEFAULT NOW()11);12 13-- Performans için HNSW index14CREATE INDEX ON documents15 USING hnsw (embedding vector_cosine_ops)16 WITH (m = 16, ef_construction = 200);TypeScript ile Embedding Oluşturma ve Kaydetme
typescript
1import { createClient } from '@supabase/supabase-js';2import OpenAI from 'openai';3 4const supabase = createClient(5 process.env.SUPABASE_URL!,6 process.env.SUPABASE_ANON_KEY!7);8 9const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });10 11interface Document {12 id: number;13 content: string;14 embedding: number[];15 metadata: Record<string, unknown>;16 similarity?: number;17}18 19// Embedding oluştur ve kaydet20async function embedAndStore(content: string, metadata: Record<string, unknown>) {21 const embeddingResponse = await openai.embeddings.create({22 model: 'text-embedding-3-small',23 input: content,24 });25 26 const embedding = embeddingResponse.data[0].embedding;27 28 const { data, error } = await supabase29 .from('documents')30 .insert({31 content,32 embedding,33 metadata,34 })35 .select()36 .single();37 38 if (error) throw new Error(`Kayıt hatası: ${error.message}`);39 return data as Document;40}41 42// Semantik arama43async function semanticSearch(query: string, limit = 10): Promise<Document[]> {44 const embeddingResponse = await openai.embeddings.create({45 model: 'text-embedding-3-small',46 input: query,47 });48 49 const queryEmbedding = embeddingResponse.data[0].embedding;50 51 const { data, error } = await supabase.rpc('match_documents', {52 query_embedding: queryEmbedding,53 match_threshold: 0.7,54 match_count: limit,55 });56 57 if (error) throw new Error(`Arama hatası: ${error.message}`);58 return data as Document[];59}RPC Fonksiyonu (SQL)
sql
1CREATE OR REPLACE FUNCTION match_documents(2 query_embedding VECTOR(1536),3 match_threshold FLOAT DEFAULT 0.7,4 match_count INT DEFAULT 105)6RETURNS TABLE (7 id BIGINT,8 content TEXT,9 metadata JSONB,10 similarity FLOAT11)12LANGUAGE plpgsql13AS $$14BEGIN15 RETURN QUERY16 SELECT17 d.id,18 d.content,19 d.metadata,20 1 - (d.embedding <=> query_embedding) AS similarity21 FROM documents d22 WHERE 1 - (d.embedding <=> query_embedding) > match_threshold23 ORDER BY d.embedding <=> query_embedding24 LIMIT match_count;25END;26$$;Index Stratejileri
pgvector iki temel index türü sunuyor:
Index Türü | Hız | Doğruluk | Bellek | Ne Zaman Kullan? |
|---|---|---|---|---|
IVFFlat | Hızlı build | ~95% recall | Düşük | < 1M vektör, sık güncelleme |
HNSW | Yavaş build | ~99% recall | Yüksek | > 100K vektör, okuma ağırlıklı |
🔍 Pro Tip: 100.000'den az vektörün varsa IVFFlat yeterli. Ama production'da milyonlarca doküman indexleyeceksen HNSW tercih et. ef_search parametresini 100-200 arasında tut — doğruluk ve hız arasında ideal denge.
Hybrid Search: BM25 + Vector
Saf vektör arama harika ama yeterli değil. Kullanıcı "Next.js 15 middleware kaldırıldı mı?" diye sorduğunda, semantik benzerlik tek başına doğru sonucu garanti etmez. İşte burada hybrid search devreye giriyor.
Supabase, 2025'te pg_bm25 extension'ı ile keyword-based BM25 scoring ve vector similarity'yi birleştiren hybrid search sunmaya başladı.
Hybrid Search Fonksiyonu
sql
1-- BM25 extension2CREATE EXTENSION IF NOT EXISTS pg_bm25;3 4-- Full-text search index5CREATE INDEX idx_documents_fts ON documents6 USING bm25 (content)7 WITH (text_fields = '{"content": {}}');8 9-- Hybrid search: BM25 + Vector birleşimi10CREATE OR REPLACE FUNCTION hybrid_search(11 query_text TEXT,12 query_embedding VECTOR(1536),13 bm25_weight FLOAT DEFAULT 0.3,14 vector_weight FLOAT DEFAULT 0.7,15 match_count INT DEFAULT 1016)17RETURNS TABLE (18 id BIGINT,19 content TEXT,20 metadata JSONB,21 bm25_score FLOAT,22 vector_score FLOAT,23 combined_score FLOAT24)25LANGUAGE plpgsql26AS $$27BEGIN28 RETURN QUERY29 WITH bm25_results AS (30 SELECT d.id, d.content, d.metadata,31 paradedb.score(d.id) AS score32 FROM documents d33 WHERE d.content @@@ query_text34 ORDER BY score DESC35 LIMIT match_count * 336 ),37 vector_results AS (38 SELECT d.id, d.content, d.metadata,39 1 - (d.embedding <=> query_embedding) AS score40 FROM documents d41 ORDER BY d.embedding <=> query_embedding42 LIMIT match_count * 343 ),44 combined AS (45 SELECT46 COALESCE(b.id, v.id) AS id,47 COALESCE(b.content, v.content) AS content,48 COALESCE(b.metadata, v.metadata) AS metadata,49 COALESCE(b.score, 0) AS bm25_score,50 COALESCE(v.score, 0) AS vector_score,51 (COALESCE(b.score, 0) * bm25_weight +52 COALESCE(v.score, 0) * vector_weight) AS combined_score53 FROM bm25_results b54 FULL OUTER JOIN vector_results v ON b.id = v.id55 )56 SELECT c.id, c.content, c.metadata,57 c.bm25_score, c.vector_score, c.combined_score58 FROM combined c59 ORDER BY c.combined_score DESC60 LIMIT match_count;61END;62$$;Neden Hybrid?
- Keyword arama (BM25): Tam eşleşme, teknik terimler, özel isimler
- Vektör arama: Anlamsal benzerlik, parafraz, farklı dillerde aynı kavram
- Hybrid: İkisinin güçlü yönlerini birleştirir
Özellikle teknik dokümantasyon, e-ticaret ürün arama ve müşteri destek chatbot'larında hybrid search %15-25 daha yüksek recall oranı sağlıyor.
🔍 Pro Tip: bm25_weight ve vector_weight oranlarını kullanım senaryona göre ayarla. Teknik dokümantasyonda BM25'i 0.4-0.5'e çıkar, genel sohbet chatbot'larında vector'ü 0.8'e çıkar.
Vector Buckets ve Büyük Ölçek
10 milyon+ embedding'in olduğunda tek bir tabloda arama yapmak yavaşlar. Supabase'in Vector Buckets özelliği, vektörleri mantıksal gruplara ayırarak arama alanını daraltır.
Bucket Mimarisi
typescript
1// Namespace bazlı vektör gruplandırma2interface VectorBucket {3 namespace: string; // 'blog', 'docs', 'support'4 partition: string; // 'tr', 'en', 'de'5}6 7async function searchInBucket(8 query: string,9 bucket: VectorBucket,10 limit = 1011) {12 const embedding = await generateEmbedding(query);13 14 const { data } = await supabase.rpc('match_documents_in_bucket', {15 query_embedding: embedding,16 target_namespace: bucket.namespace,17 target_partition: bucket.partition,18 match_count: limit,19 });20 21 return data;22}23 24// Kullanım25const blogResults = await searchInBucket(26 'React Server Components nasıl çalışır?',27 { namespace: 'blog', partition: 'tr' }28);Bu yaklaşımla 50M vektör bile olsa, her arama sadece ilgili bucket'taki vektörleri tarar. Sonuç: 10x-100x hız artışı.
postgres.new: Tarayıcıda PostgreSQL
Supabase'in en çılgın projelerinden biri: tarayıcıda çalışan tam teşekküllü bir PostgreSQL. WebAssembly üzerine inşa edilmiş PGlite sayesinde, herhangi bir sunucu kurulumu olmadan pgvector ile deney yapabilirsin.
Öne Çıkan Özellikler
- Tarayıcıda çalışan PostgreSQL (WebAssembly)
- pgvector extension desteği
- CSV/JSON import ile anında veri yükleme
- AI asistan ile doğal dilde SQL yazma
- Sonuçları chart olarak görselleştirme
- Projeni doğrudan Supabase'e deploy etme
Bu özellikle prototipleme ve öğrenme için muazzam. Bir RAG pipeline'ı denemek istiyorsan, postgres.new'de 5 dakikada başlayabilirsin. MCP Protokolü yazımızda bahsettiğimiz AI araç entegrasyonu için de Supabase MCP server'ı mevcut.
RAG Pipeline Oluşturma
Retrieval Augmented Generation (RAG), büyük dil modellerinin halüsinasyonunu azaltmanın en etkili yolu. Supabase ile production-ready bir RAG pipeline şöyle kurulur:
Edge Function ile RAG API
typescript
1// supabase/functions/rag-chat/index.ts2import { serve } from 'https://deno.land/std@0.177.0/http/server.ts';3import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';4import OpenAI from 'https://esm.sh/openai@4';5 6const supabase = createClient(7 Deno.env.get('SUPABASE_URL')!,8 Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!9);10 11const openai = new OpenAI({12 apiKey: Deno.env.get('OPENAI_API_KEY')!,13});14 15serve(async (req: Request) => {16 const { query, history = [] } = await req.json();17 18 // 1. Query embedding oluştur19 const embeddingRes = await openai.embeddings.create({20 model: 'text-embedding-3-small',21 input: query,22 });23 24 // 2. Hybrid search ile ilgili dokümanları bul25 const { data: documents } = await supabase.rpc('hybrid_search', {26 query_text: query,27 query_embedding: embeddingRes.data[0].embedding,28 bm25_weight: 0.3,29 vector_weight: 0.7,30 match_count: 5,31 });32 33 // 3. Context oluştur34 const context = documents35 ?.map((d: { content: string }) => d.content)36 .join('\n\n---\n\n');37 38 // 4. LLM ile cevap üret39 const completion = await openai.chat.completions.create({40 model: 'gpt-4o',41 messages: [42 {43 role: 'system',44 content: `Sen yardımcı bir asistansın. Aşağıdaki bağlama göre soruları cevapla.45Bağlamda bilgi yoksa "Bu konuda bilgim yok" de.46 47Bağlam:48${context}`,49 },50 ...history,51 { role: 'user', content: query },52 ],53 temperature: 0.2,54 max_tokens: 1000,55 });56 57 return new Response(58 JSON.stringify({59 answer: completion.choices[0].message.content,60 sources: documents?.map((d: { id: number; metadata: Record<string, unknown> }) => ({61 id: d.id,62 metadata: d.metadata,63 })),64 }),65 { headers: { 'Content-Type': 'application/json' } }66 );67});Firebase vs Supabase Karşılaştırma
Her iki platformu da production'da kullanan biri olarak kıyaslayalım. Firebase Advanced yazımızda Firebase'in detaylarına inmistik. Şimdi AI odağında karşılaştıralım:
Özellik | Supabase | Firebase |
|---|---|---|
Veritabanı | PostgreSQL (SQL) | Firestore (NoSQL) |
Vektör Arama | pgvector (native) | Firestore Vector Search (sınırlı) |
Hybrid Search | BM25 + Vector | Yok (harici servis gerekir) |
Real-time | WebSocket | WebSocket |
Auth | GoTrue (OAuth, Magic Link) | Firebase Auth (çok geniş) |
Functions | Deno Edge Functions | Cloud Functions (Node.js) |
AI Entegrasyon | pgvector + Edge Functions | Vertex AI, Gemini API |
Açık Kaynak | Evet, tamamen | Hayır |
Self-host | Docker ile kolay | Firebase Emulator (sınırlı) |
Fiyatlandırma | Tahmin edilebilir | Kullanıma göre (sürprizli) |
🔍 Pro Tip: İkisini birlikte de kullanabilirsin! Firebase Auth + Supabase Database veya Firebase Hosting + Supabase Vector Search. Araçları dogmatik değil, pragmatik seç. Flutter Clean Architecture yazımızdaki repository pattern bu tür entegrasyonları kolaylaştırır.
Hızlı Başlangıç: match_documents RPC
Production uygulamalarında en sık kullanılan pattern — vektör aramasını tek bir RPC çağrısıyla yapmak:
typescript
1// Supabase Vector Search — en yaygın kullanım2const { data } = await supabase.rpc('match_documents', {3 query_embedding: embedding,4 match_threshold: 0.78,5 match_count: 106});Bu çağrı için gerekli match_documents SQL fonksiyonunu yukarıdaki RPC Fonksiyonu bölümünde tanımladık. match_threshold: 0.78 değeri çoğu use case için optimal başlangıç noktasıdır — düşürürsen daha fazla ama daha az ilgili sonuç, artırırsan daha az ama yüksek kaliteli sonuç elde edersin.
Production Best Practices
1. Connection Pooling
typescript
1// Supabase otomatik connection pooling sağlar (PgBouncer)2// Ama Edge Functions'da her request yeni connection açar3// Çözüm: Supabase client'ı global scope'ta tanımla4const supabase = createClient(url, key, {5 db: { schema: 'public' },6 auth: { persistSession: false },7 global: {8 headers: { 'x-connection-pool': 'true' },9 },10});2. Embedding Cache
Her sorguda OpenAI API çağrısı yapmak hem yavaş hem pahalı. Sık sorulan sorguları cache'le:
typescript
1// Redis veya Supabase'de cache tablosu2const CACHE_TTL = 3600; // 1 saat3 4async function getCachedEmbedding(query: string): Promise<number[] | null> {5 const cacheKey = createHash('sha256').update(query).digest('hex');6 7 const { data } = await supabase8 .from('embedding_cache')9 .select('embedding')10 .eq('cache_key', cacheKey)11 .gt('expires_at', new Date().toISOString())12 .single();13 14 return data?.embedding ?? null;15}3. Row Level Security (RLS)
sql
1-- Kullanıcılar sadece kendi dokümanlarını görsün2ALTER TABLE documents ENABLE ROW LEVEL SECURITY;3 4CREATE POLICY "Users see own documents"5 ON documents FOR SELECT6 USING (auth.uid()::text = metadata->>'user_id');7 8CREATE POLICY "Users insert own documents"9 ON documents FOR INSERT10 WITH CHECK (auth.uid()::text = metadata->>'user_id');Sonuç ve Öneriler
Supabase, AI-native backend olarak 2025-2026'nın en güçlü seçeneklerinden biri. pgvector ile native vektör arama, hybrid search ile keyword+semantic birleşimi, Vector Buckets ile ölçeklenebilirlik ve postgres.new ile anında prototipleme — hepsi açık kaynak bir ekosistemde. GraphQL Mobile veya WebSocket Real-Time projelerinde Supabase'i backend olarak değerlendir.
Öneriler
- Yeni AI projesi mi? Supabase + pgvector ile başla
- Mevcut Firebase projen mi var? Vektör arama için Supabase'i ek servis olarak kullan
- Enterprise ölçek mi? Vector Buckets + HNSW index + connection pooling kombini kur
- Öğrenmeye mi başlıyorsun? postgres.new'de ücretsiz dene
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
Supabase + Vercel AI SDK ile 30 dakikada production-ready chatbot: Vercel'in ai paketinin useChat hook'u + Supabase Edge Function RAG endpoint'i = frontend'de sıfır state yönetimi ile streaming chat. experimental_StreamData ile kaynak dokümanları da stream sırasında gösterebilirsin. Bu combo, tam bir AI chatbot MVP'si için en hızlı yol.

