---
title: 'Bağlam Sıkıştırma'
source: 'https://academia.sh/tr/kurslar/yapay-zeka-ajanlari/baglam-sikistirma'
course: 'Yapay Zekâ Ajanları'
language: tr
updated: '2026-08-17T18:06:32+00:00'
license: 'CC BY-SA 4.0'
---

# Bağlam Sıkıştırma

Aynı 24 görevde iki sıkıştırma politikasının süpürülmesi: taşınan durum da ödendiğinde taban 21913 belirteç ve 0,9583 başarım veriyor. Seçici hatırlama tutulan alanı üçe indirdiğinde belirteç 16569'a düşüyor ve başarım hiç değişmiyor, ama atılan alanın gerektiği görev sayısı 0'dan 8'e çıkıyor. Özetleme aynı bütçede 0,7917'ye iniyor ve en sıkı ayarda belirteci 33566'ya, yani tabanın 1,53 katına çıkarıyor. Sıkıştırmanın işi kötüleştirdiği nokta budur.

Önceki ders belleği görevler arasında ele aldı: neyin yazıldığı sonraki görevlerde kazanılan adımı
belirliyordu. Görev içinde sorun tersine döner. Bağlam silinmez, **büyür**: her gözlem duruma
eklenir ve sonraki her adımda yeniden taşınır. Ortak döngünün belirteç sayımı bunun yalnız bir
yarısını görüyor — adım izini sayıyor, taşınan durumun kendisini saymıyor.

Bu ders önce o eksik kalemi ekler, sonra **bağlam sıkıştırmanın (context compaction)** iki
politikasını süpürür: **özetleme**, en eski alanları düşürüp yerlerine tek bir özet girdisi koyar;
**seçici hatırlama (selective recall)**, kalan adımların bildirdiği alanları tutar. Ölçülecek olan
iki sayının yan yana durmasıdır: sıkıştırma oranı arttıkça taşınan belirteç düşer, ama **atılan
alanın gerektiği görev sayısı** büyür. Bu ders kursun ikinci iddiasının bir örneğidir; en sıkı
ayarda sıkıştırma belirteci tabanın **üstüne** çıkarıyor.

- **AB67.** Kod bir **benzeticidir**; gerçek bir model uç noktası ya da araç sunucusu çağrılmaz.
  Ortam, araçlar ve görevler **kurgudur**, tohum **20260218**.
- **AB68.** Taşınan durum bir belirteç kalemidir: her alan, adı ve biçimi için 12 belirteç, değeri
  için kendi belirteç sayısı kadar ödenir ve bu bedel **her adımda yeniden** ödenir.
- **AB69. Sıkıştırma oranı `tut` ayarıyla verilir:** durumda en çok `tut` alan taşınır, fazlası
  düşürülür. Sıkıştırma her adımın sonunda uygulanır.
- **AB70. Özetleme** en eski alanları düşürür ve yerlerine tek bir özet girdisi koyar; girdi bir
  alan yeri kaplar ama kullanılabilir değer taşımaz.
- **AB71. Seçici hatırlama** aynı `tut` bütçesinde, planın kalan adımlarının **bildirdiği** alanları
  tutar; artan yeri en yeni alanlar doldurur.
- **AB72.** Bir araç, daha önce düşürülmüş bir alanı istediğinde **eksik alan** hatası döner. Bu
  hatanın en az bir kez görüldüğü görev, **atılan alanın gerektiği görev** sayılır.
- **AB73.** Görev kümesi 24, adım bütçesi 8, taban çizgisi **sıkıştırmasız döngüdür**.

## Taşınan Durumun Bedeli

Aşağıdaki blok ortak tanımı kurar ve taban çizgisini basar.

