Sonuçlar
Eğitim verisinden bağımsız, elle kurulmuş benchmark üzerinde satır düzeyi tam
eşleşme — çıktının beklenen metinle karakter karakter aynı olması; tek etiket
hatası satırın tamamını yanlış sayar.
şema-nötr (903 satır) 0,922
Şema-nötr, [YAS] [CINSIYET] [UYRUK] maskelemesi gerektiren 97 satır hariç
tutularak hesaplanır — o üç etiket bu şemada bulunmaz.
Benchmark halka açık ve yeniden üretilebilir:
Kullanım
Talimatı ve metni yazmanız yeterli. Modelin kendi sistem promptu chat
template'e gömülü; sistem mesajı vermezseniz otomatik eklenir.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL = "melikegks/turkish-pii-guard-0.8b"
tok = AutoTokenizer.from_pretrained(MODEL)
tok = getattr(tok, "tokenizer", tok)
mdl = AutoModelForCausalLM.from_pretrained(
MODEL, dtype=torch.bfloat16, device_map="auto").eval()
def maskele(talimat, metin, max_new=768):
p = tok.apply_chat_template(
[{"role": "user", "content": f"{talimat}\n\n{metin}"}],
tokenize=False, add_generation_prompt=True, enable_thinking=False)
enc = tok(p, return_tensors="pt", add_special_tokens=False).to(mdl.device)
stop = [tok.eos_token_id, tok.convert_tokens_to_ids("<|im_end|>")]
with torch.inference_mode():
g = mdl.generate(**enc, max_new_tokens=max_new, do_sample=False,
eos_token_id=stop, pad_token_id=tok.pad_token_id)
o = tok.decode(g[0, enc["input_ids"].shape[1]:], skip_special_tokens=True).strip()
return o.split("</think>", 1)[-1].strip() if "</think>" in o else o
print(maskele("Metindeki tüm kişisel bilgileri maskele.",
"müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33"))
do_sample=False kullanın. Maskeleme belirlenimci bir görevdir.
Kendi sistem promptunuzu verirseniz gömülü olan yerine o kullanılır — ama
model bu promptla eğitildi, değiştirmek kaliteyi düşürür.
Kapsam talimatları
Talimat çıktıyı doğrudan değiştirir — aynı metin farklı politikalarla farklı
maskelenir:
metin = "Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26"
maskele("Metindeki tüm kişisel bilgileri maskele.", metin)
maskele("Yalnızca IBAN bilgisini maskele. Adı ve telefonu değiştirme.", metin)
maskele("IBAN'ı açık bırak. Diğer kişisel bilgileri maskele.", metin)
maskele("Bu metinde hiçbir şeyi maskeleme.", metin)
Desteklenen politika biçimleri:
Table with columns: Politika, Örnek talimat| Politika | Örnek talimat |
|---|
| Tam maskeleme | "Metindeki tüm kişisel bilgileri maskele." |
| Beyaz liste | "Yalnızca IBAN ve telefon numarasını maskele." |
| Kara liste | "Ad soyad hariç her şeyi maskele." |
| Kategori | "Sadece finansal bilgileri maskele." |
| Rol | "Log temizleme hattında çalışıyorsun. Tüm PII'yi gizle." |
| Hibrit | "Maaşı gizle, ad soyad ve telefona dokunma." |
| Kapsam dışı | "Bu metinde hiçbir şeyi maskeleme." |
Etiketler — 50
Table with columns: Kategori, Etiketler| Kategori | Etiketler |
|---|
| Kimlik | [AD] [TCKN] [DOGUM_TARIHI] [DOGUM_YERI] [ANNE_ADI] [ANNE_KIZLIK] [BABA_ADI] [PASAPORT_NO] [EHLIYET_NO] [SGK_NO] [IMZA] |
| Finansal | [IBAN] |
Türkçeye özgü davranış
Tetikleyici kelime span'e girmez, ek span'in dışında kalır.
telefonum 0532 111 22 33 dır → telefonum [TEL] dır
Kesme işaretli ekler korunur. Ünlü uyumu, ünsüz sertleşmesi ve kaynaştırma
harfi değerin son sesine göre uygulanır.
Ahmet'e · Ayşe'ye · Tunç'un · [TEL]'den · [AD]'ın
Sözle yazılmış değerler de maskelenir.
kart güvenlik kodum yedi sıfır bir → kart güvenlik kodum [CVV]
Biçime değil bağlama bakar. 16 haneli her sayı kart, 11 haneli her sayı
TCKN değildir.
sipariş numarası 1234567890123456 kaydı → (değişmez)
işyeri kira bedeli 72.100,22 TL → (değişmez)
Eğitim
taban model Qwen/Qwen3.5-0.8B
yöntem LoRA r=32 α=64, bf16
eğitilebilir 21.645.312 parametre (%2,47)
veri 667.901 örnek, tamamen sentetik
adım 5.000 · efektif batch 64 · max_length 1024
LR 1e-4 cosine → 0
donanım A100 80GB, ~4 saat
Veri 50 etiketli ve tamamen sentetiktir; gerçek kişilere ait kayıt içermez.
Düz metin ve yapısal biçimler bir arada: paragraf, e-posta, dilekçe,
transkript, SMS, mesajlaşma, CRM notu, form, sağlık kaydı, JSON, XML, YAML,
CSV, log, OCR çıktısı.
Sınırlar
Sentetik veri. Eğitim ve değerlendirme verisi üretilmiştir; gerçek kişi
verisi içermez. Gerçek kurumsal metindeki performans ölçülmemiştir. Kritik bir
hatta almadan önce kendi verinizle örneklem alarak doğrulayın.
Şema dışı etiket üretebilir. Üretimde 50 etiketlik bir whitelist katmanı
önerilir; şema dışı etiket içeren çıktı reddedilip insan incelemesine
gönderilmelidir. Geçersiz etiketi metne geri çevirmeyin — maskelenmiş veriyi
açığa çıkarır.
Prompt biçimi eğitimle aynı olmalıdır. Chat template'i kullanın; ham dize
kurmayın.
Yalnızca Türkçe. Başka dillerde test edilmemiştir.
Karar destek aracı değildir. KVKK/GDPR sorumluluğu kullanandadır; kritik
akışlarda insan denetimi gerekir.
Alıntı
@misc{turkish-pii-guard-2026,
title = {Turkish PII Guard: Instruction-conditional PII masking for Turkish},
author = {Melike Göksu Tanrıverdi},
year = {2026},
url = {https://huggingface.co/melikegks/turkish-pii-guard-0.8b}
}
Lisans
Apache 2.0. Taban model Qwen/Qwen3.5-0.8B kendi lisansına tabidir.