Streaming LLM Güvenliği: Akış Yanıtlarında Çıktı Filtresi Nasıl Çalışır?
Streaming LLM güvenliği için tampon, geri tutma penceresi, senkron ve asenkron filtre modları ve arayüz kurallarıyla akış yanıtını çalışma anında denetleyin.
Streaming LLM güvenliği, cevabın parça parça gönderildiği bir akışta çıktıyı denetleme sorunudur. Tam yanıt bekleyen bir filtre bütün metni görür ve tek kararla sonuca varır. Akışta ise filtre henüz bitmemiş bir metin hakkında karar verir, zararlı örüntü birden çok parçaya bölünebilir ve gönderilen parça geri çağrılamaz. Çözüm, sunucu tarafında kısa bir tampon, bölünmüş örüntüler için geri tutma penceresi, kural ve model tabanlı denetimin birlikte çalışması ve yanıt bittiğinde tam metin üzerinde son kontroldür.
Streaming LLM güvenliği neden ayrı bir sorun?
Akış yanıtı kullanıcı deneyimini iyileştirir, ama güvenlik denetimini üç yönden zorlaştırır.
- Bağlam eksikliği: Cümlenin sonu gelmediği için bir ifadenin zararlı mı zararsız mı olduğu belirsizdir.
- Bölünmüş örüntü: Bir kimlik numarası, IBAN, bağlantı ya da komut iki parçaya ayrılabilir ve her parça tek başına masum görünür.
- Geri alınamazlık: Parça kullanıcıya ulaştığında okunmuş, kopyalanmış ya da başka bir sisteme aktarılmış olabilir.
OWASP LLM10:2026 Improper Output Handling maddesi, model çıktısının aşağı akış sistemlere doğrulanmadan aktarılmasını ayrı bir risk olarak tanımlar. Akışta bu risk büyür, çünkü aşağı akış sistemler eksik ya da henüz denetlenmemiş metni alabilir. Çıktı korumasının genel mimarisi için runtime LLM guardrails yazısına bakabilirsiniz. Bu yazı akışa özgü kısmı ele alır: filtrenin ne zaman, hangi birimle ve hangi modda çalışacağı.
Sağlayıcılar akışta filtreyi nasıl uyguluyor?
Büyük bulut sağlayıcıları ve açık kaynak guardrail çatıları aynı ikilemi farklı adlarla çözüyor: önce denetle sonra gönder, ya da önce gönder sonra denetle.
| Çözüm | Varsayılan davranış | Hızlı seçenek | Belgelenen bedel |
|---|---|---|---|
| Azure OpenAI içerik filtresi | Yanıt tamponlanır, denetlenir, parçalar halinde gönderilir | Asynchronous Filter: tamponsuz, token token akış | İhlal sinyali yaklaşık 1.000 karakterlik pencere içinde gecikmeli gelir, zararlı içerik görüntülenebilir |
| Amazon Bedrock Guardrails | Senkron mod: parçalar politikadan geçtikten sonra gönderilir | streamProcessingMode: ASYNCHRONOUS | Parçalar tarama bitene kadar uygunsuz içerik taşıyabilir, asenkron modda hassas bilgi maskeleme desteklenmez |
| NVIDIA NeMo Guardrails çıktı rayları | chunk_size: 200, context_size: 50 token | stream_first: True varsayılandır | Parça raylardan önce istemciye gider, ihlal anında akış hata ile kesilir |
Bu tablodan iki pratik sonuç çıkar. Birincisi, asenkron mod seçildiğinde istemci tarafında geri çekme mekanizması kurmak zorunlu hale gelir. Azure belgeleri de bu modda uygulamanın içerik geri çekmeyi kendisinin uygulamasını önerir. İkincisi, açık kaynak çatıların varsayılanlarını mutlaka okuyun. NeMo Guardrails'te stream_first varsayılan olarak açıktır. Bu ayar değiştirilmezse kullanıcı, raylar engellese bile o parçayı almış olur.
AI firewall akış yanıtını çalışma anında nasıl denetler?
Kurumsal okurların sık sorduğu soru, bir AI firewall'un girdi ve çıktıyı çalışma anında nasıl filtrelediğidir. Girdi tarafı görece basittir: istem modele gitmeden önce bütünüyle elde vardır. Çıktı tarafında akış devreye girdiğinde firewall bir boru hattı gibi çalışmalıdır:
- Tampon: Model parçaları sunucuda birikir, belirli bir boyuta ulaşınca denetlenir.
- Kural katmanı: Her tamponda hızlı örüntü taraması yapılır: TCKN, IBAN, kart numarası, API anahtarı, izin listesi dışı bağlantı.
- Geri tutma penceresi: Tamponun son kısmı gönderilmez, bir sonraki parçayla birlikte yeniden taranır.
- Model katmanı: Anlam düzeyindeki denetim her parçada değil, belirli aralıklarla ve yanıtın sonunda çalışır.
- Karar: İzin ver, bekle, maskele ya da kes. Her karar kayda geçer.
TAMPON = 400 # karakter, risk sınıfına göre ayarlanır
GERI_TUT = 64 # aranan en uzun örüntüden uzun olmalı (TR IBAN 26 karakter)
async def guvenli_akis(model_akisi, istemci):
bekleyen = ""
async for parca in model_akisi:
bekleyen += parca
if len(bekleyen) < TAMPON:
continue
sonuc = kural_tara(bekleyen) # TCKN, IBAN, anahtar, URL
if sonuc.kes:
await model_akisi.iptal()
return await istemci.durdur("yanit_durduruldu")
metin = sonuc.maskelenmis
await istemci.gonder(metin[:-GERI_TUT])
bekleyen = metin[-GERI_TUT:] # kuyruk sonraki parçayla taranır
son = kural_tara(bekleyen)
if son.kes:
return await istemci.durdur("yanit_durduruldu")
await istemci.gonder(son.maskelenmis)
await istemci.tamamla(son_kontrol="model_tabanli")
Firewall'un gecikme bütçesini nasıl böldüğü ve hata durumunda açık mı kapalı mı kalacağı için LLM firewall iç mimarisi yazısına bakabilirsiniz.
Parça bazlı filtre neleri kaçırır?
Parça bazlı filtre, her parçayı tek başına değerlendirdiği için şu durumları kaçırır:
| Kaçırma biçimi | Örnek | Önlem |
|---|---|---|
| Bölünmüş kişisel veri | TCKN'nin ilk altı hanesi bir parçada, kalanı sonrakinde | Geri tutma penceresi |
| Bölünmüş bağlantı | Alan adı ve yol ayrı parçalarda | Bağlantıyı tamamlanana kadar göstermeme |
| Yavaş inşa edilen içerik | Her biri masum görünen adımlardan oluşan zararlı liste | Aralıklı ve son model denetimi |
| Biçimlendirme sinyali | Kod bloğu ya da görsel sözdizimi sonradan kapanır | Akış sırasında düz metin gösterimi |
| Türkçe ek yapısı | Kök ile ek farklı parçalarda | Sözcük sınırında denetim |
Kişisel veri maskeleme gerekiyorsa senkron mod tek güvenli seçenektir. Bedrock'un asenkron modda maskelemeyi desteklememesi bunun tipik örneğidir. Türkçe trafikte TCKN ve IBAN maskeleme kuralları için KVKK uyumlu PII maskeleme yazısına bakabilirsiniz.
Arayüz akış sırasında neyi göstermeli?
Arayüz, denetlenmemiş metni zengin biçimde göstermemelidir. Arayüz akış sırasında Markdown yorumluyorsa görsel bağlantısı gelir gelmez tarayıcı bir istek gönderebilir ve veri adresin içinde dışarı çıkabilir. Bu zincirin ayrıntısı Markdown ve görsel render ile veri sızdırma yazısında anlatılır.
- Akış sırasında bağlantıları tıklanabilir yapmayın, görselleri yüklemeyin.
- Yanıt tamamlanıp son kontrol geçince biçimlendirmeyi açın.
- İzin listesi dışındaki alan adlarına giden bağlantıları son kontrolde kaldırın.
- İhlal bulunursa görünen metni kısa ve nötr bir uyarıyla değiştirin, nedenin ayrıntısını göstermeyin.
- Akışı kesme düğmesi ekleyin ve sunucu tarafında üretimi gerçekten iptal edin.
Hangi mod hangi kullanım için seçilmeli?
Mod seçimini ürün ekibine bırakmayın. Kullanım sınıfına göre yazılı bir karar verin.
| Kullanım | Önerilen mod | Gerekçe |
|---|---|---|
| Müşteriye açık asistan, düzenlenmiş sektör | Senkron, büyük tampon | Denetlenmemiş metin gösterilmez |
| Kişisel veri işleyen yanıtlar | Senkron, maskeleme açık | Asenkron modda maskeleme güvenilmez |
| Finansal, tıbbi ya da hukuki yönlendirme | Akışsız ya da tam yanıt kontrolü | Hatanın bedeli gecikmeden büyük |
| İç geliştirici aracı | Asenkron ve istemci tarafı geri çekme | Gecikme öncelikli, kitle sınırlı |
| Genel bilgi sohbeti | Senkron, küçük tampon | Denge |
Azure belgeleri de varsayılan modu azami güvenlik ve uyum gerektiren, içerik geri çekmeyi kaldıramayan uygulamalar için, asenkron modu düşük gecikmenin kritik olduğu ve ek güvenlik kontrollerinin bulunduğu iç araçlar için önerir.
Arıza, iptal ve kayıt nasıl ele alınır?
Filtre servisi yanıt vermezse akış güvenli tarafta kalmalıdır. Varsayılan davranış "kapalı kal" olmalı, yani denetlenemeyen içerik gönderilmemelidir. Düşük riskli sohbette "açık kal" seçilebilir, ama bu karar yazılı ve bilinçli verilmelidir.
| Durum | Önerilen davranış |
|---|---|
| Filtre servisi yanıt vermiyor | Akışı durdur, genel hata mesajı göster |
| İhlal sonradan bulundu | Görünen metni değiştir, kaydet, uyarı üret |
| Kullanıcı sekmeyi kapattı | Model üretimini iptal et |
| Yanıt yarıda kesildi | Eksik olduğunu belirt, aşağı akışa aktarma |
İptal maliyet açısından da önemlidir. Azure belgelerine göre akış sırasında içerik filtresi tetiklendiğinde, filtrelemeden önce üretilen tamamlama token'ları da ücretlendirilir. Kayıt tutarken filtrenin yakaladığı hassas değeri olduğu gibi yazmayın. Kuralın adını, kategorisini, model ve istem sürümünü saklayın, değeri maskeleyin. Merkezi kayıt ve politika katmanı için LLM gateway nedir yazısına bakabilirsiniz.
Akış filtresi nasıl test edilir?
Birçok ekip filtreyi tam yanıt üzerinde test eder, oysa üretimde parçalı çalışır. Testi gerçek akışla yapın ve bölünmüş örüntüleri bilerek üreten girdiler hazırlayın.
- Sentetik TCKN ve IBAN değerlerini parça sınırına denk gelecek biçimde bölün ve maskelemeyi doğrulayın.
- Görsel ve bağlantı sözdizimini akış ortasında kapanacak şekilde üretip arayüzün istek göndermediğini kontrol edin.
- Filtre servisini kapatıp akışın durduğunu doğrulayın.
- Kullanıcı iptalinden sonra sunucuda üretimin sonlandığını ölçün.
- İlk token süresi ile kaçırma oranını farklı tampon boyutlarında karşılaştırın.
Aşırı red de izlenmelidir. Çok sıkı bir filtre meşru yanıtları keser ve kullanıcıyı başka araçlara yöneltir.
Sık Sorulan Sorular
Akış yanıtında filtreyi nerede çalıştırmalıyım?
Sunucu tarafında, parçalar istemciye gitmeden önce çalıştırın. İstemcideki bir filtre atlanabilir ve parça tarayıcıya zaten ulaşmıştır. Önerilen düzen, kısa bir tampon tutmak, tampondaki metni denetlemek, yalnız onaylanan kısmı göndermek ve yanıt bitince tam metni bir kez daha taramaktır. Asenkron mod seçilirse istemci tarafı geri çekme mekanizması da kurulmalıdır.
Senkron ve asenkron filtre modu arasındaki fark nedir?
Senkron modda filtre parçaları tamponlar, denetler ve ancak politikaya uyan kısmı gönderir. Gecikme biraz artar ama kullanıcı denetlenmemiş metin görmez. Asenkron modda parçalar hemen gönderilir, filtre arka planda çalışır ve ihlal sinyali sonradan gelir. Azure ve Amazon Bedrock belgeleri asenkron modda uygunsuz içeriğin tarama tamamlanmadan kullanıcıya ulaşabileceğini açıkça belirtir.
Tamponu büyütmek gecikmeyi nasıl etkiler?
Tampon büyüdükçe ilk sözcük daha geç görünür, ama filtre daha fazla bağlam görür ve daha isabetli karar verir. NeMo Guardrails belgeleri de büyük parçanın daha az denetim çalıştırıp daha geç ilk çıktı verdiğini, küçük parçanın ise ilk çıktıyı hızlandırdığını anlatır. Hassas konularda büyük, genel sohbette küçük tampon seçin ve değeri kendi trafiğinizle ölçün.
Akış yanıtında kişisel veri nasıl yakalanır?
Kişisel veri örüntüleri parçalara bölünebilir. Bir kimlik numarasının ya da IBAN'ın yarısı bir parçada, kalanı sonrakinde gelir ve parça bazlı filtre bunu kaçırır. Çözüm, metnin son kısmını aranan en uzun örüntüden uzun bir geri tutma penceresinde bekletmek ve bir sonraki parçayla birlikte taramaktır. Maskeleme gerekiyorsa senkron mod kullanılmalıdır.
Gönderilmiş bir parça geri alınabilir mi?
Tam olarak alınamaz. Arayüz, filtre sonradan ihlal bulursa görünen metni silebilir ya da nötr bir uyarıyla değiştirebilir, ama kullanıcı metni okumuş, kopyalamış ya da ekran görüntüsü almış olabilir. Arayüz metni bir sisteme aktarmışsa etki daha da büyür. Bu yüzden riskli içerikte önleme, geri çekmeye göre her zaman daha güçlü bir kontroldür.
Kaynaklar
- Microsoft Learn: Content Streaming in Azure OpenAI
- AWS Docs: Configure streaming response behavior to filter content (Amazon Bedrock Guardrails)
- NVIDIA NeMo Guardrails: Output Rail Streaming Configuration
- OWASP GenAI: LLM05:2025 Improper Output Handling
- OWASP GenAI: LLM02:2025 Sensitive Information Disclosure
İlgili Yazılar
- Runtime LLM Guardrails Üretim Ortamında Yapay Zekâ Savunması
- Bir LLM Firewall'ın İçi: Hibrit Mimari Anatomisi Regex + ML katmanları, gecikme bütçesi ve fail-open/fail-closed kararı
- Markdown ve Görsel Render ile Veri Sızdırma Tık gerektirmeyen exfiltrasyon zinciri
- LLM Gateway Nedir? LLM Firewall ve Runtime Protection ile Farkı
Bu yazı, Türkiye odaklı Yapay Zekâ Güvenliği Rehberi'nin destek makalelerinden biridir.