```python
# KURGU ortam ve KURGU ajan. Gercek bir model ucu, arac sunucusu ya da bellek
# servisi cagrilmaz. Abone kayitlari, belgeler ve gorevler kurgudur, tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


def belirtecle(m):
    b = []
    for s in str(m).lower().replace(",", " , ").split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


def izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
ABONE = {}
for i in range(60):
    r = uretec(TOHUM + 31 * i)
    onceki = 10000 + int(r() * 80000)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "onceki": onceki, "simdiki": onceki + int(r() * 70)}
BASAMAK, USTU = ((10, 4), (25, 7), (40, 11)), 16
ISYERI_KAT = 2
BELGE = {"TR01": "tarife basamaklari 10 25 40 metrekup ve ustu",
         "TR02": "isyeri abonesinde birim ucret iki katidir",
         "SY01": "endeks farki tuketimi verir sayac donusu 100000 eklenir",
         "AR01": "ariza kaydi acildiginda saha ekibi iki gun icinde gider",
         "KS01": "planli kesinti duyurusu bir hafta once yayimlanir"}

CAGRI = [0]                              # arac cagri sayaci


def _bedel(m3, tip):
    kalan, alt, top = m3, 0, 0
    for ust, birim in BASAMAK:
        dilim = min(kalan, ust - alt)
        if dilim <= 0:
            break
        top += dilim * birim
        kalan -= dilim
        alt = ust
    top += kalan * USTU
    return top * (ISYERI_KAT if tip == "isyeri" else 1)


def t_sayac_oku(abone=None, **_):
    a = ABONE.get(abone)
    if a is None:
        return {"hata": "abone yok"}
    return {"onceki": a["onceki"], "simdiki": a["simdiki"], "tip": a["tip"],
            "bolge": a["bolge"]}


def t_tuketim(onceki=None, simdiki=None, **_):
    if onceki is None or simdiki is None:
        return {"hata": "eksik alan"}
    f = simdiki - onceki
    return {"m3": f + 100000 if f < 0 else f}


def t_tarife(m3=None, tip="mesken", **_):
    if m3 is None:
        return {"hata": "eksik alan"}
    return {"tutar": _bedel(m3, tip)}


def t_belge(anahtar=None, **_):
    if not anahtar:
        return {"hata": "eksik alan"}
    ab = set(belirtecle(anahtar))
    en, kod = -1, None
    for k, m in BELGE.items():
        o = len(ab & set(belirtecle(m)))
        if o > en:
            en, kod = o, k
    return {"kod": kod, "metin": BELGE[kod]} if en > 0 else {"hata": "bulunamadi"}


def t_kayit(abone=None, sutun=None, deger=None, **_):
    if not (abone and sutun and deger is not None):
        return {"hata": "eksik alan"}
    return {"yazildi": True, "abone": abone, "sutun": sutun, "deger": deger}


ARAC = {
    "sayac_oku":  {"islev": t_sayac_oku, "alan": ("abone",), "yan_etki": False},
    "tuketim":    {"islev": t_tuketim, "alan": ("onceki", "simdiki"), "yan_etki": False},
    "tarife":     {"islev": t_tarife, "alan": ("m3", "tip"), "yan_etki": False},
    "belge_ara":  {"islev": t_belge, "alan": ("anahtar",), "yan_etki": False},
    "kayit_yaz":  {"islev": t_kayit, "alan": ("abone", "sutun", "deger"), "yan_etki": True},
}
ARAC_ADI = list(ARAC)


def cagir_arac(ad, durum):
    """Sema disindaki alanlar suzulur; eksik alan aracin kendi hatasidir."""
    CAGRI[0] += 1
    if ad not in ARAC:
        return {"hata": "arac yok"}
    kw = {a: durum[a] for a in ARAC[ad]["alan"] if a in durum}
    return ARAC[ad]["islev"](**kw)


GOREV = []
for i in range(24):
    r = uretec(TOHUM + 9973 * i)
    ab = f"A{1 + int(r() * 60):03d}"
    t = ayrik(r(), [0.30, 0.22, 0.20, 0.28])
    if t == 0:
        GOREV.append({"ad": f"G{i + 1:02d}", "tur": "bedel", "abone": ab,
                      "istek": f"{ab} abonesinin bu donem bedeli nedir",
                      "dizi": ("sayac_oku", "tuketim", "tarife")})
    elif t == 1:
        GOREV.append({"ad": f"G{i + 1:02d}", "tur": "tuketim", "abone": ab,
                      "istek": f"{ab} abonesinin bu donem tuketimi kac metrekup",
                      "dizi": ("sayac_oku", "tuketim")})
    elif t == 2:
        GOREV.append({"ad": f"G{i + 1:02d}", "tur": "belge", "abone": ab,
                      "istek": "sayac donusunde endeks farki nasil hesaplanir",
                      "dizi": ("belge_ara",)})
    else:
        GOREV.append({"ad": f"G{i + 1:02d}", "tur": "kayit", "abone": ab,
                      "istek": f"{ab} abonesinin bedelini hesapla ve kayda yaz",
                      "dizi": ("sayac_oku", "tuketim", "tarife", "kayit_yaz")})


def dogru_yanit(g):
    a = ABONE[g["abone"]]
    f = a["simdiki"] - a["onceki"]
    m3 = f + 100000 if f < 0 else f
    if g["tur"] == "tuketim":
        return m3
    if g["tur"] == "belge":
        return "SY01"
    return _bedel(m3, a["tip"])


def gorme(d):
    return max(0.34, 0.80 - 0.09 * (d - 1))    # dogru araci secme payi, derinlikle duser


def ajan(g, en_cok_adim=8, tohum=TOHUM, oz_elestiri=False, onay=False):
    """KURGU ajan dongusu. Gercek bir model cagrilmaz; arac secimi gorevin
    dizisine ve derinlige bagli tek bir cekilisten gelir."""
    r = uretec(tohum ^ izno(g["ad"]))
    alan = {"abone": g["abone"], "anahtar": g["istek"], "sutun": "bedel"}
    iz, adim, bel, hata = [], 0, 0, 0
    dizi, k = g["dizi"], 0
    while adim < en_cok_adim:
        adim += 1
        bel += 60 + 22 * len(iz)
        hedef = dizi[k] if k < len(dizi) else None
        if hedef is None:                          # is bitti , ajan durmali
            if r() < 0.88:
                return {"bitti": True, "adim": adim, "iz": iz, "belirtec": bel,
                        "hata": hata, "yanit": alan.get("sonuc"),
                        "onay": alan.get("onay", 0)}
            sec = ARAC_ADI[int(r() * len(ARAC_ADI))]
        else:
            sec = hedef if r() < gorme(k + 1) else ARAC_ADI[int(r() * len(ARAC_ADI))]
        if ARAC[sec]["yan_etki"] and onay:
            alan["onay"] = alan.get("onay", 0) + 1
        if sec == "kayit_yaz":
            alan["deger"] = alan.get("sonuc")
        s = cagir_arac(sec, alan)
        iz.append((sec, "hata" in s))
        bel += 30
        if "hata" in s:
            hata += 1
            if oz_elestiri:
                bel += 40
            continue
        alan.update({kk: vv for kk, vv in s.items() if kk != "hata"})
        if sec == "tuketim":
            alan["sonuc"] = s["m3"]
        if sec == "tarife":
            alan["sonuc"] = s["tutar"]
        if sec == "belge_ara":
            alan["sonuc"] = s["kod"]
        if sec == hedef:
            k += 1
    return {"bitti": False, "adim": adim, "iz": iz, "belirtec": bel, "hata": hata,
            "yanit": alan.get("sonuc"), "onay": alan.get("onay", 0)}

CAGRI[0] = 0
t = [ajan(g) for g in GOREV]
print("taban: adim", sum(x["adim"] for x in t), ", cagri", CAGRI[0], ", iz belirteci",
      sum(x["belirtec"] for x in t), ", hata", sum(x["hata"] for x in t), ", basarim",
      round(sum(x["yanit"] == dogru_yanit(g) for x, g in zip(t, GOREV)) / 24, 4))
```

