Ünite 6 / 11

Erişim Kontrolü, Prompt Şablonu ve Konuşma Yönetimi

Kazanimlar:

  • Kullanıcı yetkisine göre retrieval'ı filtreleyen erişim kontrolü (ACL) kurmak
  • Bağlamı ve kullanıcı sorusunu doğru yerleştiren sağlam bir prompt şablonu yazmak
  • Çok turlu konuşmalarda soruyu bağımsızlaştırma ve geçmiş yönetimini uygulamak

Mimariyi kurduk; şimdi onu güvenli, tutarlı ve konuşulabilir hâle getirelim. Bu ünitede üç kritik konu var: (1) kullanıcının yetkisine göre retrieval'ı filtreleyen erişim kontrolü, (2) bağlamı ve soruyu doğru yerleştiren sağlam bir prompt şablonu, (3) çok turlu sohbette soruyu bağımsızlaştırma ve konuşma geçmişi yönetimi. Bu üçü olmadan bir asistan ya veri sızdırır, ya tutarsız cevap verir, ya da takip sorularında dağılır.

Erişim Kontrolü: Yetkisiz Veri Hiç Gelmemeli

Kurumsal en büyük risk: Bir kullanıcının görmemesi gereken bir dokümanın cevaba sızması. Yeni başlayan çok yaygın bir hata, "modele prompt'ta 'gizli belgeleri gösterme' demek"tir. Bu güvenli değildir. Model bir talimatı unutabilir veya bir saldırı (prompt injection) onu atlatabilir. Doğru yer, retrieval aşamasıdır: yetkisiz parça hiç getirilmemelidir.

Bunun yolu, her parçaya koyduğunuz yetki metadata'sını (departman, rol, gizlilik seviyesi) arama sırasında filtre olarak uygulamaktır. Kullanıcının kim olduğunu (kimliği ve rolleri) uygulama katmanında güvenle belirleyip, aramaya bir ACL (Access Control List, erişim kontrol listesi) filtresi eklersiniz.

# Yetkiye göre filtreli retrieval (kavramsal)kullanici = kimlik_dogrula(oturum) # güvenilir kaynaktanizinli = kullanici.roller + ["herkes"] # ör. ["IK", "yonetici"]sonuc = vektor_db.ara( vektor=embed(soru), top_k=20, filtre={"izin_grubu": {"in": izinli}, # sadece izinli parçalar "gizlilik": {"lte": kullanici.seviye}} # seviyesinin altındakiler)

Dikkat: Yetkiyi asla modele sormayın veya prompt'a güvenmeyin. Kimlik ve yetki, uygulamanın güvenilir katmanında belirlenir; retrieval filtresi zorunludur, prompt talimatı sadece ek bir katmandır. "Prompt'ta yazdım" güvenlik değildir.

Sağlam Prompt Şablonu

Prompt şablonu, retrieval'dan gelen bağlamı, kullanıcı sorusunu ve davranış talimatlarını bir araya getiren iskelettir. İyi bir şablonun bölümleri: rol/görev tanımı, davranış kuralları (grounding, bilmiyorum izni, kaynak talebi, ton), bağlam, soru.

Sen bir kurumsal İK asistanısın. Görevin, çalışanların sorularınıYALNIZCA aşağıdaki BAĞLAM'a dayanarak yanıtlamak.Kurallar:- Cevap bağlamda açıkça yoksa "Bu konuda dokümanlarda bilgi bulamadım, İK ekibine danışın" yaz. Tahmin etme, uydurma.- Bağlamdaki kaynaklar çelişiyorsa resmî politikayı esas al ve çelişkiyi belirt.- Her iddianın sonuna dayandığın kaynağı [Kaynak: dosya, bölüm] olarak ekle.- Kısa, net ve profesyonel bir dille yanıtla.BAĞLAM:{numarali_parcalar}SORU: {kullanici_sorusu}

Bağlam parçalarını numaralandırmak ([1], [2], ...) modelin kaynak göstermesini kolaylaştırır. Ayrıca her parçanın başında kaynağını yazın ki model doğru atıf yapabilsin.

İpucu: Prompt şablonunu sabit tutun ve değişkenleri (bağlam, soru) hep aynı yerlere yerleştirin. Sabit şablon hem test edilebilirliği artırır hem de bazı sistemlerde önbellek (prompt caching) sayesinde maliyeti düşürür.

BAĞLAM:[1] (Kaynak: ik_el_kitabi.pdf, Bölüm 5.2) Yıllık ücretli izin 14 gündür...[2] (Kaynak: ik_el_kitabi.pdf, Bölüm 5.4) 5 yıldan fazla kıdemde izin 20 gündür...

Zayıf Prompt / Güçlü Prompt

Zayıf (grounding yok, kaynak yok, kimlik karışık):

Şu belgeleri kullan ve soruyu cevapla: {parcalar}Kullanıcı: {soru}# Sorun: model bağlam dışına çıkar, uydurur, kaynak göstermez,# çelişkide keyfî davranır.

Güçlü (rol + kurallar + numaralı bağlam + kaynak zorunlu):

Sen ...sın. Yalnızca BAĞLAM'a dayan. Yoksa "bilmiyorum" de.Çelişkide resmî politikayı seç. Her iddiaya [Kaynak: ...] ekle.BAĞLAM: [1]... [2]... SORU: {soru}# Sonuç: bağlama sadık, kaynaklı, çelişkiyi doğru yöneten cevap.

Çok Turlu Konuşma Yönetimi

