# Supabase AI: Vektör Arama, Hybrid Search ve $5B Değerleme
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
- 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
-- Supabase Dashboard'dan veya SQL Editor'den
CREATE EXTENSION IF NOT EXISTS vector;
-- Vektör kolonu olan tablo oluştur
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT NOT NULL,
embedding VECTOR(1536), -- OpenAI text-embedding-3-small boyutu
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Performans için HNSW index
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 200);
\\\`
TypeScript ile Embedding Oluşturma ve Kaydetme
\\\`typescript
import { createClient } from '@supabase/supabase-js';
import OpenAI from 'openai';
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!
);
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
interface Document {
id: number;
content: string;
embedding: number[];
metadata: Record<string, unknown>;
similarity?: number;
}
// Embedding oluştur ve kaydet
async function embedAndStore(content: string, metadata: Record<string, unknown>) {
const embeddingResponse = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: content,
});
const embedding = embeddingResponse.data[0].embedding;
const { data, error } = await supabase
.from('documents')
.insert({
content,
embedding,
metadata,
})
.select()
.single();
if (error) throw new Error(\Kayıt hatası: \${error.message}\);
return data as Document;
}
// Semantik arama
async function semanticSearch(query: string, limit = 10): Promise<Document[]> {
const embeddingResponse = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query,
});
const queryEmbedding = embeddingResponse.data[0].embedding;
const { data, error } = await supabase.rpc('match_documents', {
query_embedding: queryEmbedding,
match_threshold: 0.7,
match_count: limit,
});
if (error) throw new Error(\Arama hatası: \${error.message}\);
return data as Document[];
}
\\\`
RPC Fonksiyonu (SQL)
\\\`sql
CREATE OR REPLACE FUNCTION match_documents(
query_embedding VECTOR(1536),
match_threshold FLOAT DEFAULT 0.7,
match_count INT DEFAULT 10
)
RETURNS TABLE (
id BIGINT,
content TEXT,
metadata JSONB,
similarity FLOAT
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT
d.id,
d.content,
d.metadata,
1 - (d.embedding <=> query_embedding) AS similarity
FROM documents d
WHERE 1 - (d.embedding <=> query_embedding) > match_threshold
ORDER BY d.embedding <=> query_embedding
LIMIT match_count;
END;
$$;
\\\`
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
-- BM25 extension
CREATE EXTENSION IF NOT EXISTS pg_bm25;
-- Full-text search index
CREATE INDEX idx_documents_fts ON documents
USING bm25 (content)
WITH (text_fields = '{"content": {}}');
-- Hybrid search: BM25 + Vector birleşimi
CREATE OR REPLACE FUNCTION hybrid_search(
query_text TEXT,
query_embedding VECTOR(1536),
bm25_weight FLOAT DEFAULT 0.3,
vector_weight FLOAT DEFAULT 0.7,
match_count INT DEFAULT 10
)
RETURNS TABLE (
id BIGINT,
content TEXT,
metadata JSONB,
bm25_score FLOAT,
vector_score FLOAT,
combined_score FLOAT
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
WITH bm25_results AS (
SELECT d.id, d.content, d.metadata,
paradedb.score(d.id) AS score
FROM documents d
WHERE d.content @@@ query_text
ORDER BY score DESC
LIMIT match_count * 3
),
vector_results AS (
SELECT d.id, d.content, d.metadata,
1 - (d.embedding <=> query_embedding) AS score
FROM documents d
ORDER BY d.embedding <=> query_embedding
LIMIT match_count * 3
),
combined AS (
SELECT
COALESCE(b.id, v.id) AS id,
COALESCE(b.content, v.content) AS content,
COALESCE(b.metadata, v.metadata) AS metadata,
COALESCE(b.score, 0) AS bm25_score,
COALESCE(v.score, 0) AS vector_score,
(COALESCE(b.score, 0) * bm25_weight +
COALESCE(v.score, 0) * vector_weight) AS combined_score
FROM bm25_results b
FULL OUTER JOIN vector_results v ON b.id = v.id
)
SELECT c.id, c.content, c.metadata,
c.bm25_score, c.vector_score, c.combined_score
FROM combined c
ORDER BY c.combined_score DESC
LIMIT match_count;
END;
$$;
\\\`
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
// Namespace bazlı vektör gruplandırma
interface VectorBucket {
namespace: string; // 'blog', 'docs', 'support'
partition: string; // 'tr', 'en', 'de'
}
async function searchInBucket(
query: string,
bucket: VectorBucket,
limit = 10
) {
const embedding = await generateEmbedding(query);
const { data } = await supabase.rpc('match_documents_in_bucket', {
query_embedding: embedding,
target_namespace: bucket.namespace,
target_partition: bucket.partition,
match_count: limit,
});
return data;
}
// Kullanım
const blogResults = await searchInBucket(
'React Server Components nasıl çalışır?',
{ namespace: 'blog', partition: 'tr' }
);
\\\`
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
// supabase/functions/rag-chat/index.ts
import { serve } from 'https://deno.land/[email protected]/http/server.ts';
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';
import OpenAI from 'https://esm.sh/openai@4';
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
);
const openai = new OpenAI({
apiKey: Deno.env.get('OPENAI_API_KEY')!,
});
serve(async (req: Request) => {
const { query, history = [] } = await req.json();
// 1. Query embedding oluştur
const embeddingRes = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query,
});
// 2. Hybrid search ile ilgili dokümanları bul
const { data: documents } = await supabase.rpc('hybrid_search', {
query_text: query,
query_embedding: embeddingRes.data[0].embedding,
bm25_weight: 0.3,
vector_weight: 0.7,
match_count: 5,
});
// 3. Context oluştur
const context = documents
?.map((d: { content: string }) => d.content)
.join('\n\n---\n\n');
// 4. LLM ile cevap üret
const completion = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: `Sen yardımcı bir asistansın. Aşağıdaki bağlama göre soruları cevapla.
Bağlamda bilgi yoksa "Bu konuda bilgim yok" de.
Bağlam:
\${context}\`,
},
...history,
{ role: 'user', content: query },
],
temperature: 0.2,
max_tokens: 1000,
});
return new Response(
JSON.stringify({
answer: completion.choices[0].message.content,
sources: documents?.map((d: { id: number; metadata: Record<string, unknown> }) => ({
id: d.id,
metadata: d.metadata,
})),
}),
{ headers: { 'Content-Type': 'application/json' } }
);
});
\\\`
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
// Supabase Vector Search — en yaygın kullanım
const { data } = await supabase.rpc('match_documents', {
query_embedding: embedding,
match_threshold: 0.78,
match_count: 10
});
\\\`
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
// Supabase otomatik connection pooling sağlar (PgBouncer)
// Ama Edge Functions'da her request yeni connection açar
// Çözüm: Supabase client'ı global scope'ta tanımla
const supabase = createClient(url, key, {
db: { schema: 'public' },
auth: { persistSession: false },
global: {
headers: { 'x-connection-pool': 'true' },
},
});
\\\`
2. Embedding Cache
Her sorguda OpenAI API çağrısı yapmak hem yavaş hem pahalı. Sık sorulan sorguları cache'le:
\\\`typescript
// Redis veya Supabase'de cache tablosu
const CACHE_TTL = 3600; // 1 saat
async function getCachedEmbedding(query: string): Promise<number[] | null> {
const cacheKey = createHash('sha256').update(query).digest('hex');
const { data } = await supabase
.from('embedding_cache')
.select('embedding')
.eq('cache_key', cacheKey)
.gt('expires_at', new Date().toISOString())
.single();
return data?.embedding ?? null;
}
\\\`
3. Row Level Security (RLS)
\\\`sql
-- Kullanıcılar sadece kendi dokümanlarını görsün
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users see own documents"
ON documents FOR SELECT
USING (auth.uid()::text = metadata->>'user_id');
CREATE POLICY "Users insert own documents"
ON documents FOR INSERT
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.