```
taban: adim 97 , cagri 74 , iz belirteci 11978 , hata 8 , basarim 0.9583
```

Ortak döngü 24 görevi 97 adımda bitiriyor ve 11978 belirteç sayıyor. Bu sayı **yalnız izi**
kapsıyor: her adımda o ana kadarki araç adları ve gözlem başlıkları. Oysa modele giden istem
durumu da taşır — okunan endeksler, abone tipi, bulunan belge metni. Her alan her adımda yeniden
ödenir ve durum büyüdükçe bu kalem izden hızlı büyür.

## Sıkıştırma Oranını Süpürmek

Aşağıdaki blok bedeli tamamlar ve iki politikayı dört ayarda süpürür.

```python
AD_BEDEL = 12                       # tasinan alanin ad ve bicim bedeli
SONUC = {"tuketim": "m3", "tarife": "tutar", "belge_ara": "kod"}


def durum_belirteci(alan):
    return sum(AD_BEDEL + len(belirtecle(v)) for v in alan.values())


def sikistir(alan, kalan, tut, politika):
    """tut alandan fazlasi dusurulur. ozet en eskiyi dusurup yerine tek bir
    ozet girdisi koyar; secici, kalan adimlarin bildirdigi alanlari tutar."""
    if len(alan) <= tut:
        return alan, ()
    anahtar = list(alan)
    if politika == "secici":
        gerek = {a for ad in kalan for a in ARAC[ad]["alan"]} | {"sonuc"}
        anahtar.sort(key=lambda k: k in gerek)
    atilan = tuple(anahtar[:len(alan) - tut])
    yeni = {k: v for k, v in alan.items() if k not in atilan}
    if politika == "ozet":
        yeni["ozet"] = f"{len(atilan)} alan dusuruldu"
    return yeni, atilan


def ajan_s(g, tut=99, politika="ozet", tohum=TOHUM, en_cok_adim=8):
    """Ortak dongu, her adimin sonunda baglam sikistirmasiyla."""
    r = uretec(tohum ^ izno(g["ad"]))
    alan = {"abone": g["abone"], "anahtar": g["istek"], "sutun": "bedel"}
    iz, adim, bel, hata, atilan, geri = [], 0, 0, 0, set(), 0
    dizi, k = g["dizi"], 0
    while adim < en_cok_adim:
        adim += 1
        bel += 60 + 22 * len(iz) + durum_belirteci(alan)
        hedef = dizi[k] if k < len(dizi) else None
        if hedef is None:
            if r() < 0.88:
                break
            sec = ARAC_ADI[int(r() * len(ARAC_ADI))]
        else:
            sec = hedef if r() < gorme(k + 1) else ARAC_ADI[int(r() * len(ARAC_ADI))]
        if sec == "kayit_yaz":
            alan["deger"] = alan.get("sonuc")
        eksik = [a for a in ARAC[sec]["alan"] if a not in alan and a in atilan]
        s = cagir_arac(sec, alan)
        iz.append(sec)
        bel += 30
        if "hata" in s:
            hata, geri = hata + 1, geri + bool(eksik)
            continue
        alan.update({kk: vv for kk, vv in s.items() if kk != "hata"})
        if sec in SONUC:
            alan["sonuc"] = s[SONUC[sec]]
        if sec == hedef:
            k += 1
        alan, at = sikistir(alan, dizi[k:], tut, politika)
        atilan |= set(at)
    return {"adim": adim, "belirtec": bel, "hata": hata, "geri": geri,
            "yanit": alan.get("sonuc")}


def kosum(tut, politika, tohum=TOHUM):
    CAGRI[0] = 0
    ad = bel = hata = geri = dogru = 0
    for g in GOREV:
        s = ajan_s(g, tut, politika, tohum)
        ad, bel, hata = ad + s["adim"], bel + s["belirtec"], hata + s["hata"]
        geri, dogru = geri + (s["geri"] > 0), dogru + (s["yanit"] == dogru_yanit(g))
    return ad, CAGRI[0], bel, hata, geri, dogru / len(GOREV)


DUZEN = [(99, "sikistirmasiz")] + [(t, p) for p in ("ozet", "secici")
                                   for t in (6, 5, 4, 3)]
print("tut politika        adim cagri belirtec hata gerekti basarim | 2. kosum")
for tut, pol in DUZEN:
    a = kosum(tut, "ozet" if tut == 99 else pol)
    b = kosum(tut, "ozet" if tut == 99 else pol, TOHUM + 1)
    print(f"{tut if tut != 99 else '--':>3} {pol:<14} {a[0]:>4} {a[1]:>5} {a[2]:>8}"
          f" {a[3]:>4} {a[4]:>6}  {a[5]:>6.4f} | {b[2]:>6} {b[5]:.4f}")
```