Gerçek kullanıcı tek soru sorup bırakmaz; konuşur. "Yıllık iznim kaç gün?" → "Peki ya 6 yıllık çalışan?" → "Ona nasıl başvururum?" İkinci ve üçüncü sorular tek başına anlamsızdır; önceki bağlama bağlıdır.

İki problemi çözmeniz gerekir. Birincisi retrieval için: takip sorusunu bağımsız hâle getirin (soru yeniden yazma). "Peki ya 6 yıllık çalışan?" → "6 yıllık çalışanın yıllık izin hakkı kaç gündür?" Bu bağımsız soruyla arama yaparsınız. İkincisi üretim için: modele konuşma geçmişini de verirsiniz ki tutarlı devam etsin.

# İki aşamalı: bağımsızlaştır → ara → geçmişle üret (kavramsal)bagimsiz = model.uret( "Konuşma geçmişini kullanarak soruyu tek başına anlaşılır hale getir:\nGeçmiş: {gecmis}\nSoru: {takip_sorusu}")baglam = retrieval(bagimsiz) # bağımsız soruyla aracevap = model.uret(prompt(baglam, gecmis, takip_sorusu))

Geçmiş büyüdükçe (uzun sohbet) her seferinde tümünü göndermek pahalanır ve bağlam penceresini doldurur. Çözüm: eski turları özetlemek veya son N turu tutup öncesini özete indirmek. Böylece hem maliyet kontrol altında kalır hem de tutarlılık korunur.

Durum

Sorun

Çözüm

Takip sorusu bağlamsız

Retrieval anlamsız arar

Soruyu bağımsızlaştır (rewrite)

Uzun sohbet

Maliyet ve pencere şişer

Eski turları özetle

Kullanıcı konu değiştirdi

Eski bağlam bulaşır

Yeni konuda geçmiş etkisini azalt

Yetki turlar arası değişebilir

Sızıntı riski

Her turda ACL filtresini yeniden uygula

Üç Mini Vaka

Vaka 1 — Prompt ile "güvenlik" yanılgısı. Bir şirket gizli maaş dokümanlarını herkesin sorabildiği asistana koymuş, sadece prompt'ta "maaş bilgisi verme" yazmış. Bir kullanıcı soruyu dolambaçlı sorunca model maaş aralığını sızdırmış. ACL filtresi retrieval'a eklenince (maaş parçaları yalnızca İK rolüne) sızıntı tamamen kapanmış; çünkü parça artık hiç getirilmiyor.

Vaka 2 — Bağlamsız takip. Bir destek asistanında kullanıcı "iade süresi?" → "ya kırık ürün?" dediğinde sistem "kırık ürün" için alakasız parçalar getiriyordu. Soru bağımsızlaştırma eklenince ("Kırık ürün için iade süresi ne kadar?") doğru cevap oranı %44'ten %90'a çıktı.

Vaka 3 — Şişen geçmiş. Bir asistanda 30 turluk sohbetlerde her çağrı tüm geçmişi gönderiyordu; maliyet tur başına 3 kat artıyor, cevaplar yavaşlıyordu. Son 6 turu tutup öncesini özetleyen yapıya geçilince token maliyeti %62 düştü, tutarlılık korundu.

Sık yapılan hatalar

  • Yetkiyi prompt'a bırakmak: Model unutur/atlatılır; ACL filtresi retrieval'da zorunludur.
  • Bağlamı numaralandırmamak: Model doğru kaynak gösteremez.
  • Takip sorusunu bağımsızlaştırmamak: Retrieval anlamsız arar.
  • Tüm geçmişi kör göndermek: Maliyet ve gecikme patlar; özetleyin.
  • Çelişki kuralını yazmamak: Model güvenilmez kaynağı resmî gibi sunabilir.

Özetle

  • Erişim kontrolü retrieval aşamasında metadata filtresiyle uygulanır; yetkisiz parça hiç getirilmemelidir.
  • Kimlik ve yetki güvenilir uygulama katmanında belirlenir; prompt talimatı yalnızca ek bir savunma katmanıdır.
  • Sağlam prompt şablonu rol, davranış kuralları (grounding, bilmiyorum izni, kaynak, çelişki), numaralı bağlam ve soru içerir.
  • Çok turlu sohbette takip soruları bağımsızlaştırılır ve model geçmişle birlikte tutarlı yanıt üretir.
  • Uzun geçmiş özetlenerek maliyet ve bağlam penceresi kontrol altında tutulur; ACL her turda yeniden uygulanır.

Uygulama görevi

(1) Kendi asistanınız için en az üç yetki grubu tanımlayın (ör. herkes, departman, yönetici) ve hangi doküman türünün hangi gruba açık olduğunu bir tabloya yazın. (2) Yukarıdaki prompt şablonunu kendi rol ve tonunuza göre uyarlayıp yazın; bağlamı numaralı ve kaynaklı hâle getirin. (3) Üç turluk gerçekçi bir konuşma senaryosu yazın (soru → takip → takip) ve her takip sorusunun bağımsız hâlini elle üretin. (4) Bu senaryoda ACL filtresinin her turda neden yeniden uygulanması gerektiğini bir cümleyle açıklayın.

Kontrol listesi

  • [ ] Erişim kontrolünü retrieval filtresiyle uyguluyorum, sadece prompt'a güvenmiyorum.
  • [ ] Prompt şablonuma grounding, bilmiyorum izni, kaynak ve çelişki kuralını ekliyorum.
  • [ ] Bağlam parçalarını numaralı ve kaynaklı veriyorum.
  • [ ] Takip sorularını retrieval öncesi bağımsızlaştırıyorum.
  • [ ] Uzun konuşma geçmişini özetleyerek maliyet ve pencereyi yönetiyorum.