Yazılım eğitimi asistanlarında prompt, araç çıktısı ve gözlem kayıtlarındaki kişisel veriyi girişte maskeleyin; çıkışta DLP taraması, tenant izolasyonu ve ölçülebilir saklama politikaları uygulayın.
Yazılım Eğitimi Asistanlarında PII Maskeleme ve Veri Saklama
Yazılım eğitimi asistanı için veri akışını sınıflandırın
Bir yazılım eğitimi asistanında PII yalnızca kullanıcının ilk mesajında bulunmaz. Git diff, hata izleme kaydı, terminal çıktısı, yüklenen CSV, tool calling sonucu ve OpenTelemetry span attribute'ları ayrı sızıntı yüzeyleridir. İlk adım olarak her alanı `raw`, `masked`, `derived` veya `restricted` etiketiyle veri envanterine yazın. Örneğin `raw_prompt` ve ham tool sonucu uygulama loguna hiç girmemeli; LLM isteğine giden gövde ise yalnızca `masked_prompt` olmalıdır.
flow,producer,classification,allowed_sinks,retention_days
chat.message,api,raw,llm-redaction-worker,0
git.diff,repository-tool,restricted,redaction-worker,0
masked.prompt,redaction-worker,masked,llm-gateway-trace,14
llm.response,llm-gateway,derived,product-db,30
security.audit,policy-engine,derived,audit-store,180Bu tabloyu CI denetimine bağlayın: OpenTelemetry Collector konfigürasyonunda `prompt`, `authorization`, `cookie`, `email` ve `tool.result` attribute'larını span export edilmeden silin. Yaygın hata, uygulama loglarını temizleyip gateway veya APM ajanının HTTP request body kaydetmesini açık bırakmaktır. Collector tarafındaki filtre, uygulama geliştiricisinin yeni bir log satırı eklemesinden bağımsız ikinci bir kontrol noktası oluşturur.
Girişte PII maskeleme: geri döndürülebilir olmayan yer tutucular
Microsoft Presidio ile aday varlıkları bulun, fakat LLM'e `[EMAIL]` gibi tekrarlanan sabit metin göndermeyin. Aynı prompt içindeki iki e-posta adresi farklı kişiler olabilir; sabit yer tutucu, modelin ilişkiyi yanlış kurmasına neden olur. Tenant'a ait gizli anahtarla HMAC üreterek `[EMAIL:ab12cd34]` biçiminde kararlı fakat geri döndürülemez belirteç kullanın. Böylece model aynı değerin tekrarlandığını anlar, gözlem sistemi ise ham değeri saklamaz.
import hashlib
import hmac
from presidio_analyzer import AnalyzerEngine
analyzer = AnalyzerEngine()
def token(kind: str, value: str, tenant_secret: bytes) -> str:
digest = hmac.new(tenant_secret, value.encode('utf-8'), hashlib.sha256).hexdigest()[:12]
return f'[{kind}:{digest}]'
def redact(text: str, tenant_secret: bytes) -> str:
findings = analyzer.analyze(text=text, language='en', entities=['EMAIL_ADDRESS', 'PHONE_NUMBER', 'CREDIT_CARD'])
for item in sorted(findings, key=lambda x: x.start, reverse=True):
original = text[item.start:item.end]
text = text[:item.start] + token(item.entity_type, original, tenant_secret) + text[item.end:]
return textTürkçe ad, TCKN ve kurum içi çalışan numarası için yalnızca hazır recognizer'lara güvenmeyin. Presidio'ya `PatternRecognizer` ile TCKN aday formatını ekleyin, ardından 11 haneli doğrulama algoritması uygulayın; aksi halde örnek test verilerindeki rastgele sayıların gereksiz maskelenmesi kod açıklamasını bozar. Regex tek başına yeterli değildir: bağlam kelimeleri (`TCKN`, `kimlik no`) ve checksum birlikte kullanılmalıdır. Ayrıca HMAC anahtarını uygulama ortam değişkeninde değil, AWS KMS, Google Cloud KMS veya HashiCorp Vault üzerinden kısa ömürlü olarak alın.
Araç çıktısı ve akış yanıtlarında DLP sınırını doğru kurun
Kod asistanının `grep`, issue tracker veya CRM konektörü döndürdüğü veri, kullanıcı prompt'u kadar risklidir. Tool adapter içinde sonucu önce redaction pipeline'a gönderin, ardından LLM context'ine ekleyin. Bu sıralama önemlidir: yalnızca model yanıtını filtrelemek, ham tool sonucunun model sağlayıcısına çoktan gönderilmiş olduğu durumu geri alamaz. Adapter sözleşmesine `classification` alanı ekleyip `restricted` kaynakları varsayılan olarak reddedin.
async def execute_tool(tool, args, tenant_secret):
result = await tool.run(args)
if result.classification == 'restricted':
return {'status': 'blocked', 'reason': 'restricted source'}
safe_text = redact(result.text, tenant_secret)
return {
'status': 'ok',
'content': safe_text,
'source_id': result.source_id,
'classification': 'masked'
}Streaming yanıtlarda her chunk'ı bağımsız regex ile taramak sınır aşımı hatası üretir: `ali@` bir chunk'ta, `firma.com` sonraki chunk'ta gelebilir. Yanıtı kullanıcıya iletmeden önce en az son 256 karakterlik kayan pencere tutun, sadece güvenli kabul edilen prefix'i yayınlayın ve pencereyi Presidio veya seçtiğiniz DLP motoruyla yeniden tarayın. Bu yaklaşım ilk token gecikmesine küçük bir tampon ekler; buna karşılık chunk sınırında bölünmüş e-posta ve API anahtarlarını kaçırmaz.
Saklama süresi, tenant izolasyonu ve silme işlemlerini test edin
Maskeleme, saklama politikasının yerine geçmez. PostgreSQL'de tenant kimliğini her kayda koyun, Row Level Security'yi etkinleştirin ve kısa ömürlü telemetriyi günlük partition'lara ayırın. Partition silmek, milyonlarca satır için `DELETE` çalıştırmaktan farklı olarak satır başına WAL üretmeden metadata seviyesinde gerçekleşir. Ancak önce aktif sorguların eski partition'a referans vermediğini ve yedekleme politikasının silinen veriyi ne kadar tuttuğunu doğrulayın.
CREATE TABLE llm_trace (
tenant_id uuid NOT NULL,
created_at timestamptz NOT NULL,
request_hash text NOT NULL,
masked_prompt text NOT NULL,
latency_ms integer NOT NULL
) PARTITION BY RANGE (created_at);
ALTER TABLE llm_trace ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_scope ON llm_trace
USING (tenant_id = current_setting('app.tenant_id')::uuid);
CREATE TABLE llm_trace_2026_08 PARTITION OF llm_trace
FOR VALUES FROM ('2026-08-01') TO ('2026-09-01');
-- Retention job: ALTER TABLE llm_trace DETACH PARTITION llm_trace_2026_08;Uygulama bağlantısında `SET LOCAL app.tenant_id` işlemini transaction içinde yapın ve bağlantı havuzunda transaction bittiğinde ayarın sıfırlandığını doğrulayın. PgBouncer transaction pooling kullanılırken `SET` yerine `SET LOCAL` kullanılmazsa bir tenant'ın ayarı sonraki isteğe taşınabilir. Entegrasyon testinde iki tenant oluşturun, A tenant'ının JWT'siyle B tenant'ının trace kimliğini sorgulayın ve PostgreSQL'in sıfır satır döndürmesini zorunlu assertion yapın.
Maskeleme gecikmesini OpenTelemetry ve k6 ile önce-sonra ölçün
PII tespiti CPU maliyeti ve ek ağ çağrıları getirebilir; bu nedenle pipeline'ı sadece ortalama istek süresiyle değerlendirmeyin. OpenTelemetry span'larında `redaction.duration_ms`, `redaction.finding_count`, `llm.ttft_ms` ve `response.total_ms` metriklerini kaydedin, fakat ham metni attribute olarak eklemeyin. Aynı 10.000 istek corpus'unu maskeleme kapalı ve açık koşullarda çalıştırın; p50, p95, p99, hata oranı ve ilk token süresini ayrı karşılaştırın.
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: { chat: { executor: 'constant-arrival-rate', rate: 20, timeUnit: '1s', duration: '5m', preAllocatedVUs: 30 } }
};
export default function () {
const payload = JSON.stringify({ message: 'Repo sahibi ali@example.com, hata kaydi 4821' });
const res = http.post(__ENV.BASE_URL + '/chat', payload, { headers: { 'Content-Type': 'application/json' } });
check(res, { '200': r => r.status === 200, 'no raw email': r => !r.body.includes('ali@example.com') });
}Önce-sonra farkında p95 redaction süresi yüksekse, ilk optimizasyon regex'i her request'te yeniden derlemek değildir; derlenmiş recognizer ve NLP modelini worker yaşam döngüsünde bir kez yüklemektir. Python tarafında Presidio analyzer örneğini modül seviyesinde tutun, CPU-bound NLP işini async event loop üzerinde çalıştırmak yerine process worker'a taşıyın. Ayrıca ölçüm corpus'unda kısa sohbet, uzun stack trace, çok sayıda e-posta ve Türkçe karakter içeren gerçekçi örnekler bulunmalıdır; sadece temiz demo prompt'ları tespit doğruluğunu olduğundan yüksek gösterir.
TechCareer İlgili Eğitimler
Sık Sorulan Sorular
Yazılım eğitimi asistanında prompt loglarını tamamen kapatmak yeterli mi?
Hayır. HTTP gateway, APM ajanı, hata izleme SDK'sı ve tool calling katmanı request body veya exception context kaydedebilir. OpenTelemetry Collector'da hassas attribute'ları silin, gateway erişim loglarında body kaydını kapatın ve CI içinde `grep -R 'raw_prompt\|request.body'` ile log şeması denetimi çalıştırın.
Yazılım eğitimi uygulamasında PII maskeleme sonrası model cevabındaki yer tutucular nasıl yönetilir?
Yer tutucuyu modelden geri çözmek yerine kullanıcıya maskeli biçimde gösterin. Gerçek değerin gerekli olduğu dar iş akışlarında eşlemeyi ayrı bir kısa ömürlü Vault kaydında tutun, erişimi kullanıcı ve tenant ile doğrulayın, ardından TTL sonunda silin. HMAC belirteçleri geri çözülemez olmalıdır.
Streaming LLM yanıtında e-posta veya API anahtarı sızıntısı nasıl engellenir?
Tek tek token veya chunk taraması yapmayın. En az 256 karakterlik kayan pencereyle gecikmeli yayın yapın, her yeni chunk'ta pencereyi DLP taramasından geçirin ve yalnızca tekrar kontrol edilmeyecek kadar eski prefix'i istemciye gönderin. k6 testinde hassas değeri chunk sınırlarına bölerek bu davranışı doğrulayın.
Yazılım eğitimi verilerinde tenant izolasyonu PostgreSQL ile nasıl doğrulanır?
RLS politikasıyla `tenant_id = current_setting('app.tenant_id')::uuid` koşulunu uygulayın. Her API transaction'ında `SET LOCAL app.tenant_id` çalıştırın. Entegrasyon testinde farklı tenant token'ıyla doğrudan kayıt kimliği sorgulayıp boş sonuç bekleyin; yalnızca uygulama katmanındaki `WHERE tenant_id` kontrolü yeterli değildir.
AI / LLM Discovery
Bu makale Opendart Akademi Yapay Zeka eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.