```
tut politika        adim cagri belirtec hata gerekti basarim | 2. kosum
 -- sikistirmasiz    97    74    21913    8      0  0.9583 |  21998 0.9583
  6 ozet            102    82    21281   29      5  0.9167 |  23749 0.9167
  5 ozet             98    77    19027   24      6  0.9583 |  21458 0.9583
  4 ozet             98    77    18086   24      6  0.7917 |  20420 0.7500
  3 ozet            156   149    33566  125     18  0.2917 |  34523 0.2500
  6 secici           97    74    19023   15      3  0.9583 |  19233 1.0000
  5 secici           97    74    18004   18      5  0.9583 |  18184 1.0000
  4 secici           98    77    17475   24      6  0.9583 |  18846 1.0000
  3 secici           98    77    16569   24      8  0.9583 |  17861 1.0000
```

Durum kalemi eklenince taban 11978'den **21913 belirtece** çıkıyor: taşınan durum, izin
kendisinden fazla tutuyor. Sıkıştırılacak yer buradadır.

Seçici satırlar beklendiği gibi ilerliyor. `tut` altıdan üçe inerken belirteç 19023'ten
**16569'a**, yani tabana göre **0,2439** oranında düşüyor. Bedeli iki sütunda görünüyor: araç
hatası sıkıştırmasız satırdaki 8'den 24'e çıkıyor ve **atılan alanın gerektiği görev** sayısı
0'dan **8'e**, yani yirmi dört görevin üçte birine tırmanıyor. Başarım ise ilk koşumda 0,9583'te
sabit, ikinci koşumda 1,0000. Düşen alanlar bir sonraki adımı bozuyor, ama ajan aynı aracı yeniden çağırarak alanı geri
kazanıyor; bedel adım değil hata olarak ödeniyor.

