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
29
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
(215)
this model