saturday-labs/turkish-pii-guard-0.8b
Turkish PII Guard 0.8B
Türkçe metindeki kişisel verileri tespit edip yerinde maskeleyen model. Girdiyi alır, talimatın kapsadığı kişisel veriyi köşeli parantezli etiketle değiştirir, metnin geri kalanına dokunmaz.
Bu repo kullanıma hazır tam modeldir — LoRA adaptörü taban modele merge edilmiştir, ayrıca taban model indirmeye gerek yoktur.
Talimat : Metindeki tüm kişisel ve hassas bilgileri uygun etiketlerle maskele.
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]Kullanım alanları: LLM'e veri göndermeden önceki maskeleme katmanı, log temizleme, KVKK/GDPR uyum hattı, veri paylaşımı öncesi anonimleştirme.
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"))
# → müşteri [AD] tc [TCKN] tel [TEL]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)
# → [AD] [TEL] numarasından aradı, ibanı [IBAN]
maskele("Yalnızca IBAN bilgisini maskele. Adı ve telefonu değiştirme.", metin)
# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı [IBAN]
maskele("IBAN'ı açık bırak. Diğer kişisel bilgileri maskele.", metin)
# → [AD] [TEL] numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26
maskele("Bu metinde hiçbir şeyi maskeleme.", metin)
# → Ali Kaya 0532 111 22 33 numarasından aradı, ibanı TR33 0006 1005 1978 6457 8413 26Desteklenen politika biçimleri:
Etiketler — 50
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ırKesme 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]'ınSö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 saatVeri 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.
