Tüm Yazılar
KategoriAI
Okuma Süresi
22 dk okuma
Yayın Tarihi
...
Kelime Sayısı
2.313kelime

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

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

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

# 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

-- 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

  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ı

Senior iOS Developer

12+ yıllık deneyime sahip iOS Developer. Swift, SwiftUI ve modern iOS mimarileri konusunda uzman. Apple platformlarında performanslı ve kullanıcı dostu uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

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

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

Bunu da begenebilirsiniz