LLM Pipeline’larında Veri Kirliliği ve RegEx Güvenliği: Yapay Zeka Çıktılarını Temizlerken Nerede Patlıyoruz?
Yazılım dünyasında neredeyse elli yıldır değişmeyen gayriresmi bir kural vardır: Çözemediğin bir metin ayrıştırma problemi mi var? Yapıştır bir RegEx (düzenli ifade), arkana yaslan. Ancak modern NLP sistemleri ve hayatımızın merkezine oturan LLM (Büyük Dil Modelleri) dünyasında işler artık bu kadar basit değil. Yapay zeka tarafından üretilen veya işlenen metinleri geleneksel yöntemlerle temizlemeye kalktığınızda, işin ucu ciddi bir güvenlik zafiyetine ve çöken sunuculara varabiliyor.
Kendi pipeline’larımda yaşadığım birkaç “Neden bu sunucu saatlerdir %100 CPU kullanıyor?” krizinden sonra meseleyi masaya yatırmaya karar verdim. Gelin, LLM çıktılarının klasik yöntemleri nasıl bozguna uğrattığını testlerle inceleyelim.
Klasik Çekiç, Kuantum Çiviye Karşı: RegEx Nerede Çuvallıyor?
Geleneksel yazılımda veri öngörülebilirdir. Bir formdan gelen e-posta adresi bellidir: Birkaç harf, bir @ işareti, biraz daha harf ve bir nokta. Ancak bir LLM’e “Bana metindeki iletişim bilgilerini çıkar” dediğinizde, model size sadece e-posta vermez; bazen Markdown blokları, bazen açıklama cümleleri, bazen de görünmez Unicode karakterleri hediye eder.
İşte tam bu noktada geliştiriciler hemen şu refleksi gösterir: “Araya bir regex atar, temizlerim.” Fakat LLM çıktılarının doğası üç temel problem barındırır:
- Sıfır Genişlikli (Zero-Width) Karakterler: LLM’ler internetten beslenir. Kopyalanan metinlerin içinde görünmeyen boşluklar (örneğin
\u200B) veya sağdan sola yazım (RTL) işaretleri bulunabilir. Sizin “temiz” sandığınız regex bu karakterleri atlarsa, veri tabanınız sessizce kirlenir. - Halüsinasyon Kaynaklı Format Bozulmaları: Modele “Sadece saf JSON ver” deseniz bile, model bazen keyifli bir günündeyse cevabın başına
```jsonekler, sonuna daUmarım bu yardımcı olmuştur!iliştirir. - Tipografik Tırnak Tuzağı: Model düz tırnak (
") yerine akıllı tırnak (“veya”) ürettiğinde, basit bir JSON parser veya regex pattern’i anında iflas eder.
[Görsel: Bir LLM’in ürettiği metin içinde gizlenen sıfır genişlikli boşlukların ve bozuk tırnak işaretlerinin hex editöründeki görünümü]
Korkulu Rüya: ReDoS (Regular Expression Denial of Service)
İşin en tehlikeli boyutu güvenlik. Bir LLM pipeline’ında kullanıcı girdisi önce modele gidiyor, modelden çıkan yanıt da sizin yazdığınız bir regex filtresinden geçiyorsa, kapınızı ReDoS saldırılarına ardına kadar açmış olabilirsiniz.
ReDoS, kötü kurgulanmış bir regex ifadesinin, karmaşık veya beklenmedik uzunluktaki bir metinle karşılaştığında “catastrophic backtracking” (yıkıcı geri izleme) yaşamasıdır. Regex motoru eşleşmeyi bulabilmek için milyarlarca kombinasyon dener ve işlemciyi kilitler.
Küçük bir laboratuvar testi yapalım. Masum görünen şu deseni ele alalım:
import re
import time
# Masum görünen ama tehlikeli bir regex
pattern = re.compile(r"^(a+)+$")
# LLM'in beklenmedik şekilde ürettiği uzun ve hatalı bir string
dirty_llm_output = "a" * 30 + "!"
start = time.time()
pattern.match(dirty_llm_output)
print(f"İşlem süresi: {time.time() - start:.2f} saniye")
Sadece 30 karakterlik bu metin, bilgisayarınızda saniyeler süren bir donmaya sebep olur. Karakter sayısını 35’e çıkardığınızda işlem dakikalar alır, 40 yaptığınızda ise sunucunuz fişi çeker. LLM’in sentetik veri üretirken araya sıkıştırdığı saçma bir tekrar dizisi, tüm API servisinizi çökertebilir.
[Görsel: Terminal ekranında CPU kullanımının %100’e fırladığı ve ReDoS yüzünden kilitlenen bir Python regex process’i]
Peki Ne Yapacağız? Modern Temizleme Stratejileri
LLM çıktılarını temizlemek için artık regex cambazlığı yapmak yerine, problemi kaynağında çözen modern yaklaşımlara geçmek şart. Test ettiğim ve pipeline’larda güvenle çalışan üç ana yöntem:
1. Şema Tabanlı Zorlama (Grammar-Guided Generation)
Modelin kafasına göre çıktı üretmesine izin verip sonra arkasını süpürmek yerine, modeli üretirken kısıtlayın. Outlines veya llama.cpp’nin Grammar özellikleri, modelin token üretirken sadece geçerli bir JSON veya belirli bir regex formatına uymasını zorunlu kılar. Kural dışı tek bir karakter bile üretilemez.
2. Doğrulama Katmanları (Pydantic ve Instructor)
Python ekosistemindeyseniz Instructor kütüphanesi harikalar yaratıyor. OpenAI veya yerel modellerin fonksiyon çağırma (function calling) yeteneğini kullanarak çıktıyı doğrudan bir Pydantic modeline dönüştürüyor. Tip uyuşmazlığı varsa, regex ile uğraşmak yerine modeli otomatik olarak uarıp hatayı düzelttiriyor.
3. Güvenli Regex Motorları
Eğer regex kullanmaktan başka çareniz yoksa, Python’ın yerleşik re modülü yerine Google’ın geliştirdiği re2 kütüphanesini kullanın. re2, backtracking mekanizmasını sınırlandırarak doğrusal zamanda çalışır; yani ReDoS saldırılarına karşı bağışıktır.
Hangi Yaklaşım Ne Kadar Mantıklı?
Testlerimde öne çıkan araçların artılarını ve eksilerini şöyle özetleyebiliriz:
| Yöntem / Araç | Güvenlik | Geliştirme Hızı | Artıları | Eksileri |
|---|---|---|---|---|
| Klasik RegEx | Düşük | Hızlı (Başlangıçta) | Ek kütüphane gerektirmez, hafiftir | ReDoS riski, görünmez karakterleri kaçırma |
| Google re2 | Yüksek | Hızlı | ReDoS imkansızdır, güvenlidir | Lookaround gibi bazı gelişmiş özellikleri desteklemez |
| Instructor + Pydantic | Çok Yüksek | Orta | Tipe dayalı tam veri garantisi, otomatik düzeltme | Modelin function calling desteğine bağımlı |
| Guardrails AI | Çok Yüksek | Yavaş (Öğrenme eğrisi var) | Kurumsal doğrulama kuralları, hazır kalıplar | Pipeline’a ek gecikme (latency) ekleyebilir |
Fiyat ve Ücretsiz Alternatifler
Bu çözümleri projenize entegre ederken cebinizden büyük paralar çıkmak zorunda değil:
- Tamamen Ücretsiz & Açık Kaynak:
google-re2,OutlinesveInstructorkütüphaneleri 0 TL. Tamamen açık kaynak ve MIT lisanslıdır. Sadece tükettiğiniz LLM API maliyetiyle çalışırlar. - Guardrails AI: Açık kaynaklı temel kütüphanesi ücretsizdir. Ancak ekipler için sundukları bulut tabanlı hazır hub çözümleri, kullanım hacmine göre ücretlendirilen freemium bir modele sahiptir.
- Yerel Çözüm (En Ucuzu): Ollama veya vLLM ile kendi sunucunuzda açık kaynaklı bir model (örneğin Llama 3 veya Mistral) koşturup üzerine Outlines eklerseniz, hiçbir API faturası ödemeden tamamen güvenli bir temizleme pipeline’ı kurabilirsiniz.
Son Söz: Çekici Yere Bırakma Zamanı
Yapay zeka modelleri deterministik (her zaman aynı sonucu veren) makineler değildir; doğaları gereği olasılıksaldır. Olasılıksal bir sistemin çıktısını, 1970’lerden kalma katı kurallarla çalışan geleneksel RegEx desenleriyle evcilleştirmeye çalışmak sunucunuza yapacağınız en büyük haksızlıktır.
Pipeline’ınızda regex kullanmaya devam edebilirsiniz; ancak bunu ilk savunma hattı değil, şema kontrollü filtrelerin arkasındaki son güvenlik ağı olarak konumlandırmak en mantıklı strateji olacaktır.