Text-to-SQL / pilot /pilot_calistir.py
SevdanurGenc's picture
Upload 466 files
a72d1cf verified
Raw History Blame Contribute Delete
4.73 kB
"""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()