# Colab Çalıştırma Rehberi

Bu dosya, RAG boru hattını Colab'da adım adım çalıştırmak için gereken
hücreleri içerir. Her hücreyi sırayla çalıştırın ve çıktıyı kontrol edin.

**Runtime → Change runtime type → T4 GPU** seçin (embedding üretimi için).

---

## Hücre 1 — Kurulum

```python
!pip install -q datasets sentence-transformers chromadb
print("kurulum tamam")
```

## Hücre 2 — Modülleri yükle

`chunking.py`, `vectorstore.py`, `evaluation.py`, `pipeline.py`,
`test_sorulari.py` dosyalarını Colab'a yükleyin (sol panel → Upload).

```python
import chunking, vectorstore, evaluation, pipeline, test_sorulari
print("modüller yüklendi")
```

## Hücre 3 — Veriyi indir

```python
df = pipeline.veri_yukle()
df[["title", "url"]].head(5)
```

Beklenen: `Seçilen: 300 makale`

> Veri seti gated ise hata alırsınız. Tarayıcıdan veri seti sayfasına gidip
> erişim isteyin, ardından `notebook_login()` ile giriş yapın.

## Hücre 4 — Embedding modelini yükle

```python
model, boyut = pipeline.model_yukle()
```

Beklenen: model adı, boyut (768 veya 1024), bağlam uzunluğu.

İlk çalıştırmada model indirilir (birkaç dakika).

## Hücre 5 — Parçalama

```python
kayitlar = pipeline.parcala(df, model)
print()
print("Örnek parça:")
print(kayitlar[0]["chunk_text"][:400])
```

Beklenen: 300 makaleden ~2000-2500 parça, ortalama ~400 token.

**Kontrol edin:** Parça metni okunabilir mi, cümle ortasından kesilmiş mi?

## Hücre 6 — Chunking ayarlarını karşılaştır (isteğe bağlı ama önerilir)

README'de "neden bu ayarı seçtim" sorusuna veri sunar.

```python
for hedef, ortusme in [(200, 30), (400, 60), (600, 90)]:
    k = chunking.makaleleri_parcala(
        df.to_dict("records"), model.tokenizer,
        hedef_token=hedef, ortusme_token=ortusme)
    ist = chunking.istatistik(k, model.tokenizer)
    print(f"hedef={hedef:>3}, örtüşme={ortusme:>2} -> "
          f"{ist['parca_sayisi']:>5} parça, "
          f"makale başına {ist['makale_basina_parca']:>4}, "
          f"ort {ist['token_ortalama']:>3} token")
```

## Hücre 7 — Vektörleştirme

```python
vektorler = pipeline.vektorlestir(kayitlar, model)
```

T4'te ~2000 parça için 2-5 dakika sürer.

## Hücre 8 — ChromaDB'ye indeksle

```python
depo = pipeline.indeksle(kayitlar, vektorler, boyut)
```

Beklenen: `İndekslenen parça: 2xxx`

## Hücre 9 — Hızlı arama denemesi

Test sorularını yazmadan önce sistemin çalıştığını doğrulayın.

```python
vek = pipeline.sorgu_vektoru("diyabet belirtileri nelerdir", model)
for s in depo.ara(vek, k=3):
    print(f"{s['benzerlik']:.4f}  {s['title'][:60]}")
    print(f"          {s['chunk_text'][:120]}...")
    print()
```

**Kontrol edin:** Sonuçlar konuyla ilgili mi? Skorlar makul mü (0.7-0.9)?

## Hücre 10 — Pozitif soru taslakları üret

```python
taslaklar = test_sorulari.soru_taslagi_uret(df, sayi=20)
test_sorulari.taslaklari_yazdir(taslaklar)
```

Bu çıktıyı kopyalayın ve **elle gözden geçirin.**

Önemli: otomatik üretilen sorular makale başlığını birebir tekrarlar; bu
aramayı yapay biçimde kolaylaştırır. Soruları farklı sözcüklerle yeniden
yazmak daha gerçekçi bir değerlendirme sağlar. Örnek:

```
Otomatik : "Baso (Bazofil) nedir?"
Düzenlenmiş: "Kan testinde bazofil değeri neyi gösterir?"
```

Düzenlenmiş listeyi bir sonraki hücreye yapıştırın.

## Hücre 11 — Soruları tanımla

