"""Cevap düzeyinde değerlendirme: belge klasörü + soru dosyası -> çıkarım tanılaması ve cevap doğruluğu. Gerçek belgelerle de aynı şekilde kullanılır; altın SQL gerekmez, yalnızca beklenen cevap yazılır: {"id": "R01", "belge": "rapor.pdf", "soru": "...", "tip": "sayi" | "metin" | "liste" | "cevapsiz", "cevap": 1234.5 | "İzmir" | ["A", "B"] | null, "isaret_serbest": false} Kullanım: python pilot/pilot_calistir.py # kurgusal pilot (pilot/belgeler, pilot/sorular.json) python pilot/pilot_calistir.py --kume agir # hazır küme: pilot | stres | agir | agir_hizli python pilot/pilot_calistir.py --belgeler KLASOR --sorular DOSYA.json --cikti KLASOR [--belge-basina] python pilot/pilot_calistir.py --kume agir_hizli --claude MODEL # LLM arka ucuyla (--openai MODEL, --ollama MODEL) python pilot/pilot_calistir.py --kume agir --ollama qwen2.5-coder:7b --cihaz gpu --sinir 50 Değerlendirme kuralları t2s/qa_eval.py dosyasının başında açıklanmıştır. """ from __future__ import annotations import argparse import json import sys import warnings from pathlib import Path ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT)) warnings.filterwarnings("ignore") from t2s.llm import list_models, load_dotenv, make_backend # noqa: E402 from t2s.qa_eval import SETS, QASet, judge, run_set, value_recall # noqa: E402,F401 (judge/value_recall: geriye uyum) from t2s.settings import Settings # noqa: E402 def main(): ap = argparse.ArgumentParser() ap.add_argument("--kume", choices=sorted(SETS), help="hazır test kümesi") ap.add_argument("--belgeler", default=str(ROOT / "pilot" / "belgeler")) ap.add_argument("--sorular", default=str(ROOT / "pilot" / "sorular.json")) ap.add_argument("--ham", default=str(ROOT / "pilot" / "ham_degerler.json"), help="isteğe bağlı") ap.add_argument("--cikti", default=None) ap.add_argument("--belge-basina", action="store_true", help="her belge için ayrı veritabanı kur; o belgenin soruları yalnız o veritabanında sorulur") ap.add_argument("--claude", nargs="?", const="auto") ap.add_argument("--openai", nargs="?", const="auto") ap.add_argument("--ollama", nargs="?", const="auto") ap.add_argument("--cihaz", choices=["auto", "gpu", "cpu"], default=None, help="Ollama hesaplama aygıtı") ap.add_argument("--anahtar", default=None, help="API anahtarı (varsayılan: ayar dosyası ya da .env)") ap.add_argument("--taban-url", default=None, help="sağlayıcı adresi (varsayılan: ayar dosyası)") ap.add_argument("--sinir", type=int, default=None, help="en fazla bu kadar soru (maliyet denetimi)") ap.add_argument("--yeniden-kur", action="store_true", help="veritabanını önbellekten almadan yeniden kur") args = ap.parse_args() load_dotenv(ROOT / ".env") cfg = Settings() # anahtarlar ve adresler arayüzdeki ayar dosyasından da okunur if args.kume: qs = SETS[args.kume] else: qs = QASet("ozel", Path(args.belgeler), Path(args.sorular), Path(args.ham) if args.ham else None, args.belge_basina) backend, label = "kural", "kural_tabanli" for key, model in (("claude", args.claude), ("openai", args.openai), ("ollama", args.ollama)): if model: kk, base = (args.anahtar or cfg.key(key) or None), (args.taban_url or cfg.base(key)) if model == "auto": model = list_models(key, kk, base)[0].id dev = args.cihaz or cfg.conn("ollama").get("cihaz") backend, label = make_backend(key, model, kk, base, device=dev if key == "ollama" else None), f"{key}:{model}" out = Path(args.cikti) if args.cikti else ROOT / "outputs" / "qa" / qs.key / label.replace(":", "_").replace("/", "_") def prog(k, n, r): if k % 25 == 0 or k == n: print(f" {k}/{n}", flush=True) res = run_set(qs, backend, out, progress=prog, limit=args.sinir, reuse_db=not args.yeniden_kur) summary = res["ozet"] # geriye uyum: eski çıktı adı (out / "pilot_sonuclari.json").write_text((out / "sonuclar.json").read_text(encoding="utf-8"), encoding="utf-8") show = {k: v for k, v in summary.items() if k not in ("cikarim", "aileye_gore", "belge_turune_gore")} print(json.dumps(show, ensure_ascii=False, indent=1)) print(f"\nSonuçlar: {out / 'sonuclar.json'}") bad = [r for r in res["kayitlar"] if not r["dogru"]] print(f"\nYanlışlar ({len(bad)}):") for r in bad[:60]: print(f" {r['id']} [{r['tip']}] {r['soru'][:70]} -> {r['aciklama']} | {str(r['sql'])[:110]}") if __name__ == "__main__": main()