Bugün ilk açık dil modelimiz piimask'i yayınladık. Türkçe ve İngilizce'de kişisel veriyi (PII) tespit eden 0.5B'lik bir model — ve tamamen sizin makinenizde çalışıyor: cloud yok, API anahtarı yok, veri cihazdan dışarı çıkmıyor. Hem model hem de değerlendirme (eval) seti artık Hugging Face'te.
Bu yazı modelin arkasındaki hikâye — çözümün modelde olmadığı kısım da dahil.
Neden minik, yerel bir model
PII maskeleme dar ve iyi tanımlı bir iş. Yine de bugünkü refleks, metni bir frontier LLM'e gönderip "hassas kısımları temizle" demek. Bu yavaş, hacimde pahalı ve — asıl mesele — siz daha maskelemeden PII'nizi bir üçüncü tarafa göndermek demek. Veriyi silmek için veriyi uzağa yollamak, işin mantığını baştan bozuyor.
Klasik alternatif, elle yazılmış regex'ler, bu gidiş-gelişi ortadan kaldırıyor ama metin biraz gayriresmileşince ya da Türkçe olunca kırılıyor: ekler isimlere ve yer adlarına yapışıyor, tek bir kalıp için yazılan desen on başka biçimi kaçırıyor.
Yakın zamanda pratikleşen üçüncü bir yol var: umursadığınız tek işe küçük (1B altı) bir modeli fine-tune etmek. Dar bir işte 0.5B'lik bir "öğrenci", genel amaçlı bir devi sıklıkla yakalar ya da geçer — çünkü tüm kapasitesini sizin dağılımınıza harcar. Laptop'ta çevrimdışı çalışır, istek başına maliyeti yoktur ve — en önemlisi — hataları sizin kontrol ettiğiniz bir test setinde görünür.
piimask bu model. Bir mesaj verdiğinizde, dokuz tür üzerinden bir JSON entity listesi döndürüyor — PERSON, EMAIL, PHONE, NATIONAL_ID, IBAN, CREDIT_CARD, ADDRESS, DATE_OF_BIRTH, IP_ADDRESS:
{"entities": [{"type": "PERSON", "value": "Ayşe Yılmaz"}, {"type": "EMAIL", "value": "ayse@firma.com"}]}
Kısa, gayriresmi metin için tasarlandı — sohbet mesajları, destek kayıtları, e-postalar, form alanları. En bariz kullanım: girdiyi üçüncü taraf bir LLM'e gitmeden önce yerelde temizlemek ya da geliştirici loglarındaki PII'yi kesmek. Özellikle Türkçe için kaliteli açık seçenekler çok azdı; bu modeli kurmamızın önemli bir sebebi de bu boşluk.
Modelden daha çok öğreten ders
Asıl vaktinize değecek kısım burası.
Kendi iç test setimizde piimask, Türkçe adreslerde 0.75 F1 aldı. Fena değil. Sonra ayrı, bağımsız kurulmuş ve çeldiricili bir benchmark'ta çalıştırdık — ve Türkçe adres recall'ı 0.16'ya çöktü.
Model tek bir adres formatını ezberlemişti. Eğitim verimizdeki Türkçe adresler çoğunlukla tek bir şekle uyuyordu ve model kavramı değil o şekli öğrendi. Hiç görmediği "önce sokak" biçimindeki adreslerde hiç tetiklenmedi.
İçgüdü daha fazla veri atmak. Denedik. Bağımsız skoru daha da kötüleştirdi — aynı formattan daha çok örnek, yapıyı öğretmeden ezberi derinleştirdi.
Çözüm modelde değildi. Türkçe adreslerin güçlü ve tanınabilir bir yapısı var: bir mahalle/cadde/sokak çapası (Mahallesi, Caddesi, Sokak…), bir numara bileşeni (No, Daire, Kat…) ve 81'lik kapalı bir kümeden bir il adı. Bu, olasılıksal bir modelin işi değil; bir gramerin işi. Bu yapıyı doğrudan tanıyan, küçük ve sıra-bağımsız (order-invariant) deterministik bir katman yazdık. Recall 0.16'dan ~1.0'a çıktı (F1 0.79) — hiç yeniden eğitim yapmadan ve İngilizce'yi hiç etkilemeden, çünkü gramer yalnızca Türkçe yapıda tetikleniyor.
Çıkarım adreslerin çok ötesine geçiyor: her kalite problemi bir model problemi değildir. En güçlü sistem, bulanık ve bağlama dayalı işi — isimler, serbest metin adresler — yapan küçük bir modelle, yapısal ve doğrulanabilir işi yapan deterministik bir katmanın birlikte çalışması: format kontrolüyle e-posta, Luhn ile kart, mod-97 ile IBAN, TCKN ile kimlik. Her biri iyi olduğu işi yapıyor. Gerçek cevap elli satırlık bir gramerken daha büyük bir modele uzanmak, yaygın ve pahalı bir hata.
Benchmark'lar, dürüstçe
O bağımsız iki dilli sette micro-F1 şöyle çıktı:
- piimask (0.5B): 0.81
- ai4privacy DeBERTa: 0.65
- Microsoft Presidio: 0.51
Bir — karşılaştırma birebir adil değil. Diğer modeller Türkçe için kurulmadı; dolayısıyla sıfıra yakın Türkçe skorları bir kapsam sınırı, adil bir kafa kafaya değil. Temiz İngilizce yapısal alanlarda gayet rekabetçi kalıyorlar.
İki — bu seti görerek ayarladık. Hataları okuyup üzerinde iterasyon yaptık; yani bu sayılar güçlü bir geliştirme sinyali, saf bir held-out sonucu değil. Gerçekten hiç dokunulmamış bir dilim biraz daha düşük skor alırdı. Bunu yuvarlayıp geçmektense söylemeyi tercih ederiz.
Tek katman olarak kullanın, tek bariyer olarak değil
Model kartında yüksek sesle söylediğimiz bir şey daha: maskeleme bir recall problemidir — tek bir kaçırma bir sızıntıdır. piimask kendi kısa-metin dağılımında bile birkaç yüzde kaçırıyor, hiç eğitilmediği uzun ve resmi belgelerde çok daha fazlasını. Yani tek başına uyumluluk (compliance) düzeyinde bir güvence değil. Onu savunmada-derinlik (defense-in-depth) içinde bir katman olarak kullanın; yüksek riskli akışlarda daha katı bir kapı ya da insan incelemesiyle.
Bu, sona iliştirilmiş bir feragat değil — adres çözümüyle aynı felsefe. Her biri tek bir işi iyi yapan katmanlar ve her birinin nerede durduğuna dair dürüstlük.
Deneyin — ve kırın
Model ve eval seti Apache-2.0 ile Hugging Face'te yayında. Çalıştırın, zor girdilerle zorlayın ve hâlâ kaçırdığımız formatları — özellikle Türkçe olanları — bize gönderin. Deterministik katman tam olarak bu geri bildirimle büyüdü.
- Model & eval seti: huggingface.co/promptrails/piimask-qwen2.5-0.5b
piimask, PromptRails'in operasyon katmanındaki guardrail'lerden biri — PII masking her workflow'da yerleşik bir adım. 30 dakikalık bir görüşme ayarlayın, sizin akışınızda nereye oturduğunu birlikte haritalayalım.
