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