tr-factbench-gemma-atomizer

Turkish proposition decomposition (claim atomization) QLoRA adapter for google/gemma-4-E2B-it.

This adapter serves as Component 0 (Propositional Atomizer) in the TR-FactBench cascading hybrid factuality verification architecture. It decomposes complex, multi-clause Turkish claims into independent, self-contained atomic propositions while restoring elided subjects and modifiers (subject elision restoration).

Model Details

Property Value
Base model google/gemma-4-E2B-it
Method QLoRA (4-bit NF4 + PEFT LoRA)
LoRA rank ($r$) 16
LoRA alpha ($\alpha$) 32
LoRA dropout 0.05
Task type CAUSAL_LM (Structured JSON Proposition Generation)
Output format {"atoms": ["...", "..."]}
Coverage on Gold-480 480 / 480 (100.0%) valid JSON decompositions
Total atoms on Gold-480 998 atomic propositions (Mean: 2.08 atoms/claim)

Key Capabilities

  1. Coordinative Splitting: Splits compound Turkish claims along conjunction boundaries (ve, ancak, fakat, ayrıca, ;, .).
  2. Subject & Noun-Phrase Restoration (Özne ve Tamlayıcı Restorasyonu): Reconstructs dropped subjects or shared genitive modifiers in subsequent clauses without hallucinating external facts.
  3. Over-Segmentation Prevention: Preserves relative clauses (sıfat-fiil) and conditional clauses (şart kipi) intact so that predicate semantics remain undistorted.

Performance in the TR-FactBench Pipeline

Evaluation Metric / Stage Score / Result
JSON Validity & Coverage (TR-FactBench Gold-480) 100.0% (480/480)
Standalone K2 Atomic NLI (mDeBERTa-v3 + Soft-Prob Avg) 80.42% Accuracy (0.8038 Macro-F1)
Cascading Hybrid Pipeline (K1 + K2 + Llama-3.3-70B V4 Judge) 93.13% Accuracy (0.9315 Macro-F1, 0.9092 MCC)
Out-of-Domain (OOD) Generalizability (Medical, Legal, Finance - 48 cases) 100.0% (48/48)

Usage

import json
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

BASE_MODEL = "google/gemma-4-E2B-it"
ADAPTER_REPO = "angeldust007/tr-factbench-gemma-atomizer"

SYSTEM_PROMPT = (
    "Türkçe bir iddiayı bağımsız doğrulanabilir atomik önermelere ayır. "
    "Her atom tek başına anlaşılır olmalı. Ortak özne, nesne veya tamlayıcı "
    "ikinci bir önermede düşürülmüşse, onu iddianın kendi içindeki bilgiden yeniden kur. "
    "Özneleri veya baş ögeleri yeniden kurarken kelime eksiltme, kısaltma veya kırpma yapma; "
    "iddiadaki isim ve sıfat tamlamalarını tam olarak koru. "
    "Her atom dilbilgisel olarak eksiksiz ve öznesi açık bir cümle olmalıdır. "
    "Yeni bilgi ekleme. Olumsuzluk, koşul, modalite, sayı, zaman, karşılaştırma ve "
    "kapsam ifadelerini koru. Koşullu tek bir önerme sırf birden fazla fiil içeriyor diye "
    "bölünmemelidir. İddia zaten atomikse değiştirmeden tek atom döndür. "
    "BİR cümlenin içindeki yan cümleler veya sıfat tamlamaları ayrı atom YAPILMAZ; "
    "yalnızca 've', 'ayrıca', 'öte yandan', 'bununla birlikte', 'ancak', 'fakat', "
    "noktalı virgül veya açık nokta gibi koordinasyon sınırlarında böl. "
    'Yalnızca {"atoms": ["..."]} biçiminde geçerli JSON üret. /no_think'
)

quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)

tokenizer = AutoTokenizer.from_pretrained(ADAPTER_REPO)
base_model = AutoModelForCausalLM.from_pretrained(
    BASE_MODEL,
    quantization_config=quant_config,
    device_map="auto",
    torch_dtype=torch.bfloat16,
)
model = PeftModel.from_pretrained(base_model, ADAPTER_REPO)
model.eval()

claim = (
    "Kasko sigortasında Dar Kasko teminat gruplarının yalnız bir bölümünü, "
    "Kasko ise tamamını kapsar; zorunlu trafik sigortası üçüncü kişilere "
    "verilen maddi ve bedensel zararları güvence altına alır."
)

messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {"role": "user", "content": json.dumps({"claim": claim}, ensure_ascii=False)},
]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    output_ids = model.generate(**inputs, max_new_tokens=256, do_sample=False)

generated = tokenizer.decode(output_ids[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(generated)
# -> {"atoms": ["Kasko sigortasında Dar Kasko teminat gruplarının yalnız bir bölümünü kapsar.", "Kasko sigortası tamamını kapsar.", "Zorunlu trafik sigortası üçüncü kişilere verilen maddi ve bedensel zararları güvence altına alır."]}

Citation

@misc{dalga2026trfactbench,
  author = {Dalga, Engin and Ball{\i}, Serkan},
  title  = {{TR-FactBench}: A Turkish Source-Grounded Factuality Benchmark and Cascading Hybrid Verification Architecture},
  year   = {2026},
  url    = {https://github.com/EngindalgaMaku/tr-factbench-k2-nli}
}
Downloads last month
20
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for angeldust007/tr-factbench-gemma-atomizer

Adapter
(210)
this model