decider-4b-tr-judge-ttl: Türkçe RAG relevance judge ve cache TTL sınıflandırıcısı
English summary. A fourth LoRA round (rank 64, merged into the bf16 weights) on
hayriyigit/decider-4b-tr-judge that serves two decisions from one model:
(1) a RAG relevance judge (noul: does the document carry information that contributes to the answer? partial evidence counts) and
(2) a cache TTL classifier (choice: realtime / hourly / daily / stable). New training data: NoMIRACL-tr (human relevance labels),
BoolQ-tr, LLM-written Turkish pairs for the categories a load test showed missing, and Turkish web pages labeled by two teacher
models. On the human-labeled NoMIRACL-tr test, relevant-passage recall goes 0,678 → 0,726 with
non-relevant 0,837 → 0,823 (AUROC 0,837 → 0,862): a small gain, and the
model still rejects about a quarter of the passages people judged relevant. TTL accuracy 0,971 on 274
held-out pages (teacher labels, few hourly / realtime pages).
hayriyigit/decider-4b-tr-judge üzerine dördüncü bir LoRA turu. Aynı model
iki kararı veriyor:
- Relevance judge (
noul): RAG'de getirilen belge, sorunun cevabına doğrudan katkı sağlayan bilgi içeriyor mu? Kısmi cevap yeterlidir; bilgi sorudaki varlığa, kuruma, özelliğe ve döneme ait olmalıdır. - Cache TTL (
choice): cache'e yazılacak bir sayfanın etrafında kurulduğu en hızlı değişen bilgi ne sıklıkla değişir?realtime(5 dakika),hourly(6 saat),daily(3 gün),stable(30 gün).
Kullanım
import sys
from huggingface_hub import snapshot_download
path = snapshot_download("hayriyigit/decider-4b-tr-judge-ttl")
sys.path.insert(0, path)
from decider.infer import Decider
d = Decider(path)
# 1. relevance judge
JUDGE = {"relevant": {"type": "noul", "instructions": JUDGE_INSTRUCTION}}
state = {"question": "Ürün A'nın azami hızı nedir?",
"document": "[2026-08-14] Ürün A teknik özellikleri\n\n…gövde…", # en fazla 4000 karakter
"today": "2026-10-07"} # today en sonda
p_yes = d.system_one(state, JUDGE)["answers"]["relevant"]["noul"]
# 2. cache TTL
TTL = {"ttl": {"type": "choice", "instructions": TTL_INSTRUCTION, "criteria": TTL_CRITERIA}}
state = {"question": "Şehir Y'de bugün hava nasıl?",
"document": "Şehir Y hava durumu\n\n…sayfa metni…", # en fazla 8000 karakter
"today": "2026-10-07"}
answer = d.system_one(state, TTL)["answers"]["ttl"]
Soru metinleri eğitimdekiyle birebir aynı gönderilmelidir.
JUDGE_INSTRUCTION:
document,questionsorusunun cevabına doğrudan katkı sağlayan bilgi içeriyor mu? Bilgi, soruda geçen varlığa, kuruma, özelliğe ve döneme ait olmalı; kısmi cevap yeterlidir. Aynı türden bilginin başka bir varlık, kurum ya da dönem için verilmesi; doğru varlık için başka bir metrik ya da alt konu;todaytarihine göre yanlış dönem; yalnızca başlık, menü, bağlantı listesi, çerez ya da kişisel veri metni; cevaba katkısı olmayan genel anlatım HAYIR'dır. Yalnızca belgeye dayan.
TTL_INSTRUCTION:
Bu sayfa önbelleğe yazılacak. Sayfanın etrafında kurulduğu en hızlı değişen bilgi ne sıklıkla değişir? Sayfanın yaşı değil, bilginin değişme hızı belirler: biten bir olayı anlatan eski bir haber stable, süren bir olayın canlı akışı hourly olur.
questionyalnızca bağlamdır; aynı sayfa her soruda aynı sınıfı alır.
TTL_CRITERIA (anahtar → seçenek metni):
realtime: realtime (5 dakika): dakikalar içinde değişen bilgi; döviz ve altın kuru, borsa ve kripto fiyatı, canlı skor, anlık trafikhourly: hourly (6 saat): gün içinde güncellenen bilgi; süren olayın canlı akışı, son dakika, bugünün hava tahmini, gün içi sefer durumudaily: daily (3 gün): günler içinde değişebilen bilgi; fiyat listesi, kampanya, çeyrek sonuçları, etkinlik takvimi, seans, ilanstable: stable (30 gün): haftalarca değişmeyen bilgi; tanım, tarihçe, rehber, ürün teknik özellikleri, mevzuat, biten olayın haberi
Girdi biçimi:
- State alanları
question,document,todaysırasıyla verilmeli;todayen sonda. document:[yayın tarihi] başlık, boş satır, gövde. Judge için 4000, TTL için 8000 karakter. Tarihi olmayan belgebaşlık, boş satır, gövde biçiminde verildi; TTL sayfaları eğitimde tarihsiz verildi.- TTL kararını argmax yerine risk sınırlı vermek için: her aday süre için "gerçek sınıf bundan kısa" olasılığını toplayın ve bu olasılığın ε'nin altında kaldığı en uzun süreyi seçin (sıra: realtime < hourly < daily < stable). ε'yi kendi verinizde seçin.
Temperature değerleri (decider_config.json): noul 0,991, choice 0,302; eğitim karışımından ayrılmış 1.415 noul ve
85 choice kararında fit edildi. Choice için 85 karar azdır ve 1'in çok altındaki değer (modelin TTL
olasılıklarını keskinleştirir) bu küçük örneklemden gelir. Üretimdeki önsel farklıdır (judge'da sonuçların çoğu relevant, TTL'de
stable çoğunluk); temperature, threshold ve ε kendi verinizde yeniden seçilmelidir.
Değerlendirme
Test satırları eğitimde görülmedi. "Önce" başlangıç modelidir (decider-4b-tr-judge), aynı girdi biçimi ve aynı soru metinleriyle
ölçüldü. Toplam 21.050 karar: doğruluk 0,882 → 0,887, ECE 0,062 → 0,054.
Relevance judge
| Test satırı | Doğru cevap | Karar | Önce | Sonra |
|---|---|---|---|---|
| NoMIRACL-tr: insanın relevant bulduğu passage (bağımsız) | evet | 704 | 0,676 | 0,713 |
| NoMIRACL-tr: retrieval ile gelmiş, insanın relevant bulmadığı passage | hayır | 1.301 | 0,837 | 0,832 |
| BoolQ-tr: evet/hayır sorusunu karara bağlayan passage | evet | 400 | 0,677 | 0,998 |
| SQuAD 2.0-tr dev: cevaplanabilir (bağımsız) | evet | 5.928 | 0,887 | 0,892 |
| SQuAD 2.0-tr dev: cevaplanamaz (bağımsız) | hayır | 5.945 | 0,832 | 0,808 |
| Sentetik v2: cevap belgede | evet | 53 | 1,000 | 1,000 |
| Sentetik v2: evet/hayır ya da eğilim sorusu, belgede kanıt var | evet | 47 | 0,851 | 0,979 |
| Sentetik v2: açık uçlu soru, belge bir kısmını veriyor | evet | 46 | 0,870 | 0,978 |
| Sentetik v2: cevap başka sözcük ya da birimle | evet | 48 | 0,812 | 0,979 |
| Sentetik v2: başka varlığın aynı bilgisi | hayır | 43 | 1,000 | 1,000 |
| Sentetik v2: başka kurumun aynı bilgisi | hayır | 42 | 1,000 | 0,976 |
| Sentetik v2: doğru varlık, başka metrik | hayır | 41 | 1,000 | 1,000 |
Sentetik v2: yanlış dönem (today'e göre) | hayır | 34 | 0,941 | 0,912 |
| HotpotQA-tr: kısmi kanıt | evet | 500 | 0,952 | 0,964 |
| HotpotQA-tr: konuyla ilgili, katkısız paragraflar | hayır | 500 | 0,928 | 0,920 |
| Sentetik v1: iki parçalı soru, bir parçası belgede | evet | 234 | 0,936 | 0,919 |
| Sentetik v1: başka yer/yön ya da yalnızca başlıklar | hayır | 113 | 0,920 | 0,938 |
| Sentetik v1: başka varlık | hayır | 118 | 0,992 | 0,975 |
| Sentetik v1: belgede olmayan öznitelik | hayır | 127 | 0,961 | 0,953 |
| Sentetik v1: yanlış dönem | hayır | 113 | 0,974 | 0,982 |
| 2WikiMultihopQA-tr: aynı öznitelik, başka varlık | hayır | 600 | 1,000 | 1,000 |
| Şablon: başlık listesi | hayır | 86 | 1,000 | 1,000 |
En az 2 puan değişen değerler kalın yazıldı. NoMIRACL-tr tümü: AUROC 0,837 → 0,862.
Cache TTL
| Sınıf | Sayfa | Önce | Sonra |
|---|---|---|---|
realtime | 18 | 0,778 | 1,000 |
hourly | 17 | 0,471 | 0,824 |
daily | 34 | 0,500 | 0,971 |
stable | 205 | 0,976 | 0,981 |
Toplam doğruluk 0,872 → 0,971, ECE 0,125 → 0,024. "Önce" modeli TTL için eğitilmemişti. Test sayfaları eğitim sayfalarından site bazında ayrıldı (sentetik sayfalar tek tek).
Nasıl okunmalı
- İnsan etiketli NoMIRACL-tr'de kazanç küçük. Relevant passage'ları kabul etme oranı 0,678 → 0,726; model insanların relevant bulduğu passage'ların hâlâ yaklaşık dörtte birini reddediyor. Relevant olmayanları bilme 0,837 → 0,823. Bu set, modelin eğitim verisiyle aynı yöntemle kurulmamış tek relevance setidir; canlı web için en gerçekçi gösterge budur.
- BoolQ-tr ve sentetik v2'deki büyük kazançlar eğitim dağılımı içinde. BoolQ-tr'nin bütün satırları "evet"tir; model bu kaynağın soru biçimini ve passage'larını eğitimde gördü. 0,998 bu yüzden bir üst sınırdır.
- Bağımsız SQuAD 2.0-tr'de cevaplanamazları bilme düştü (0,832 → 0,808): model biraz daha "evet"e kaydı.
- TTL etiketleri insan etiketi değildir. Doğruluk, iki teacher modelin uyuştuğu etiketlerle uyumu ölçer.
hourly(17 sayfa) verealtime(18 sayfa) test sayfaları azdır; tek bir sayfa yaklaşık 6 puan eder. - "Tehlikeli hata" ölçülmedi. Gerçekte daha kısa ömürlü bir sayfaya daha uzun TTL verme oranı bu raporda yok; bunun için satır bazında tahminler ve insan onaylı bir altın set gerekir.
- Genel karar becerisinin (bev, jev-bench vb.) korunup korunmadığı ölçülmedi; eğitimde 7.000 replay satırı vardı.
Validation
Eğitim karışımından belgeye göre gruplanarak ayrılmış 1.500 satır (judge ve TTL birlikte): doğruluk 0,935, cross-entropy 0,141.
Eğitim verisi
| Kaynak | Eğitimdeki satır |
|---|---|
| NoMIRACL-tr: insan etiketli relevant / relevant olmayan passage'lar | 11.315 |
| HotpotQA-tr: tüm hop'lar, tek hop (kısmi: evet), katkısız distractor'lar | 6.000 |
| Sentetik v1 (önceki tur) | 6.000 |
| Replay: bev-decision-150K-tr (KL) | 4.000 |
| SQuAD 2.0-tr | 4.000 |
| Sentetik v2: rehberin kategorileri (tam, kısmi evet/hayır, kısmi açık uçlu, farklı ifade / varlık, kurum, metrik, dönem) | 3.027 |
| Replay: bev-decision-150K, İngilizce (KL) | 3.000 |
| 2WikiMultihopQA-tr: doğru varlık / başka varlık | 3.000 |
| BoolQ-tr: evet/hayır soruları ve kanıt passage'ı (hepsi evet) | 2.983 |
| TTL: FineWeb-2 ve sentetik sayfalar, iki teacher'ın uyuştuğu etiketler | 2.762 |
| Şablon sayfalar (başlık listesi, menü, çerez/KVKK, JS iskeleti) | 2.000 |
| MuSiQue-tr: tüm hop'lar | 1.500 |
| Konu dışı belgeler | 1.000 |
- Önceki turun kaynakları (HotpotQA, 2WikiMultihopQA, MuSiQue, sentetik v1, şablon, konu dışı, SQuAD) yaklaşık yarı oranda yeniden örneklendi; yeni kaynakların hepsi kullanıldı.
- TTL satırları:
stablesayfalar (iki teacher'ın uyuştuğu sayfaların %73'ü) 1.200'e indirildi.realtime,hourlyvedailysayfalar iki kez kullanıldı: bir kez teacher'ın yazdığı kullanıcı sorusuyla, bir kez soru yerine sayfa başlığıyla. Amaç, etiketin sorudan değil sayfadan gelmesi. Sınıf dağılımı: realtime 506, hourly 408, daily 648, stable 1.200. - Judge satırlarının ~%17'sinde soru anahtar kelime sorgusu biçimindeydi (sentetik v2'de writer'ın yazdığı sorgu, diğerlerinde kural tabanlı dönüşüm).
- Değerlendirme setleri dışarıda tutuldu. Belirli bir değerlendirme setinin (judge set) adları ve bir yük testinin soru konuları, eğitim satırlarından ve sentetik üretimden çıkarıldı.
Eğitim
| Başlangıç | hayriyigit/decider-4b-tr-judge (e4ace26) ← decider-4b-tr-rag ← decider-4b-tr ← Mapika/decider-4b v2.1 |
| Yöntem | LoRA rank 64, alpha 128; attention ve MLP projeksiyonları; 121,9M trainable parametre; bf16 ağırlıklara merge edildi |
| Loss | Türkçe satırlarda label'a cross-entropy; replay satırlarında frozen başlangıç modelinin cevap dağılımına (KL) |
| Program | 1 epoch, 426 adım × 65.536 token (68,178 prompt satırı, 31,489,592 token); learning rate 1e-4, %5 warmup, cosine |
| Donanım ve süre | 1 × RTX 5090 (32 GB), bf16, gradient checkpointing, causal-conv1d; eğitim 2 sa 20 dk (~4.030 token/s) |
Eğitim ve değerlendirme kayıtları training/ klasöründe.
Sınırlamalar
- Canlı web sonuçlarında, kullanıcının judge set'inde ve gerçek cache trafiğinde henüz ölçülmedi.
- Judge eğitim verisinin çoğu Vikipedi paragraflarının makine çevirisi ve LLM üretimi belgelerdir. TTL sayfaları eski web taramalarından ve LLM üretiminden gelir; etiketleri teacher modellerindir.
- Soru metinleri ve girdi biçimi değişirse sonuçlar değişir.
- Genel karar becerisi ve FP8 bu model için ölçülmedi.
Lisans
Taban modelin ve eğitim verilerinin lisansları farklıdır; ayrıntılar LICENSE.md'de.