Bağlam bütçesi dağıtmak ve taşmayı önlemek
Bağlam bütçesi, pencereden önce çıktı payı ayrılıp kalan yerin sabit ve değişken bölümlere paylaştırılmasıyla dağıtılır: sistem istemi, örnekler ve araç tanımları sabit; getirilen parçalar ile konuşma geçmişi değişken bölümdür. Çıktı payını en başta ayırın, çünkü taşmaların çoğu girdi büyürken yanıta yer kalmamasından çıkar. Değişken bölüm dolduğunda kesme kuralı önceden yazılı ve deterministik olsun: önce puan eşiğinin altındaki getirilen parça, sonra en eski konuşma turu düşer. Önemli bilgiyi başa ve sona yerleştirin; uzun bağlamda ortada kalan içerikten yararlanma daha zayıf olabiliyor.
ÖNKOŞULLAR
- Kullandığınız modelin tokenleştiricisine erişim — metni token olarak sayabilmek
- İstemi tek parça metin olarak değil, ayrı bölümler hâlinde üreten bir kurulum
- Geri getirme yapıyorsanız her parçanın puanını ve kaynağını taşıyan bir arama katmanı
- Üretimden alınmış, uzunluk dağılımını temsil eden gerçek istek kayıtları
GEREKEN ARAÇLAR
- Modelinizinkiyle aynı tokenleştirici kütüphanesi
- Bölümleri sırayla birleştiren ve ölçen bir istem derleyici katmanı
- Puanlı sonuç döndüren bir geri getirme katmanı
- Özetleme veya sıkıştırma için ikinci bir model çağrısı yolu
- Bölüm başına token sayısını kaydeden bir iz kaydı altyapısı
- 01
Pencereyi bölümlere ayır
Bağlam penceresini sistem istemi, örnekler, araç tanımları, getirilen parçalar, konuşma geçmişi ve çıktı payı olarak ayırın ve her bölüme yazılı bir üst sınır verin.
Pencereyi tek bir metin olarak düşünmek, taşmayı da tek bir arıza olarak görmeye yol açıyor. Oysa içeride birbirinden çok farklı davranan bölümler var: bazıları her istekte aynı, bazıları isteğe göre değişiyor, bazıları zamanla büyüyor. Bütçe bu davranış farkına göre kurulur — hepsine aynı kuralı uygulayan bir kesme mantığı en değerli bölümü ilk elden atabilir.
Bölüm Davranışı Bütçedeki rolü Sistem istemi ve kurallar Her istekte aynı Sabit; değişmesi istem değişikliğidir Örnekler Her istekte aynı Sabit ama budanabilir; en kolay kazanç burada Araç tanımları ve şemalar Araç listesine bağlı Sabit görünür, sessizce büyür Getirilen parçalar Sorguya göre değişir Değişken; token payıyla sınırlanır Konuşma geçmişi Zamanla büyür Değişken; önce sıkışır, sonra düşer Çıktı payı Yanıt uzunluğuna bağlı Önce ayrılır, girdiyle yarıştırılmaz - 02
Çıktı payını en başta ayır
En uzun makul yanıtın kaç token olduğunu ölçüp bu payı girdiyi doldurmadan kenara koyun; girdi bütçesi pencereden değil, pencere eksi çıktı payından hesaplanır.
Girdi ve çıktı aynı pencereyi paylaşır. Girdi büyüdükçe yanıta kalan yer daralır ve bu daralma çoğu zaman bir hata olarak değil, yarıda kesilmiş bir cevap olarak görünür — yani en zor fark edilen biçimde. Bu yüzden çıktı payı en başta ayrılır.
- Payı ölçerek belirleyin: mevcut yanıtlarınızın uzunluk dağılımına bakın ve en uzunlarını barındıracak bir pay seçin.
- Akıl yürütme adımlarını çıktı olarak üreten modellerde bu adımlar da çıktı payından düşer; kullanıcıya gösterilmeyen metin de token harcar.
- Yapılandırılmış çıktıda payı cömert tutun: yarım kalan bir belge ayrıştırılamaz, yarım kalan bir paragraf okunabilir.
- Çıktı üst sınırını istem yapılandırmasına yazın; her çağrı noktasında elle verilen değerler zamanla birbirinden ayrışır.
- 03
Bölümleri modelin tokenleştiricisiyle ölç
Her bölümün uzunluğunu modelin kendi tokenleştiricisiyle ölçün; karakter ya da kelime üzerinden yapılan tahmin, özellikle Türkçe metinde sistematik olarak yanılır.
Türkçe sondan eklemeli bir dil: tek bir kelime çoğu tokenleştiricide birden fazla parçaya bölünür ve bu bölünme İngilizce metinden farklı davranır. "Kelime sayısını şu katsayıyla çarp" türü kestirmeler ortalamada idare eder, bütçenin kenarında çalışırken sizi yanlış tarafta bırakır. Ölçüm, kullandığınız modelin tokenleştiricisiyle yapılır.
- Şablonun kendi metni: rol etiketleri, ayraçlar, bölüm başlıkları.
- JSON alan adları ve şema açıklamaları — yapılandırılmış çıktı istedikçe büyürler.
- Araç tanımları: her aracın adı, açıklaması ve parametre şeması her istekte gönderilir.
- Getirilen parçaların üst verisi: kaynak adı, tarih, bağlantı. Parça metninin yanında azımsanacak bir yer tutmazlar.
python def butce_raporu(bolumler: dict[str, str], tokenlestirici) -> dict[str, int]: """Bölüm başına token sayısı — bütçe kararları bu tabloya bakar.""" return {ad: len(tokenlestirici.encode(metin)) for ad, metin in bolumler.items()}Doğrulama adımı: üretimden alınmış birkaç yüz isteği bu raporla ölçün ve bölüm başına dağılıma bakın. Ekipler burada çoğu zaman ilk kez, pencerenin hatırı sayılır bir kısmını aylardır hiç sorgulamadıkları sabit bir bölümün yediğini görüyor.
- 04
Sabit bölümü buda
Sistem istemini ve örnekleri düzenli olarak budayın; bir örneğin çıkarılması sonuçları değiştirmiyorsa o örnek davranış değil yalnızca yer üretiyordur.
Sabit bölüm bütçenin sessizce büyüyen kısmı: her olaydan sonra bir cümle ekleniyor, hiçbir zaman bir cümle çıkarılmıyor. Oysa sabit bölüm her istekte yeniden ödenen bir maliyettir ve büyüdükçe değişken bölümün — yani asıl kanıtın — yerini alır.
- Birbirinin varyasyonu olan örnekler: aynı davranışı öğreten ikinci örnek nadiren kazanç sağlar.
- Artık geçerli olmayan kurallar: kaldırılmış bir özelliğe ya da kapanmış bir vakaya ait talimatlar.
- Uzun rol ve nezaket metinleri: davranışı belirlemiyorsa yalnızca yer kaplıyorlar.
- Örnek çıktının tamamı yerine çıktı şeması: biçim, şemayla çok daha kısa anlatılır.
Budama kör yapılmaz: bir örneği çıkarın, regresyon kümesinde koşturun, fark yoksa çıkarılmış kalsın. İstem sürümleme takımı kurulmuşsa bu birkaç dakikalık bir iştir; kurulmamışsa budama riskli göründüğü için hiç yapılmaz ve sabit bölüm her yıl biraz daha büyür.
- 05
Getirilen parçaya sayı değil pay ver
Geri getirmeden sabit sayıda parça almak yerine parçalara token payı verin, payı puan sırasına göre doldurun ve eşiğin altındaki parçayı yer kalsa da eklemeyin.
Sabit bir parça sayısı — ilk beş, ilk on — iki yönde birden yanlış: kısa parçalarla pencere boş kalır, uzun parçalarla taşar. Doğru birim token. Adaylar puan sırasına dizilir ve pay dolana kadar eklenir; sığmayan bir parça atlanır, arkasındaki daha kısa aday hâlâ girebilir.
python def parcalari_sec(adaylar, pay: int, esik: float, tokenlestirici): """Puan sırasına göre doldur; eşiğin altını hiç ekleme.""" secilen, kullanilan = [], 0 for parca in sorted(adaylar, key=lambda x: x.puan, reverse=True): if parca.puan < esik: break uzunluk = len(tokenlestirici.encode(parca.metin)) if kullanilan + uzunluk > pay: continue # sığmadı; daha kısa bir aday hâlâ girebilir secilen.append(parca) kullanilan += uzunluk return secilen- Puan eşiği koyun: boş yer kaldı diye ilgisiz parça eklemek ilgili kanıtı seyreltir.
- Tekrarı ayıklayın: aynı metnin iki sürümü iki kat yer kaplar, tek kat bilgi verir.
- Parçanın üst verisini kısaltın ama kaynağını koruyun; kaynak gösterimi çıktının doğrulanabilirliğini taşır.
- Pay dolmadan adaylar bittiyse bunu bir sinyal sayın: sorun bütçede değil dizinde ya da sorguda.
- 06
Geçmişi kesmek yerine sıkıştır
Konuşma geçmişini baştan kesmek yerine eski turları bir özete indirin ve son turları ham bırakın; özetin kendisi de bütçede ayrı bir kalemdir.
Baştan kesme en ucuz çözüm gibi görünür ama en pahalı bilgiyi atar: kullanıcının ilk turlarda verdiği kısıtları. "Türkçe yaz", "kısa tut", "şu müşteri için" gibi talimatlar konuşmanın başındadır; kesildiklerinde model kuralı unutmuş gibi görünür, oysa kural o istekte pencereye hiç girmemiştir.
- 1Eşiği yakala
Geçmiş kendisine ayrılan payı aştığında sıkıştırma tetiklenir; her turda değil.
- 2Sıkıştırılacak aralığı seç
En eski turlar seçilir; son birkaç tur her zaman ham kalır çünkü "bu", "şu" gibi göndermeler oralara dayanır.
- 3Özeti üret
Ayrı ve ucuz bir çağrıyla, neyin saklanacağı şemayla belirtilerek özet çıkarılır.
- 4Özeti sabit bölüme yaz
Özet geçmişin başında tek bir blok olarak durur ve bir sonraki sıkıştırmada güncellenir.
- Kullanıcının verdiği kısıtlar ve tercihler
- Alınmış kararlar ve açıkça reddedilmiş seçenekler
- Kimlikler: kayıt numarası, dosya adı, kişi ve ürün adları
- Açık kalan sorular ve bekleyen adımlar
- 07
Sırayı konuma göre kur
En kritik talimatı ve en güçlü kanıtı bağlamın başına ve sonuna yerleştirin; uzun bağlamda ortada kalan içerikten yararlanma daha zayıf olabiliyor.
Uzun bağlam çalışmalarında tekrarlanan bir gözlem var: modelin bir bilgiden yararlanma başarısı, o bilginin bağlam içindeki konumuna göre değişiyor; başta ve sonda duran içerik, ortada kalana göre daha güvenilir biçimde kullanılıyor. Bu, pencereye sığdırmanın tek başına yeterli olmadığı anlamına gelir — sıra da bir tasarım kararıdır.
- Davranışı belirleyen kurallar en başta durur.
- Kullanıcının sorusu sonda tekrar edilir; uzun bir kanıt yığınının ardından soru yeniden görünür olmalı.
- Getirilen parçaları düz puan sırasına dizmek yerine en güçlü adayları uçlara yerleştirmeyi deneyin.
- Biçim talimatı kanıttan sonra gelsin; biçim kuralının kanıt yığınının ortasında kalması, biçim hatalarının bilinen kaynaklarından biri.
- 08
Taşma davranışını deterministik yap
Bütçe aşıldığında neyin düşeceğini tek bir yerde ve sabit bir öncelik sırasıyla tanımlayın; düşen her parçanın kimliğini iz kaydına yazın.
Taşma anı, sistemin en çok kişiselleşen anıdır: her çağrı noktası kendi kesme mantığını yazmışsa aynı girdi iki farklı yolda iki farklı bağlam üretir ve hata yeniden üretilemez. Kesme kuralı tek bir yerde yaşamalı ve deterministik olmalı — aynı girdi her zaman aynı bağlamı üretmeli.
Öncelik Bölüm Taşmada davranış 1 — hiç düşmez Sistem kuralları ve güvenlik talimatları Düşerse davranış garantisi kalmaz 2 — hiç düşmez Kullanıcının son mesajı Sorunun kendisi kesilemez 3 — ilk düşen En düşük puanlı getirilen parçalar Sondan başa doğru atılır 4 — sıkışır Eski konuşma turları Önce özete indirilir, sonra düşer 5 — budanır Örnekler Sayıları azaltılır; tamamı kalkarsa biçim bozulabilir python def bagla(bolumler, pay, korunan_tur: int = 2): """Sabit öncelikle kes; ne düştüğünü de döndür.""" # Parçalar ve örnekler sondan düşer: en düşük puanlı aday en sonda durur. # Geçmiş baştan düşer — en eski tur gider, son turlar ham kalır. dusenler = [] while olc(bolumler) > pay and bolumler["parcalar"]: dusenler.append(("parcalar", bolumler["parcalar"].pop())) while olc(bolumler) > pay and len(bolumler["gecmis"]) > korunan_tur: dusenler.append(("gecmis", bolumler["gecmis"].pop(0))) while olc(bolumler) > pay and bolumler["ornekler"]: dusenler.append(("ornekler", bolumler["ornekler"].pop())) if olc(bolumler) > pay: raise BaglamTasti(dusenler) # kesilecek yer kalmadı: sessizce devam etme return bolumler, dusenler - 09
Bütçeyi üretim dağılımına göre ayarla
Bölüm başına token sayısını her istek için kaydedin ve dağılımı düzenli inceleyin; bütçe tahminle değil, üretimden gelen gerçek dağılımla ayarlanır.
İlk bütçe bir tahmindir ve her zaman yanlıştır; önemli olan ne kadar çabuk düzeltildiği. Bölüm başına token sayısını kaydedin, taşma oranını ve düşen parça sayısını izleyin. Bu üç sayı, hangi bölümden alıp hangisine vereceğinizi söyler — tartışma sezgiden çıkar.
Belirti Muhtemel neden Bakılacak yer Model verilen kuralı uygulamıyor Kural ortada kaldı veya kesildi Sıralama ve taşma kaydı Cevap kaynak göstermiyor Parçalar paya sığmadı Getirilen parça payı ve puan eşiği Yanıt yarıda kesiliyor Çıktı payı yetersiz Sonlanma nedeni dağılımı Uzun konuşmalarda kalite düşüyor Geçmiş kör kesiliyor Sıkıştırma tetikleyicisi ve özetin içeriği Bütçe sürekli taşıyor Sabit bölüm büyümüş Sistem istemi ve araç tanımlarının token sayısı Beş belirtinin beşi de model değiştirerek değil, bütçe kalemlerini yeniden dağıtarak çözülüyor. - Bölüm başına token dağılımı — ortalama değil, yüzdelikler
- Taşma oranı ve istek başına düşen parça sayısı
- Çıktı payının fiilen kullanılan kısmı
- Kesilen yanıt oranı
SIK DÜŞÜLEN TUZAKLAR
Pencereyi depo sanmak
Modele daha çok belge vermek cevabı kendiliğinden iyileştirmez. İlgisiz parça hem ilgili kanıtı seyreltir hem gecikmeyi artırır; bütçeyi doldurmak bir hedef değil, bir sonuçtur.
Çıktı payını unutmak
Girdi uzadıkça yanıt yarıda kesilir ve bu çoğu zaman hata olarak dönmez. Yapılandırılmış çıktıda sonuç ayrıştırılamayan bir cevap, serbest metinde ise yarım kaldığı fark edilmeyen bir paragraftır.
Kelime sayısıyla token tahmin etmek
Sondan eklemeli yapısı nedeniyle Türkçe metin, İngilizce için türetilmiş katsayılarla tutarlı biçimde yanlış ölçülür. Bütçenin kenarında çalışan bir sistemde bu fark doğrudan taşma demektir.
Geçmişi baştan kesmek
İlk turlarda verilen kısıtlar — dil, biçim, hitap edilen kişi — ilk düşen şeylerdir. Model kuralı unutmuş gibi görünür; oysa kural o istekte modele hiç gösterilmemiştir.
Araç tanımlarını bütçeye saymamak
Araç şemaları her istekte gönderilir ve pencereden düşer. Araç sayısı arttıkça sabit bölüm sessizce büyür; kimse istemi uzatmadığı hâlde getirilen parçalara kalan yer küçülür.
KONTROL LİSTESİ
- Pencere bölümlere ayrılmış ve her bölümün yazılı bir üst sınırı var
- Çıktı payı girdiden önce ayrılıyor; akıl yürütme adımları bu paya dâhil
- Token sayımı modelin kendi tokenleştiricisiyle yapılıyor
- Araç tanımları ve şema metinleri de bütçeye dâhil ediliyor
- Getirilen parçalar sabit sayıyla değil token payı ve puan eşiğiyle seçiliyor
- Geçmiş sıkıştırmasında kısıtlar, kararlar ve kimlikler korunuyor
- Taşma önceliği tek yerde tanımlı ve düşen parçalar kayda geçiyor
- Bölüm başına token dağılımı düzenli raporlanıyor
Maddelerin tamamı işaretlenmeden kurulum üretime alınmamalı.
Sık sorulan sorular
Bağlam penceresi büyükse bütçe dağıtmaya gerek var mı?
Evet. Büyük pencere sınırı kaldırmaz, yalnızca uzağa taşır ve üç maliyet yerinde kalır: uzun bağlam gecikmeyi artırır, ilgisiz içerik ilgili kanıtı seyreltir, ortada kalan bilgiden yararlanma daha zayıf olabiliyor. Pratikte pencereyi doldurmak bir hedef değil; "bu isteğin cevabı için hangi içerik gerekli" sorusunun cevabı ne kadar azsa sonuç o kadar kararlı oluyor.
İsteme kaç parça (chunk) göndermeli?
Sabit bir sayı yerine token payı ve puan eşiği kullanın: parçalar puan sırasına dizilir, pay dolana kadar eklenir ve eşiğin altındaki aday yer kalsa bile eklenmez. Kaç parçanın gerektiğini ölçmenin pratik yolu, cevapların kaç farklı parçaya atıf yaptığına bakmaktır — atıfların büyük çoğunluğu ilk birkaç parçadan geliyorsa payı büyütmek kaliteyi değil yalnızca gecikmeyi artırır.
Uzun konuşma geçmişi nasıl kısaltılır?
Eski turları ayrı bir çağrıyla özete indirin, son birkaç turu ham bırakın ve özeti geçmişin başında sabit bir blok olarak tutun. Özetin neyi koruyacağını şemayla belirtin: kullanıcının verdiği kısıtlar, alınan kararlar, reddedilen seçenekler, kayıt numarası ve isim gibi kimlikler, açık kalan sorular. Sıkıştırmayı her turda değil, geçmiş kendi payını aştığında tetikleyin; mümkünse tur bittikten sonra arka planda üretin.
Bağlam taştığında hata mı döndürmeli, kesmeli mi?
Karar işin türüne bağlı. Kanıta dayanması gereken işlerde — belge sorusu, karar üretimi, uyum kontrolü — eksik bağlamla üretilen cevap yanlış cevaptır; hata döndürüp isteği küçültmek doğrudur. Sohbet gibi süreklilik taşıyan işlerde deterministik kesme daha iyidir, ama iki koşulla: öncelik sırası önceden yazılı olmalı ve neyin düştüğü hem kayda hem — kullanıcıyı ilgilendiriyorsa — arayüze yansımalıdır.
Kaynaklar
- 01"Lost in the Middle: How Language Models Use Long Contexts" — uzun bağlamda konum etkisi — Transactions of the Association for Computational Linguistics · Makale
- 02Model sağlayıcılarının bağlam sınırı ve tokenleştirme dokümantasyonları — Model sağlayıcıları · Dokümantasyon
- 03Sinaptik Research — bağlam bütçesi ve taşma kuralı uygulama notları — Sinaptik Lab · Teknik rapor
BUILD
Bu rehberi kurumunuzda uygulayalım mı?
Aynı mimariyi kendi verinizle kurmak için discovery oturumundan üretime kadar birlikte ilerliyoruz.
