ders_03 / schema_rag
// Veriyle Konusan Analitik Asistan

RAG = Schema
Retrieval

Ders 3  ·  Dogru semayi getir (schema linking)

01 / Temsil 02 / Text-to-SQL 03 / Schema-RAG 04 / Agent 05 / Guvenlik 06 / Deploy

Problem: Buyuk Sema

Ders 2'de 4 tablomuz vardi, prompt'a sigdi.

Gercekte: yuzlerce tablo, binlerce kolon.

Hepsini prompt'a koymak = imkansiz (token) + model kaybolur (yanlis tablo secer).
500 tablo × 20 kolon
↓ hepsi prompt'a?
✗ 100k+ token
✗ pahali + yavas
✗ model saskin

Cozum: RAG

RAG = Retrieval-Augmented Generation. Soruyla ilgili parcayi bul, sadece onu modele ver.

Analoji

Kutuphanenin tum kitaplarini masaya yigmazsin. Dogru kitabi bulur, o sayfayi acarsin.

Text-to-SQL'de RAG = schema linking: soruyla ilgili tablo/kolonlari getirmek. Bu, text-to-SQL dogrulugunun en belirleyici parcasi.

RAG'in 4 Adimi

1 · CHUNK — her tabloyu bir "belge" yap (ad + aciklama)
2 · EMBED — bu belgeleri vektorle (Ders 1'deki embedding!), sakla
3 · RETRIEVE — soruyu vektorle, en yakin tablolari bul
4 · GENERATE — sadece o tablolarin semasiyla SQL yazdir
Adim 2-3 tam da Ders 1'de yaptigimiz benzerlik isi. Embedding burada is basinda.

Adim 1-2: Chunk + Embed + Store (Chroma)

import chromadb
# Her tablo bir "belge". 4 gercek + gurultu (buyuk veri ambarini taklit)
SCHEMA_DOCS = {"customers":..., "products":..., "orders":..., "order_items":...,
  "shipping_logs":..., "employees":..., "suppliers":...,  # gurultu
  "payments":..., "product_reviews":..., "warehouses":...}  # gurultu

client = chromadb.PersistentClient(path="chroma_db")        # kalici, sunucu yok
col = client.get_or_create_collection("schema_catalog",
        metadata={"hnsw:space": "cosine"})
col.upsert(ids=names, documents=docs,
           embeddings=embedder.encode(docs).tolist())    # cok dilli embedding
Chroma = gercek vektor DB (embedded, kalici). Gurultu tablolar (suppliers, payments...) retrieval'da elenmeli. Embedding'i biz uretiyoruz — cok dilli (Turkce) icin.

Adim 3: Retrieve — Vektor DB Sorgusu

def relevant_schema(question, k=3):
    q_emb = embedder.encode([question]).tolist()
    res = col.query(query_embeddings=q_emb, n_results=k)  # Chroma ANN
    return "Tables:\n" + format(res["ids"], res["documents"])

print(relevant_schema("Hangi urun en cok satildi?"))
Tables:
- products: Urun katalogu...
- order_items: Siparis satirlari...
- product_reviews: Urun yorumlari... (sinirda)
Alakasiz tablolar (employees, warehouses, suppliers...) elendi; model yine de ilgili olani secer.

Adim 4: Generate — Ilgili Semayla SQL

# Sadece ilgili semayla SQL uret (Ders 2'nin generate_sql'i)
schema = relevant_schema(soru)          # gurultu elendi
sql = generate_sql(soru, schema=schema) # dar, isabetli sema
db.sql(sql)                             # dogru sonuc
Soru
retrieve (3 tablo)
generate_sql
dogru SQL
Gurultu elendi, model sadece ilgili semayla daha isabetli SQL yazdi.

RAG Turleri

Tek bir "RAG" yok — probleme gore turler:

Naive RAG — getir → prompt'a doldur → uret
Schema-linking — bizim yaptigimiz (text-to-SQL'e ozel)
Hybrid search — anahtar kelime (BM25) + vektor
Reranking — aday'lari cross-encoder ile yeniden sirala
Agentic RAG — agent retrieval'i ARAC olarak cagirir
GraphRAG — bilgi grafigi + topluluk ozetleri uzerinden
Kotu retrieval = kotu SQL. Retrieval kacirirsa model uydurur → schema linking, text-to-SQL dogrulugunun en belirleyici faktoru. (Buyuk semada: agent get_schema araciyla RAG'i cagirir — agentic RAG.)

Vektor DB'ler — Avantaj / Dezavantaj

AracTipAvantajDezavantaj
FAISSKutuphane (Meta)En hizli ANN, in-process, ucretsizDB degil: kaliciligi elle yonet; metadata filtre / otomatik CRUD / cok-kullanici yok
ChromaDBEmbedded DBKurulumsuz, kalici, metadata filtre — demo/dev ideal (bizimki)Buyuk olcek + cok kullanicida zayif
Qdrant / Weaviate / MilvusDedicated (self-host)Prod-grade, hizli, guclu filtre, olceklenirAyri servis: kurulum + operasyon yuku
pgvectorPostgres eklentisiMevcut Postgres'te SQL+vektor bir arada, transactionalDevasa olcekte ozel DB kadar hizli degil
OpenSearch ServerlessAWS yonetilenAWS-native, olceklenir, hybrid (BM25+vektor)Maliyet + AWS'e baginlilik
Bedrock Knowledge BasesAWS yonetilen RAGUctan uca yonetilen (chunk+embed+retrieve), cok az kodEsneklik az, maliyet, saticiya kilit
PineconeManaged SaaSSifir ops, olceklenirUcretli 3. parti, veri disarida
📦 Olcege gore sec: 6-10 tabloda Chroma/in-memory yeter; sema yuzlerce tabloya cikinca OpenSearch/pgvector. Kod ayni, sadece depo degisir (bkz. aws_rag_pgvector.py).

Ders 3 — Ozet

Buyuk semadan sadece ilgili parcayi getirip prompt'a koyduk → schema linking.
Chunk
Embed
Retrieve
Generate
Sonraki ders: SQL hala metin — calistirmiyor. Asistana elini veriyoruz: calistiran, hata duzelten agent.