Türkçe metindeki kişisel verileri tespit edip yerinde maskeleyen 0.8B parametreli
model. Girdiyi alır, kişisel veriyi köşeli parantezli etiketle değiştirir, metnin
geri kalanına dokunmaz.
Girdi : Ahmet Yıldız 0542 321 45 67 numarasından aradı, ibanı TR12 0001 2000 0034 5678 9012 34
Çıktı : [AD] [TEL] numarasından aradı, ibanı [IBAN]
Bir LLM'e veri göndermeden önceki maskeleme katmanı, log temizleme ve KVKK/GDPR
veri minimizasyonu için tasarlandı. 50 PII etiketi tanır.
En önemli özelliği: talimatı okur. Aynı metin, farklı politika altında farklı
maskelenir — "yalnızca IBAN'ı gizle", "telefonu açık bırak, gerisini maskele" gibi
kapsam talimatlarına uyar.
Sonuçlar
Set
Precision
Recall
F1
Exact Match
Test seti A
%99,584
%99,940
%99,762
%99,220
Test seti B
%99,493
%99,902
%99,697
%99,180
Final Kör Holdout
%99,500
%99,920
%99,709
%99,320
Metrikler entity düzeyindedir: her maskelenen varlık ayrı sayılır.
Exact Match, çıktının beklenen metinle karakter karakter aynı olması demektir.
Kullanım
python
1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
34MODEL ="melikegks/turkish-pii-guard-0.8b"56tokenizer = AutoTokenizer.from_pretrained(MODEL)7model = AutoModelForCausalLM.from_pretrained(8 MODEL, dtype=torch.bfloat16, device_map="auto"9).eval()101112defmaskele(metin, talimat=None, max_new_tokens=256):13 talimat = talimat or(14"Metindeki tüm kişisel ve hassas bilgileri uygun etiketlerle "15"maskele. Diğer kısımları değiştirme."16)17 mesajlar =[18{"role":"system","content": talimat},19{"role":"user","content": metin},20]21 prompt = tokenizer.apply_chat_template(22 mesajlar, tokenize=False, add_generation_prompt=True,23 enable_thinking=False,24)25 girdi = tokenizer(prompt, return_tensors="pt",26 add_special_tokens=False).to(model.device)2728with torch.inference_mode():29 cikti = model.generate(30**girdi,31 max_new_tokens=max_new_tokens,32 do_sample=False,# maskeleme belirlenimci olmalı33 eos_token_id=tokenizer.convert_tokens_to_ids("<|im_end|>"),34 pad_token_id=tokenizer.pad_token_id,35)3637 yeni = cikti[0, girdi["input_ids"].shape[1]:]38return tokenizer.decode(yeni, skip_special_tokens=True).strip()394041print(maskele("müşteri Ayşe Yılmaz tc 12345678901 tel 0532 111 22 33"))42# → müşteri [AD] tc [TCKN] tel [TEL]
do_sample=False kullan. Maskeleme belirlenimci bir görev; örnekleme
tutarsız çıktı üretir.
Kapsam talimatları
Talimat çıktıyı doğrudan değiştirir:
python
1metin ="Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26"23maskele(metin)4# → [AD] [TEL] numarasından aradı, ibanı [IBAN]56maskele(metin,"Yalnızca IBAN bilgisini maskele. Adı ve telefonu değiştirme.")7# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı [IBAN]89maskele(metin,"IBAN'ı açık bırak. Diğer kişisel bilgileri maskele.")10# → [AD] [TEL] numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 261112maskele(metin,"Bu metinde sadece KVKK madde 6 kapsamındaki özel nitelikli verileri maskele.")13# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26
Desteklenen politika biçimleri:
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."
Talimat verilmezse tam maskeleme varsayılır, ama her zaman açık bir talimat ver —
model talimat üzerine eğitildi.
Bağlam ayrımı. Aynı biçimdeki sayı, bağlama göre farklı sonuç verir:
vergi numaram 9840032179 ile fatura kesilsin → vergi numaram [VERGI_NO] ile fatura kesilsin
gtip kodu 9840032179 ile gümrük beyanı açılsın → değişmez
kartın arkasındaki güvenlik kodu 732 → kartın arkasındaki güvenlik kodu [CVV]
şube kodu 732 ve işlem kodu 419 → değişmez
Yazım varyasyonu. İsimler küçük harfle de tanınır, kısaltmalar desteklenir
(tcm, tc no, tcsi, telim, ibanım, vkn), bozuk Türkçe girdi çalışır.
Sınırlar ve bilinen sorunlar
Bunları okumadan üretime alma.
1. Değerlendirme tamamen sentetik
Eğitim ve test verisinin tamamı sentetiktir; gerçek kişilere ait kayıt
içermez. Üç test seti de aynı üreticiden gelir. Yukarıdaki skorlar
dağılım içi başarımdır. Gerçek kullanıcı metnindeki performans
ölçülmemiştir ve daha düşük olması beklenir.
Kendi verinde ölçmeden kritik bir hatta koyma.
2. Şema dışı etiket üretebilir
Model bazen 50 etiketin dışında bir etiket uyduruyor — genellikle metindeki
komşu karakter dizisinden kurarak (RoHS → [ROHS_NO], color → [COLOR]).
5.000 örnekte 9 adet görüldü (%0,18). Üretimde bir whitelist katmanı öneririz:
python
1import re
23GECERLI_ETIKETLER ={"[AD]","[TCKN]","[TEL]","[IBAN]"}# 50 etiketin tamamı45defwhitelist_uygula(cikti):6"""Şema dışı etiket varsa satırı güvenli tarafa çeker."""7 uydurma =[e for e in re.findall(r"\[[A-Z_]+\]", cikti)8if e notin GECERLI_ETIKETLER]9if uydurma:10returnNone# reddet veya insan incelemesine gönder11return cikti
Metrik raporlarken ham model skoru ile whitelist sonrası sistem skoru
ayrı verilmelidir.
3. Değişmemesi gereken metni bazen değiştirir
PII içermeyen satırlarda doğruluk %98,8 (5.000 örnekte 1.871 böyle satırın
22'si). Bu, recall'u %99,9'a çıkarmanın bedelidir. Kaçırılan bir TCKN veri
ihlali, fazladan maskelenen bir kelime kozmetik sorundur — takas bilinçlidir.
4. Uzun metin
max_length=512 token ile eğitildi. Daha uzun metinleri cümle veya paragraf
bazında bölerek ver.
5. Yalnızca Türkçe
Başka dillerde test edilmedi.
6. Karar destek aracı değildir
Bu model bir veri minimizasyonu aracıdır, uyumluluk garantisi değildir.
KVKK/GDPR sorumluluğu kullanandadır. Yasal veya güvenlik açısından kritik
akışlarda insan denetimi gerekir.
Eğitim
Taban model
Qwen/Qwen3.5-0.8B-Base
Yöntem
LoRA (r=32, α=64), bf16, completion-only loss
Bağlam
512 token, packing yok
Veri
Sentetik Türkçe fintech/ERP metni, 50 PII etiketi, ~450.000 örnek
Split
Modül/şablon düzeyinde — aynı cümle kalıbı hem train hem test'e düşmez
Checkpoint seçimi
eval_loss ile değil, entity F1 ile; regresyon guardrail'leriyle
Yayım
LoRA adaptörü taban modele merge edildi — bu repo tam modeldir
Eğitim verisi, ölçülen model hatalarına göre kademeli olarak geliştirildi:
her turda hata dağılımı çıkarıldı, eksik kalan cümle aileleri ve etiket
bağlamları hedefli olarak üretildi, sonuç aynı dondurulmuş test setinde
yeniden ölçüldü.