```python
POZITIF = [
    {"soru": "Kan testinde bazofil değeri neyi gösterir?",
     "tip": "pozitif",
     "beklenen_url": "https://www.acibadem.com.tr/ilgi-alani/baso-..."},
    # ... 20 tane
]

SORULAR = test_sorulari.sorulari_birlestir(POZITIF)
print(f"Toplam {len(SORULAR)} soru "
      f"({sum(1 for s in SORULAR if s['tip']=='pozitif')} pozitif, "
      f"{sum(1 for s in SORULAR if s['tip']=='negatif')} negatif)")
```

## Hücre 12 — Aramaları çalıştır

```python
ciktilar = pipeline.sorulari_calistir(SORULAR, depo, model)

print(f"{'tip':<9} {'skor':>7}  soru")
print("-" * 70)
for c in sorted(ciktilar, key=lambda x: -x["en_yuksek_skor"]):
    print(f"{c['tip']:<9} {c['en_yuksek_skor']:>7.4f}  {c['soru'][:50]}")
```

**Bu tablo kritik.** Pozitifler üstte, negatifler altta kümelenmeli. İç içe
geçmişse eşik iyi ayrım yapamayacak demektir.

## Hücre 13 — Eşik analizi

```python
secilen, tablo, ozet = pipeline.esik_analizi(ciktilar)
```

Bu çıktı doğrudan README'ye girecek.

## Hücre 14 — Arama başarımı

```python
basarim = pipeline.arama_basarimi(ciktilar)
```

Recall@1, Recall@3, Recall@5 ve MRR değerleri.

## Hücre 15 — Eşiği test et

```python
esik = secilen["esik"]

for soru in ["diyabet belirtileri nelerdir",          # pozitif olmalı
             "Mars'ta yaşam var mı"]:                  # reddedilmeli
    sonuc = pipeline.cevapla(soru, depo, model, esik)
    print(f"SORU: {soru}")
    if sonuc["cevaplanabilir"]:
        print(f"  ✓ Cevaplanabilir (skor {sonuc['en_yuksek_skor']:.4f})")
        print(f"  Kaynak: {sonuc['kaynaklar'][0]['title'][:60]}")
    else:
        print(f"  ✗ {sonuc['mesaj']} (skor {sonuc['en_yuksek_skor']:.4f})")
    print()
```

## Hücre 16 — Veri setini dışa aktar

```python
veri_df = pipeline.disa_aktar(kayitlar, vektorler)
veri_df.head(3)
```

`vektor_veri_seti.parquet` oluşur — ödevin istediği üç sütunu içerir.

## Hücre 17 — Sonuçları kaydet

README için gereken tüm sayıları tek dosyada toplar.

```python
import json

rapor = {
    "veri": {
        "hastane": pipeline.HASTANE,
        "makale_sayisi": len(df),
        "parca_sayisi": len(kayitlar),
    },
    "chunking": {
        "yontem": "cümle sınırına saygılı sabit pencere",
        "hedef_token": pipeline.HEDEF_TOKEN,
        "ortusme_token": pipeline.ORTUSME_TOKEN,
    },
    "embedding": {
        "model": pipeline.EMBEDDING_MODELI,
        "boyut": boyut,
    },
    "esik": {
        "secilen": secilen["esik"],
        "yakalanan_pozitif": secilen["yakalanan"],
        "reddedilen_negatif": secilen["reddedilen"],
        "yanlis_kabul": secilen["yanlis_kabul"],
    },
    "skor_dagilimi": ozet,
    "arama_basarimi": basarim,
    "esik_tablosu": tablo,
    "soru_sonuclari": [
        {"soru": c["soru"], "tip": c["tip"], "skor": c["en_yuksek_skor"]}
        for c in ciktilar
    ],
}

with open("rapor.json", "w", encoding="utf-8") as f:
    json.dump(rapor, f, ensure_ascii=False, indent=2)

print("rapor.json kaydedildi")
print(json.dumps(rapor["esik"], ensure_ascii=False, indent=2))
```

## Hücre 18 — Dosyaları indir

```python
from google.colab import files
files.download("vektor_veri_seti.parquet")
files.download("rapor.json")
```

---

## Sonrasında

`rapor.json` içindeki sayılarla README hazırlanacak:

- Chunking stratejisi ve gerekçesi
- Embedding modeli, boyutu ve gerekçesi
- Eşik değeri ve analiz tablosu

Ardından veri seti ve kodlar Hugging Face deposuna yüklenecek.