Tüm Yazılar
KategoriAI
Okuma Süresi
22 dk
Yayın Tarihi
2026-02-13
Kelime Sayısı
2.318kelime

Kahveni hazırla - bu içerikli bir makale!

Supabase AI: Vektör Arama, Hybrid Search ve $5B Değerleme

Özet

pgvector ile vektör arama, BM25+vector hybrid search, Vector Buckets, postgres.new ve AI-native altyapı. Firebase alternatifi olarak Supabase derinlemesine.

  • Supabase 2025'te $5B değerlemeye ulaştı; pgvector ile native vektör arama sunuyor.
  • HNSW index >100K vektörde, IVFFlat <1M vektör ve sık güncellemede tercih edilmeli.
  • Hybrid search fonksiyonu pg_bm25 skorunu ve vektör benzerliğini ağırlıklı birleştirir (varsayılan 0.3/0.7).
  • match_documents RPC'sinde match_threshold:0.78 çoğu senaryo için optimal başlangıç değeri.
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?

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'den
2CREATE EXTENSION IF NOT EXISTS vector;
3 
4-- Vektör kolonu olan tablo oluştur
5CREATE TABLE documents (
6 id BIGSERIAL PRIMARY KEY,
7 content TEXT NOT NULL,
8 embedding VECTOR(1536), -- OpenAI text-embedding-3-small boyutu
9 metadata JSONB DEFAULT '{}',
10 created_at TIMESTAMPTZ DEFAULT NOW()
11);
12 
13-- Performans için HNSW index
14CREATE INDEX ON documents
15 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 kaydet
20async 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 supabase
29 .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 arama
43async 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 10
5)
6RETURNS TABLE (
7 id BIGINT,
8 content TEXT,
9 metadata JSONB,
10 similarity FLOAT
11)
12LANGUAGE plpgsql
13AS $$
14BEGIN
15 RETURN QUERY
16 SELECT
17 d.id,
18 d.content,
19 d.metadata,
20 1 - (d.embedding <=> query_embedding) AS similarity
21 FROM documents d
22 WHERE 1 - (d.embedding <=> query_embedding) > match_threshold
23 ORDER BY d.embedding <=> query_embedding
24 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 extension
2CREATE EXTENSION IF NOT EXISTS pg_bm25;
3 
4-- Full-text search index
5CREATE INDEX idx_documents_fts ON documents
6 USING bm25 (content)
7 WITH (text_fields = '{"content": {}}');
8 
9-- Hybrid search: BM25 + Vector birleşimi
10CREATE 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 10
16)
17RETURNS TABLE (
18 id BIGINT,
19 content TEXT,
20 metadata JSONB,
21 bm25_score FLOAT,
22 vector_score FLOAT,
23 combined_score FLOAT
24)
25LANGUAGE plpgsql
26AS $$
27BEGIN
28 RETURN QUERY
29 WITH bm25_results AS (
30 SELECT d.id, d.content, d.metadata,
31 paradedb.score(d.id) AS score
32 FROM documents d
33 WHERE d.content @@@ query_text
34 ORDER BY score DESC
35 LIMIT match_count * 3
36 ),
37 vector_results AS (
38 SELECT d.id, d.content, d.metadata,
39 1 - (d.embedding <=> query_embedding) AS score
40 FROM documents d
41 ORDER BY d.embedding <=> query_embedding
42 LIMIT match_count * 3
43 ),
44 combined AS (
45 SELECT
46 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_score
53 FROM bm25_results b
54 FULL OUTER JOIN vector_results v ON b.id = v.id
55 )
56 SELECT c.id, c.content, c.metadata,
57 c.bm25_score, c.vector_score, c.combined_score
58 FROM combined c
59 ORDER BY c.combined_score DESC
60 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ırma
2interface 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 = 10
11) {
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ım
25const 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.ts
2import { 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ştur
19 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ı bul
25 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ştur
34 const context = documents
35 ?.map((d: { content: string }) => d.content)
36 .join('\n\n---\n\n');
37 
38 // 4. LLM ile cevap üret
39 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ım
2const { data } = await supabase.rpc('match_documents', {
3 query_embedding: embedding,
4 match_threshold: 0.78,
5 match_count: 10
6});

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çar
3// Çözüm: Supabase client'ı global scope'ta tanımla
4const 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 tablosu
2const CACHE_TTL = 3600; // 1 saat
3 
4async function getCachedEmbedding(query: string): Promise<number[] | null> {
5 const cacheKey = createHash('sha256').update(query).digest('hex');
6 
7 const { data } = await supabase
8 .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ün
2ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
3 
4CREATE POLICY "Users see own documents"
5 ON documents FOR SELECT
6 USING (auth.uid()::text = metadata->>'user_id');
7 
8CREATE POLICY "Users insert own documents"
9 ON documents FOR INSERT
10 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

  1. Yeni AI projesi mi? Supabase + pgvector ile başla
  2. Mevcut Firebase projen mi var? Vektör arama için Supabase'i ek servis olarak kullan
  3. Enterprise ölçek mi? Vector Buckets + HNSW index + connection pooling kombini kur
  4. Öğ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.

Etiketler

#Supabase#AI#pgvector#Hybrid Search#PostgreSQL#Vector Database#RAG
Muhittin Çamdalı

Muhittin Çamdalı

Lead Mobile Engineer

12+ yıllık deneyime sahip Lead Mobile Engineer. Swift, SwiftUI, Kotlin ve Flutter ile iOS, Android ve cross-platform mimarilerde uzman. Performanslı ve kullanıcı dostu mobil uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Onay e-postasındaki bağlantıyı açıp “Aboneliğimi onayla” düğmesine bastığında aboneliğin başlar. Bültende açılma/tıklama istatistikleri tutulur; dilediğin an tek tıkla ayrılabilirsin. Gizlilik

Paylaş

İlgili İçerik