Özet satırları aynı yönde başlayıp kopuyor. `tut` dörtte belirteç 18086 ile seçicinin biraz
üstünde, ama başarım **0,7917** — ikinci koşumda 0,7500. `tut` üçte tablo tersine dönüyor:
belirteç **33566**, yani sıkıştırmasız tabanın **1,53 katı**; adım 97'den 156'ya, araç çağrısı
74'ten 149'a, araç hatası 8'den **125'e** çıkıyor ve başarım 0,2917'ye iniyor. Sıkıştırma burada
bir tasarruf değil, bir çoğaltıcıdır: düşürülen alan bir hataya, hata yeni bir adıma, yeni adım
yeniden taşınan bir bağlama yol açıyor.

## Aynı Bütçe, Başka İçerik

Tablonun en çok şey söyleyen yeri `tut` dört satırlarıdır. İki politika **aynı sayıda alan**
taşıyor; belirteç farkı 611, yani yüzde dörtten az. Başarım farkı ise 0,7917'ye karşı 0,9583 ve
ikinci koşumda 0,7500'e karşı 1,0000. Koşumlar arasındaki en büyük fark 0,0417 iken bu açıklık
bandın dört ve altı katı, yani **ölçülmüştür**. Bağlamın **boyutu** değil, **hangi alanların
kaldığı** belirliyor.

Bu, Model API'leri ile Uygulama Geliştirme kursunda ölçülen bulgunun bellek tarafındaki
karşılığıdır: orada bir düzenleme görevinde beklenen kabul, bütün dosyalar bağlama konduğunda
0,6921, yalnız ilgili dosyalar seçildiğinde **0,8233** çıkmıştı. Oradaki seçim dosyalar
üzerindeydi, buradaki seçim ajanın kendi gözlemleri üzerindedir; sonuç aynı yöne bakıyor. İlgisiz
bağlam yalnız pahalı değildir, ilgili olanın yerini de kaplar.

## Özet

- Taşınan durum her adımda yeniden ödenir: iz belirteci 11978 iken durumla birlikte taban 21913
  belirtece çıkıyor.
- Seçici hatırlama `tut` üçte belirteci 16569'a, tabana göre 0,2439 oranında indiriyor ve başarımı
  değiştirmiyor.
- Aynı süpürmede atılan alanın gerektiği görev sayısı 0'dan 8'e, araç hatası 8'den 24'e çıkıyor:
  kazanılan belirtecin bedeli burada yazılıdır.
- Aynı `tut` bütçesinde özetleme 0,7917, seçici hatırlama 0,9583 veriyor; fark iki koşum farkının
  dört ve altı katıdır.
- `tut` üçte özetleme belirteci 33566'ya, tabanın 1,53 katına çıkarıyor; sıkıştırma bu noktada
  tasarruf değil çoğaltıcıdır.

## Sonraki Adım

Bu iki derste bellek iki yönden ele alındı: görevler arasında neyin yazılacağı, görev içinde neyin
taşınacağı. İkisinde de kayıtların **doğru** olduğu varsayıldı. Oysa bir sayaç yeniden okunur, bir
tarife değişir, bir belge yenilenir; uzun süreli bellekteki kayıt yerinde durur ve **sessizce
yanlışa döner**. Bunu bir alan düşürmesi çözmez, çünkü sorun yerin darlığı değil kaydın yaşıdır.
Sonraki ders eskitme eşiğini süpürür ve iki sayıyı yan yana koyar: eşik sıkılaştıkça bayat kayıt
düşer, ama hâlâ geçerli olduğu hâlde atılan kayıtların payı büyür.
