Sonuçlar
Eğitim verisinden tamamen bağımsız, elle kurulmuş 1.000 örneklik benchmark üzerinde
satır düzeyi tam eşleşme (çıktının beklenen metinle karakter karakter aynı olması —
tek bir etiket hatası satırın tamamını yanlış sayar):
Table with columns: Model, Tam Eşleşme (1000), Şema-nötr (903)| Model | Tam Eşleşme (1000) | Şema-nötr (903) |
|---|
| cagrigungor/pii-guard-turkish-0.8b | 0.876 | 0.889 |
| cagrigungor/pii-guard-turkish-0.6b | 0.828 | 0.850 |
| cagrigungor/pii-guard-turkish-270m | 0.740 | 0.770 |
| melikegks/turkish-pii-guard-0.8b | 0.731 | 0.810 |
Şema-nötr sütun, [YAS] [CINSIYET] [UYRUK] etiketlerinin maskelenmesini gerektiren 97 satır
hariç tutularak hesaplanır (bu üç etiket her modelin şemasında bulunmadığından modeller arası
adil kıyas bu sütundur). Benchmark halka açıktır ve yeniden üretilebilir:
Benchmark bileşimi: tam maskeleme (350), beyaz liste (200), kara liste (150), kapsam dışı (100),
tuzaklı negatif (200); içinde BÜYÜK HARF, Türkçe ek almış PII, sözle yazılmış numaralar,
çok kişili metinler ve 300-900 karakterlik uzun girdiler işaretli dilimler halinde bulunur.
Kategori kırılımı (bu model): tam maskeleme 0.823 · beyaz liste 0.930 ·
kara liste 0.700 · kapsam dışı 0.970 · negatif 1.000. Zor dilimler: ekli PII 0.879 ·
BÜYÜK HARF 0.811 · uzun metin 0.792 · sözle yazım 0.730.
Eğitim
Table | |
|---|
| Taban model | Qwen/Qwen3.5-0.8B |
| Yöntem | LoRA (r=16, alfa=32), bf16, completion-only loss, Unsloth |
| Bağlam | 768 token |
| Veri | Sentetik Türkçe bankacılık/ERP metni, 53 PII etiketi, ~400.000 örnek |
| Split | Modül düzeyinde train/val ayrımı; benchmark tamamen bağımsız üretim |
Kullanım
Prompt biçimi eğitimle birebir aynı olmalıdır: talimat ve metin tek user turnundadır,
metin Metin: önekiyle verilir.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL = "cagrigungor/pii-guard-turkish-0.8b"
tokenizer = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForCausalLM.from_pretrained(
MODEL, dtype=torch.bfloat16, device_map="auto").eval()
def maskele(metin, talimat="Metindeki tüm kişisel verileri uygun etiketlerle maskele."):
prompt = (f"<|im_start|>user\n{talimat}\n\nMetin: {metin}<|im_end|>\n"
f"<|im_start|>assistant\n")
girdi = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to(model.device)
with torch.inference_mode():
cikti = model.generate(**girdi, max_new_tokens=512, do_sample=False,
eos_token_id=tokenizer.convert_tokens_to_ids("<|im_end|>"),
pad_token_id=tokenizer.eos_token_id)
return tokenizer.decode(cikti[0, girdi["input_ids"].shape[1]:],
skip_special_tokens=True).strip()
print(maskele("müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33"))
do_sample=False kullan; maskeleme belirlenimci bir görevdir.
Politika biçimleri
Model talimatı okur; aynı metin farklı politika altında farklı maskelenir.
Table with columns: Politika, Örnek talimat| Politika | Örnek talimat |
|---|
| Tam maskeleme | "Metindeki tüm kişisel verileri uygun etiketlerle maskele." |
| Beyaz liste | "Sadece IBAN ve telefon numarasını maskele. Gerisi aynen kalsın." |
| Kara liste | "Ad soyad hariç bütün hassas alanları etiketle." |
| Kategori | "Yalnızca özel nitelikli kişisel veriler maskelenecek." |
| Kapsam dışı | Talimatta istenen etiket metinde yoksa çıktı girdiyle aynı kalır. |
Etiketler
53 etiket, dokuz kategoride.
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ış
- Ek almış PII: kesme işaretli ekler ünlü uyumuyla korunur —
Ayşe Yılmaz'ın hesabına havale yap -> [AD]'ın hesabına havale yap
- Sözle yazılmış değerler:
tc kimlik numaram yedi bir dokuz yedi ... -> tc kimlik numaram [TCKN]
- BÜYÜK HARF girdi:
ADIM AHMET TC 12345678901 -> ADIM [AD] TC [TCKN]
- Çok kişili metin: aynı cümledeki farklı kişiler ayrı ayrı maskelenir
- Tuzaklara direnç: fatura/sipariş numarası, şehir adlı projeler, "tc kimlik alanı boş
bırakılamaz" gibi PII kelimesi geçen ama PII içermeyen metinler değiştirilmez
Sınırlar
- Değerlendirme sentetik veriyle yapılmıştır. Eğitim ve benchmark verisi Faker + LLM
üretimidir; gerçek kişi verisi içermez. Gerçek kullanıcı metnindeki performans ölçülmemiştir.
Kendi verinde ölçmeden kritik bir hatta koyma.
- Şema dışı etiket üretebilir. Üretimde 53 etiketlik bir whitelist katmanı öneririz;
şema dışı etiket içeren çıktıyı reddedip insan incelemesine gönder.
- Zayıf dilimler (benchmark kırılımından): kara liste talimatları ve sözle yazılmış
uzun sayı dizileri en düşük skorlu dilimlerdir. Bu dilimlerde çıktı doğrulaması ekle.
- Yalnızca Türkçe. Başka dillerde test edilmedi.
- Karar destek aracı değildir. KVKK/GDPR sorumluluğu kullanandadır; kritik akışlarda
insan denetimi gerekir.
Yazar
Hasan Çağrı Güngör
iletisim@cagrigungor.com — https://finiscode.com
Alıntı
@misc{pii-guard-turkish,
title = {PII Guard Turkish},
author = {Hasan Çağrı Güngör},
year = {2026},
url = {https://huggingface.co/cagrigungor/pii-guard-turkish-0.8b-lora}
}