ders_02 / text_to_sql
// Veriyle Konusan Analitik Asistan

Ilk Text-to-SQL

Ders 2  ·  Ilk cagri · Prompt · Temperature · Halusinasyon

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

Nerede Kalmistik?

Ders 1: dilin makineye temsili — token, embedding, attention.

Bugun: modeli API'den cagirip ilk SQL'i urettiriyoruz.

Asistanimizin ilk hali bu derste dogacak.

Bu derste

  • LLM nasil calisir (tek cumle)
  • DuckDB + ilk cagri
  • Semayi prompt'a verip SQL uret
  • Temperature
  • Halusinasyon — somut bedel

LLM Nasil Calisir? — Tek Cumle

LLM = cok iyi bir otomatik tamamlama.
Bir sonraki token'i tahmin eder (next-token prediction). SQL uretmesi de aslinda budur.

Iyi yaptigi

  • Kalibi taninan metin/kod uretmek
  • SQL sozdizimi
  • Dogal dili anlamak

Bilmedigi

  • Senin semani (→ RAG, Ders 3)
  • Guncel veriyi (→ tool, Ders 4)
  • O anki gercegi → uydurur

DuckDB — Demo Icin Ideal Veritabani

  • Embedded — sunucu yok, tek dosya
  • Sifir kurulum — pip install duckdb
  • Analitik sorgularda cok hizli
  • SQL standardi — ogrendigin her yerde gecerli

Demo icin neden ideal?

  • Katilimci tarafinda kurulum kaosu yok
  • Tek dosya — repo ile birlikte tasinir
  • Ayni SQL PostgreSQL / warehouse'ta da gecerli
Dogru arac, dogru olcek.

Ilk Cagri — Baglanti Testi

# llm.py — DeepSeek, OpenAI-uyumlu API
from openai import OpenAI
client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),
                base_url="https://api.deepseek.com")
MODEL = "deepseek-chat"

# Henuz SQL degil — "calisiyor mu?"
r = client.chat.completions.create(model=MODEL,
    messages=[{"role":"user", "content":"SQL nedir, tek cumle?"}])
print(r.choices[0].message.content)
Guvenlik: API key .env'de, koda gomulmez, ekranda gorunmez. OpenAI'a gecmek istersen sadece base_url ve model degisir.

Semamiz — Kucuk E-ticaret DB'si

customers (id, name, city, registered_at)
products (id, name, price, category)
orders (id, customer_id, order_date)
order_items (order_id, product_id, quantity)

Iliskiler

  • bir musteri → cok siparis
  • bir siparis → cok satir (order_items)
  • her satir → bir urun + adet
Kucuk ve deterministik veri — demo sorulari hep ayni, anlamli sonucu doner.
En cok satan: Kablosuz Kulaklik (10) · Istanbul: 4 musteri

Ilk SQL Uretimi — Semayi Prompt'a Ver

def generate_sql(question, temperature=0.0, schema=SCHEMA):
    messages = [
      {"role":"system", "content":
        "Sen bir SQL uzmanisin. Semaya gore GECERLI DuckDB SELECT uret. Sadece SQL don."},
      {"role":"user", "content": f"SCHEMA:\n{schema}\n\nQUESTION: {question}"},
    ]
    return clean_sql(chat(messages, temperature=temperature)...)

sql = generate_sql("Istanbul'daki musteri sayisi kac?")
# -> SELECT COUNT(*) FROM customers WHERE city = 'İstanbul'
print(db.sql(sql).df())   # -> 4
Dogru SQL uretti, calisti, sonuc geldi. Iste asistanimizin ilk hali.

Temperature — Rastgelelik Kadrani

Temperature = modelin yaraticilik/rastgelelik kadrani.

SQL uretiminde tutarlilik isteriz → temperature = 0.
Yaraticilik burada dusman: ayni soru → ayni SQL olmali.
temp = 0.0 → kararli, tekrarlanabilir
temp = 0.7 → cesitli (sohbet icin)
temp = 1.5 → savruk, ongorulemez
Not: bazi yeni modeller temperature kabul etmez ("yaraticilik prompt ile"). Kavram ayni: rastgeleligi kis.

🚨 Halusinasyon — Somut Bedel

Semada olmayan bir sey soralim:

soru = "Urunlerin tedarikci firmasini ve iletisim bilgisini goster."
# SEMADA suppliers TABLOSU YOK
sql = generate_sql(soru)
# -> SELECT p.name, s.supplier_name FROM products p
#    LEFT JOIN suppliers s ON p.supplier_id = s.id   (TUM TABLOYU UYDURDU!)
db.sql(sql)  # >>> Catalog Error: Table "suppliers" does not exist!
Iste halusinasyon: model emin bir tonda olmayan bir tabloyu + JOIN'i uydurdu. Production'da bu = yanlis rapor, yanlis is karari.

Peki Cozum? — Sonraki Derslere Kopru

Problem

  • Buyuk sema prompt'a sigmaz
  • Halusinasyon var
  • Hatayi kendi duzeltemiyor

Ders 3 → RAG

  • Dogru semayi getir
  • Olmayan kolon riski azalir

Ders 4 → Agent

  • SQL'i calistir
  • Hatayi gor, duzelt
📦 Sektor notu: soruya/veriye kotu niyetli talimat gomulurse? → prompt injection, Ders 5.
Sonraki ders: Dogru semayi akillica getiriyoruz — RAG / schema retrieval.