Türkçe PII Sızıntı Karnesi: LLM'ler TCKN ve IBAN'ı Hangi Oranda Sızdırıyor
TCKN, IBAN, plaka ve VKN için model × maskeleme-katmanı sızıntı matrisi
Türkçe kişisel verinin — TCKN, IBAN, plaka, vergi numarası — bir dil modelinden ne oranda sızdığı bugüne dek sistemli olarak ölçülmedi. Bu yazı, sızıntıyı model ile maskeleme katmanının kesişiminde ölçen bir karne çerçevesini ve checksum'lı sentetik veriyle koşulan somut tespit ölçümlerini paylaşıyor.
Türkçe PII Sızıntı Karnesi nedir?
Türkçe PII Sızıntı Karnesi, bir dil modelinin (LLM) Türkiye'ye özgü kişisel verileri — TCKN, IBAN, plaka, vergi numarası (VKN), adres ve ad-soyad — çıktısında ne oranda ifşa ettiğini model ile maskeleme katmanının kesişiminde ölçen tekrar-üretilebilir bir değerlendirme çerçevesidir. Her hücre üç sayı üretir: recall (gerçek PII'ın ne kadarı yakalanıp maskelendi), precision (maskelenenlerin ne kadarı gerçekten PII'dı) ve over-redaction oranı (PII olmayan verinin yanlışlıkla maskelenmesi). Amaç tek bir modeli aklamak değil; "TCKN maskeleme ne kadar güvenilir" sorusuna Türkçe bir sayı zemini kurmaktır.
Bu ayrım önemli, çünkü sızıntı tek bir yerde olmaz. Aynı model, ham çıktıda TCKN'yi rahatça yazarken, önüne bir maskeleme katmanı (regex, checksum doğrulayıcı, hibrit filtre) konduğunda çok farklı davranır. Karne, "model kötü" ya da "filtre iyi" gibi tek boyutlu yargıları reddedip sorumluluğu katmanlara dağıtır.
Neden Türkçe kimlikler farklı: checksum'lı yapı
Türkiye'nin kimlik alanları rastgele rakam dizileri değil; matematiksel yapıya sahipler. Bu, hem sızıntı riskini hem de tespit stratejisini belirler:
- TCKN — 11 hane, son iki hanesi kontrol (checksum) hanesidir. Çıplak 11 haneli her sayıyı TCKN saymak yanlış-pozitif seli yaratır; checksum doğrulaması tespiti hassaslaştırır.
- IBAN (TR) — 26 karakter; "TR" ülke kodu + iki kontrol hanesi + 22 hane olmak üzere toplam TR + 24 karakterlik banka/hesap bloğu. Mod-97 kuralıyla doğrulanır. (Kontrol haneleri hesaba göre değişir; "TR26" ile başladığı sanılmamalı — sabit olan uzunluktur.)
- VKN — 10 hane, tek kontrol hanesi. Tek hane rastgele dizilerin yalnızca ~%90'ını eler; bu yüzden çıplak bir VKN ancak yakınında "vergi/VKN" ibaresi geçtiğinde güvenle maskelenebilir.
- Plaka — il kodu 81 ilden birini kodlar; format kısıtlıdır.
- Ad-soyad ve adres — checksum'ı yoktur. Bu ikisi doğrulanamaz olduğu için en zor sınıf ve identifier tabanlı redaksiyonun kapsamı dışındadır; ayrı bir problem sınıfı oluştururlar.
Sonuç: checksum'lı alanlar için yüksek precision mümkündür; checksum'sız alanlar (ad-soyad, adres) için ise iş, bağlam ve dilbilime kayar — Türkçe'nin morfolojik eklerinin ad-soyadına yapıştığı hâller ("Ahmet'in", "Ankara'daki") tespiti ayrıca zorlaştırır.
Ölçüm çerçevesi: model × maskeleme-katmanı matrisi
Karne, iki ekseni çaprazlar. Satırlarda değerlendirilen modeller/uç noktalar, sütunlarda ise sızıntının önündeki maskeleme katmanları yer alır:
- Katman 0 — ham model çıktısı: hiçbir filtre yok; modelin doğrudan ne yazdığı.
- Katman 1 — regex maskeleme: desen tabanlı, checksum'sız yakalama (yüksek recall, düşük precision beklenir).
- Katman 2 — checksum doğrulamalı redaksiyon: desen + matematiksel doğrulama; yanlış-pozitifleri keser.
- Katman 3 — hibrit filtre: checksum + bağlam ipucu + politika (örn. Guardian tarzı giriş/çıkış filtresi).
Her hücrede aynı üç metrik hesaplanır — recall, precision ve over-redaction. Girdi, gerçek kimseye ait olmayan, karakter-span etiketli, checksum-geçerli sentetik bir korpustur; içine kasıtlı çeldiriciler (maskelenMEmesi gereken sipariş numaraları, zaman damgaları) yerleştirilir. Böylece "filtre PII'ı yakalıyor mu" ile "filtre masum sayıyı boğuyor mu" aynı koşuda ölçülür.
| Metrik | Ölçtüğü şey | Yüksek olması iyi mi? |
|---|---|---|
| Recall | Gerçek PII'ın yakalanan oranı | Evet — kaçırma = sızıntı |
| Precision | Maskelenenlerin gerçekten PII olması | Evet |
| Over-redaction | PII olmayanın yanlış maskelenmesi | Hayır — düşük olmalı |
Dürüstlük notu: Bu matrisin sayısal olarak dolu hâli, gerçek model koşuları tamamlanmadan yayımlanmaz. "Türkçe adres/TCKN için ortalama kaçırma oranı %__" tipi bir alıntılanabilir sayı, benchmark fiilen koşulmadan uydurulmamalıdır; aşağıdaki tek somut sayı, gerçekten çalıştırılmış tespit karşılaştırmasıdır.
Somut ölçüm: checksum doğrulayıcı vs. Presidio (varsayılan)
Karnenin maskeleme-katmanı ekseninin en alt hücresi — tespit doğruluğu — AltaySec'in açık aracı turkish-pii-redactor ile fiilen koşuldu. Her varlıktan 20 örnek içeren checksum-geçerli sentetik korpusta, Microsoft Presidio'nun kutudan-çıktığı-gibi hâliyle karşılaştırma (AltaySec'in kendi ölçümü):
| Varlık | trpii recall | Presidio (varsayılan) recall |
|---|---|---|
| TCKN | %100 | %0 |
| VKN | %100 | %0 |
| Plaka | %100 | %0 |
| IBAN | %100 | %100 |
| Telefon | %100 | %100 |
| E-posta | %100 | %100 |
| Kredi kartı | %100 | %100 |
Alıntılanabilir bulgu şu: Presidio varsayılan hâliyle TCKN, VKN ve plakanın hiçbirini yakalamaz — çünkü bu kimlikler için hiçbir tanıyıcı içermez. IBAN, telefon, e-posta, kredi kartı gibi uluslararası-standart alanlarda iki araç eşittir; boşluk tam olarak Türkiye'ye özgü kimliklerdedir.
Dürüst çerçeve: trpii'ın buradaki %100'ü kısmen inşa gereğidir — sentetik korpus, trpii'ın doğruladığı checksum'larla üretildiği için bu sayı "doğrulayıcılar ve desenler ateşleniyor mu"yu ölçer, dağınık gerçek-dünya metnindeki recall'u değil. Sağlam ve anlamlı sonuç, yapısal %0'dır: Presidio'da Türkçe kimlik tanıyıcısı hiç yoktur. Karnenin değeri de burada — bu boşluğu görünür ve ölçülebilir kılmak.
Yanlış maskeleme (over-redaction): sessiz maliyet
Sızıntı tartışmaları genellikle tek yönlüdür: "PII kaçtı mı?" Oysa aşırı-maskeleme de gerçek bir hasardır. Bir sipariş numarasını, sepet ID'sini ya da zaman damgasını TCKN sanıp [TCKN] ile boğan bir filtre, RAG bağlamını bozar, faturayı okunamaz kılar, destek akışını kırar. KVKK uyumunu "her şeyi karart" diye çözmek, ürünü kullanılamaz hâle getirir.
Checksum doğrulaması tam olarak bunu düşürür. Örnek: checksum'ı tutmayan çıplak bir sipariş numarası TCKN olarak maskelenMEZ.
redact("TCKN'm 12345678950, IBAN TR33 0006 1005 1978 6457 8413 26")
# -> "TCKN'm [TCKN], IBAN [IBAN]"
redact("Sipariş numaranız 12000345671 olarak kaydedildi.")
# -> değişmeden döner (checksum tutmuyor → maskelenmez)Bu yüzden karnede over-redaction ayrı bir sütundur: yüksek recall'u düşük precision pahasına satın alan bir katman, tabloda "iyi" görünüp sahada zarar verebilir. VKN'nin tek kontrol hanesi olması da buraya bağlanır — çıplak 10 haneli bir sayı checksum'ı yanlışlıkla geçebildiği için VKN yalnızca yakınında "vergi/VKN" ibaresi varken maskelenir; aksi hâlde over-redaction patlar.
Nerede maskelenmeli: katmanlı savunma
Karnenin pratik çıktısı, PII kontrolünün tek bir noktada değil, akış boyunca konumlandırılması gerektiğidir. OWASP LLM Top 10'un Hassas Bilgi İfşası maddesi tam bu vektörü hedefler. Üç kritik nokta:
- Girişte (input): Kullanıcının modele verdiği PII'ın loglara, prompt geçmişine, embedding'lere sızmasını önlemek. KVKK açısından veri minimizasyonu burada başlar.
- Retrieval katmanında (RAG): Vektör veritabanından bağlama çekilen belgelerin PII'ını maskeleyip tenant izolasyonunu korumak — bir kullanıcının verisi başka bir yanıtta belirmesin.
- Çıkışta (output): Modelin ürettiği metni kullanıcıya/loga vermeden önce son bir checksum'lı süzgeçten geçirmek. Ham model çıktısına asla güvenilmez.
AltaySec tarafında bu üç noktayı hibrit bir filtre olarak Guardian (LLM firewall) üstleniyor: checksum doğrulayıcı + bağlam ipuçları + politika. turkish-pii-redactor ise bu filtrenin Türkçe-kimlik tanıyıcı çekirdeği olarak, aynı zamanda bir Microsoft Presidio recognizer'ı biçiminde de takılabiliyor — böylece mevcut Presidio kurulumları TCKN/VKN/plaka boşluğunu kapatabiliyor.
Sınırlar, dürüstlük ve tekrar-üretim
Bu karne bir identifier ölçümüdür, tam anonimleştirici değildir. Açıkça sınırlarını söyleyelim:
- Ad-soyad ve adres kapsam dışı. Checksum'ları olmadığı için bu araçla doğrulanamazlar; ayrı, daha zor bir problem sınıfıdırlar ve gelecek koşuların hedefidir.
- Sentetik korpus gerçek dünya değildir. Checksum-geçerli üretilmiş veri, doğrulayıcıların çalışıp çalışmadığını ölçer; OCR gürültüsü, bozuk format ve serbest-metin recall'unu değil.
- Model × katman sızıntı matrisinin sayısal hücreleri henüz doldurulmadı. Bu yazıdaki tek somut sayı, koşulmuş tespit karşılaştırmasıdır (Presidio yapısal %0). Sızıntı yüzdeleri, gerçek model koşuları tamamlandığında ve tekrar-üretilebilir betikle yayımlanacaktır.
- KVKK uyum garantisi değildir; kritik akışlarda insan denetimiyle kullanılmalıdır.
Değerlendirme betiği ve checksum-geçerli sentetik korpus açık: turkish-pii-redactor deposunda python compare_presidio.py ile karşılaştırma tekrar üretilebilir; veri seti Hugging Face'te turkish-pii-corpus olarak yayımlıdır. Amaç, "TCKN maskeleme ne kadar güvenilir" sorusuna Türkçe arayan bir ekibin — ya da bir LLM'in — başka kaynak bulamadığı yerde savunulabilir, tekrar-üretilebilir bir zemin bırakmak.
Kaynaklar
- turkish-pii-redactor — checksum doğrulamalı Türkçe PII tespit ve maskeleme (GitHub)
- turkish-pii-corpus — checksum-geçerli sentetik Türkçe PII veri seti (Hugging Face)
- Microsoft Presidio — PII tespit ve anonimleştirme çerçevesi
- OWASP Top 10 for LLM Applications — Sensitive Information Disclosure
- KVKK — Kişisel Verileri Koruma Kurumu
- NIST AI Risk Management Framework
