---
title: 'Akıl Yürüt ve Davran'
source: 'https://academia.sh/tr/kurslar/istem-muhendisligi/akil-yurut-ve-davran'
course: 'İstem Mühendisliği'
language: tr
updated: '2026-08-17T18:06:39+00:00'
license: 'CC BY-SA 4.0'
---

# Akıl Yürüt ve Davran

Aynı istemde düşünce alanı ile eylem alanının birlikte istenmesinin ölçüsü: 120 kurgu destek talebinde eylem alanı istendiğinde yanıtların yalnız 0,1000 payı geçerli bir eylem alanı üretiyor, eylem kümesi isteme yazıldığında 0,5250, düşünce tek cümleye indirildiğinde 0,8000. Bedel giriş belirtecinde 5300'den 8060'a çıkıyor ve geçerli eylem alanı başına 645,8 belirteçten 102,1 belirtece iniyor. İki koşum karşılaştırması eylem kümesini yazmanın farkını ölçülemez bırakıyor.

Bu konunun ilk dört dersi aynı şeyi dört ayrı biçimde istedi: model, yanıtı vermeden önce
**kendi içinde** daha çok adım atsın. Adımlar zincir oldu, çoğaltıldı, dallandırıldı ve
soyutlandı; dördünde de hepsi modelin içinde geçti. Oysa bir talebi çözen adımlardan biri
düşünmek değil, **dışarıya bakmaktır** — bir belgeyi aramak, geçmiş bir kaydı getirmek, yeni
bir kayıt açmak. Bu ders o adımın **istemde nasıl istendiğini** ölçer: aynı istemde bir
**düşünce alanı** ve bir **eylem alanı** birlikte istendiğinde kaç yanıt geçerli bir eylem
alanı üretiyor ve bunun bedeli ne.

Ölçülen şey eylemin kendisi değildir. Bu derste hiçbir eylem çalıştırılmaz; araç düzeneği,
bellek ve döngü bu müfredatın yapay zekâ ajanları kursuna bırakılır.

- **AY41.** Kod gerçek bir model uç noktası çağırmaz; standart kitaplıkla yazılmış bir **dil
  modeli benzeticisini** çağırır. Destek talepleri de **kurgudur**: 120 kayıt, beş konu.
- **AY42.** Tohum **20260218**. Aynı istem aynı tohumda aynı yanıtı verir; belirsizlik **tohum
  değiştirilerek** ölçülür, ikinci koşum 20260219'dur.
- **AY43.** Eylem adları kurgudur ve üç tanedir; hiçbiri çalıştırılmaz, yanıt metni okunur ve
  orada bırakılır.
- **AY44.** Üç sayı ayrı ayrı sayılır: **etiket isabeti**, **eylem alanı taşıyan yanıt payı**
  ve **geçerli eylem alanı payı**. Geçerli sayılması için adın kapalı kümeden gelmesi ve
  argümanın parantezle kapanmış olması gerekir.
- **AY45.** Benzeticinin biçim dalı isteme bağlıdır: eylem alanı istendiğinde alan kalıpları,
  yalnız düşünce istendiğinde düşünce kalıpları üretilir; düşünce kalıplarının hepsi etiket
  taşır.
- **AY46.** Eylem adlarının isteme yazılması kalıp ağırlıklarını değiştirir. Etiket kümesini
  isteme yazmanın eylem kümesindeki karşılığıdır.
- **AY47.** En büyük çıktı **24 belirteçtir**. Uzun bir düşünce ile eylem alanı aynı yanıta
  sığmadığında durdurma koşulu alanı **ortadan keser** ve kesilen yanıtta eylem adı bozulur.
- **AY48.** Dört istem yalnız **metinde** ayrılır. Model, görev, küme ve tohum sabittir.

## Aynı İstemde İki Alan

Görev değişmedi: 120 kurgu talebin her biri beş konudan birine atanacak. Değişen tek şey
istemin metnidir. **P1** bu konunun bıraktığı yerdir: önce düşün, sonra etiketi yaz. **P2**
aynı isteme bir eylem alanı ekler. **P3** eylem kümesini açıkça sayar. **P4** buna tek bir
cümle daha ekler: düşünceyi kısa tut.

```python
# BENZETICI. Gercek bir model uc noktasi cagrilmaz; standart kitaplikla yazilmis bir dil
# modeli benzeticisidir. Destek talepleri ve eylem kumesi KURGU'dur; hicbir eylem calismaz.
import math

TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE, EN_UZUN = 240, 24


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 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 m:
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"]
KALIP = {
    "fatura": ["bu ayki fatura tutari gecen aya gore cok yuksek geldi",
               "faturami odedim ama sistemde borc gorunuyor",
               "fatura ayrintisini nereden gorebilirim"],
    "ariza": ["evde su akmiyor bir ariza var galiba",
              "baglanti bozuk oldu ve hic calismiyor",
              "ariza kaydi actim ama ekip gelmedi"],
    "sayac": ["sayac okumasi yanlis girilmis endeks tutmuyor",
              "sayac degisimi icin randevu istiyorum",
              "sayac uzerindeki endeks ile fatura ayni degil"],
    "tarife": ["hangi tarife basamagindayim ogrenmek istiyorum",
               "tarife degisikligi icin ne yapmam gerekiyor",
               "birim ucret abone tipine gore degisiyor mu"],
    "kesinti": ["mahallede kesinti var ne zaman gelecek",
                "planli kesinti duyurusu nereden takip edilir",
                "aksamdan beri kesinti yasiyoruz"],
}
EK = ["ayrica gecen ay da ayni sorun olmustu", "bu konuda memnun degilim",
      "acil bilgi almam gerekiyor", "kayit numaram elimde yok"]

TALEP = []
for i in range(120):
    r = uretec(TOHUM + i)
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    m = KALIP[k][int(r() * 3)]
    if r() < 0.34:
        m += " " + EK[int(r() * 4)]
    TALEP.append({"no": 4001 + i, "metin": m, "konu": k})

KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"]
IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura",
      "ariza": "ariza", "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza",
      "sayac": "sayac", "endek": "sayac", "okuma": "sayac",
      "tarif": "tarife", "birim": "tarife", "abone": "tarife", "basam": "tarife",
      "kesin": "kesinti", "duyur": "kesinti", "mahal": "kesinti",
      "borc": "odeme", "odedi": "odeme", "ucret": "odeme",
      "memnu": "sikayet", "sorun": "sikayet", "acil": "sikayet",
      "bilgi": "bilgi", "ogren": "bilgi", "nered": "bilgi"}
TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura",
         "ekip": "kesinti", "takip": "tarife", "giril": "fatura"}
SERBEST = ["talebiniz {k} konusuyla ilgili gorunuyor",
           "bu kayit {k} basligina girer , ilgili ekibe yonlendirildi",
           "kaydiniz alindi , konuyu inceleyip donus yapacagiz"]
SAYAC = [0]

EYLEM = ["belge_ara", "gecmis_getir", "kayit_ac"]        # KURGU eylem adlari
DUSUNCE = ["dusunce : metinde {k} isaretleri var | etiket : {k}",
           "dusunce : once konu belirlendi sonra etiket yazildi | etiket : {k}",
           "dusunce : kaydiniz alindi , {k} basligina girer"]
ALAN = ["dusunce : metinde {k} isaretleri var ve gecmis kayit kontrol edilmeli "
        "| eylem : belge_ara ( {k} )",
        "dusunce : {k} konusunda once gecmis kayit gerekli | eylem : gecmis_getir ( {k} )",
        "dusunce : bu kayit {k} basligina girer , dogrudan yanit yazilabilir"]
ALAN_KISA = ["dusunce : {k} isareti var | eylem : belge_ara ( {k} )",
             "dusunce : gecmis gerekli | eylem : gecmis_getir ( {k} )",
             "dusunce : {k} basligina girer"]


def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN):
    SAYAC[0] += 1
    bel = belirtecle(istem)
    if len(bel) > PENCERE:
        return {"durum": "baglam_asimi", "giris": len(bel), "cikis": 0,
                "yanit": "", "kesik": 0}
    if SAYAC[0] % 37 == 0:
        return {"durum": "hiz_siniri", "giris": len(bel), "cikis": 0,
                "yanit": "", "kesik": 0}
    r = uretec(tohum ^ izno(istem))
    if len(bel) > 90 and r() < 0.04:
        return {"durum": "zaman_asimi", "giris": len(bel), "cikis": 0,
                "yanit": "", "kesik": 0}
    aday = [k for k in KAVRAM if k[:5] in bel]
    if len(aday) < 3:
        aday = KAVRAM
    p = {k: 0.15 for k in aday}
    for t in bel:
        for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    if sicaklik <= 0.0:
        k = max(sorted(p), key=lambda a: p[a])
    else:
        e = [math.exp(p[a] / sicaklik) for a in sorted(p)]
        k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])]
    if "eylem" in bel:                                   # dusunce + eylem alani
        acik = all(a[:5] in bel for a in EYLEM)          # eylem kumesi yazilmis mi
        w = [0.46, 0.38, 0.16] if acik else [0.30, 0.22, 0.48]
        y = (ALAN_KISA if "kisa" in bel else ALAN)[ayrik(r(), w)].format(k=k)
    elif "dusun" in bel:                                 # yalniz dusunce alani
        y = DUSUNCE[ayrik(r(), [0.42, 0.26, 0.32])].format(k=k)
    elif "tek" in bel:
        y = k
    else:
        y = SERBEST[ayrik(r(), [0.42, 0.26, 0.32])].format(k=k)
    cb, kesik = belirtecle(y), 0
    if len(cb) > en_uzun:                                # durdurma kosulu
        cb, kesik = cb[:en_uzun], 1
        y = " ".join(cb)
    return {"durum": "tamam", "giris": len(bel), "cikis": len(cb),
            "yanit": y, "kesik": kesik}


def oku(y):
    for s in y.lower().split():
        if s in KONU:
            return s
    return None


def oku_eylem(y):                     # eylem alani okunuyor, hicbir eylem calistirilmiyor
    if "eylem :" not in y:
        return None
    p = y.split("eylem :", 1)[1].split()
    if len(p) < 3 or p[0] not in EYLEM or p[1] != "(" or ")" not in p[2:]:
        return None
    return p[0]


ETIKET = "Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , kesinti . "
EY = "Once dusun , sonra yapilacak eylemi yaz . "
KUME = "Eylem su kumeden secilir: belge_ara , gecmis_getir , kayit_ac . "
P1 = ETIKET + "Once dusun , sonra etiketi yaz . Talep: "
P2 = ETIKET + EY + "Talep: "
P3 = ETIKET + EY + KUME + "Talep: "
P4 = ETIKET + EY + KUME + "Dusunceyi kisa tut . Talep: "

t = TALEP[6]
print(f"KURGU talep {t['no']} ({t['konu']}): {t['metin']}")
for ad, o in (("P1 yalniz dusunce", P1), ("P2 eylem alani", P2),
              ("P3 kume yazili", P3), ("P4 dusunce kisa", P4)):
    s = cagir(o + t["metin"])
    print(f"\n{ad}: giris {s['giris']} bel, cikis {s['cikis']} bel, kesik {s['kesik']}, "
          f"etiket {oku(s['yanit'])}, gecerli eylem {oku_eylem(s['yanit'])}")
    print(f"  {s['yanit']}")
```

```
KURGU talep 4007 (sayac): sayac uzerindeki endeks ile fatura ayni degil

P1 yalniz dusunce: giris 42 bel, cikis 14 bel, kesik 0, etiket sayac, gecerli eylem None
  dusunce : metinde sayac isaretleri var | etiket : sayac

P2 eylem alani: giris 44 bel, cikis 16 bel, kesik 0, etiket sayac, gecerli eylem None
  dusunce : bu kayit sayac basligina girer , dogrudan yanit yazilabilir

P3 kume yazili: giris 60 bel, cikis 16 bel, kesik 0, etiket ariza, gecerli eylem None
  dusunce : bu kayit ariza basligina girer , dogrudan yanit yazilabilir

P4 dusunce kisa: giris 65 bel, cikis 16 bel, kesik 0, etiket sayac, gecerli eylem gecmis_getir
  dusunce : gecmis gerekli | eylem : gecmis_getir ( sayac )
```

Tek kayıtta dört istem, dört ayrı sonuç verdi. P2 ve P3 eylem alanı istedi, yanıt bunun
yerine bir gerekçe cümlesi döndürdü; üstelik P3'te etiket de kaydı. Yalnız P4 hem doğru
etiketi hem okunabilir bir eylem alanı üretti. Tek kayıt bir ölçü değildir, ama ölçünün
nereye bakacağını söylüyor: **eylem alanının varlığı ile geçerliliği ayrı iki sayıdır.**

## Geçerli Eylem Alanı Kaç Yanıtta Çıkıyor

İkinci blok dört istemi 120 kaydın tamamında koşturur ve her istemi iki tohumla ölçer.

```python
def olc(onek, tohum=TOHUM):
    SAYAC[0] = 0
    g = c = d = alanli = gecerli = kesik = 0
    for x in TALEP:
        s = cagir(onek + x["metin"], tohum=tohum)
        g, c, kesik = g + s["giris"], c + s["cikis"], kesik + s["kesik"]
        d += oku(s["yanit"]) == x["konu"]
        alanli += "eylem :" in s["yanit"]
        gecerli += oku_eylem(s["yanit"]) is not None
    n = len(TALEP)
    return {"isabet": d / n, "alanli": alanli / n, "gecerli": gecerli / n,
            "kesik": kesik / n, "giris": g, "cikis": c, "cagri": SAYAC[0],
            "gecerli_n": gecerli}


AD = ["P1 dusunce", "P2 +eylem", "P3 +kume", "P4 +kisa"]
ON = [P1, P2, P3, P4]
S1 = [olc(o) for o in ON]
S2 = [olc(o, tohum=TOHUM + 1) for o in ON]
print(f"{'olcu (tohum 20260218)':<24}" + "".join(f"{a:>12}" for a in AD))
for ad, k, b in (("etiket isabeti", "isabet", "{:.4f}"),
                 ("eylem alani tasiyan", "alanli", "{:.4f}"),
                 ("gecerli eylem alani", "gecerli", "{:.4f}"),
                 ("kesilen yanit payi", "kesik", "{:.4f}"),
                 ("giris belirteci", "giris", "{:d}"),
                 ("cikis belirteci", "cikis", "{:d}")):
    print(f"{ad:<24}" + "".join(b.format(x[k]).rjust(12) for x in S1))
print(f"{'toplam belirtec':<24}" + "".join(
    str(x["giris"] + x["cikis"]).rjust(12) for x in S1))
print(f"{'gecerli eylem basina':<24}" + "".join(
    ("-" if x["gecerli_n"] == 0 else
     f"{(x['giris'] + x['cikis']) / x['gecerli_n']:.1f}").rjust(12) for x in S1))
print(f"\n{'ikinci kosum (20260219)':<24}" + "".join(f"{a:>12}" for a in AD))
for ad, k in (("etiket isabeti", "isabet"), ("gecerli eylem alani", "gecerli")):
    print(f"{ad:<24}" + "".join(f"{x[k]:.4f}".rjust(12) for x in S2))
en_buyuk = max(abs(a["gecerli"] - b["gecerli"]) for a, b in zip(S1, S2))
print(f"\nen buyuk iki kosum farki (gecerli eylem alani): {en_buyuk:.4f}")
for i in range(3):
    f1 = S1[i + 1]["gecerli"] - S1[i]["gecerli"]
    f2 = S2[i + 1]["gecerli"] - S2[i]["gecerli"]
    o = "olculdu" if min(abs(f1), abs(f2)) > en_buyuk else "olculmedi"
    print(f"  {AD[i]} -> {AD[i + 1]}: fark {f1:+.4f} / {f2:+.4f}  {o}")
```

```
olcu (tohum 20260218)     P1 dusunce   P2 +eylem    P3 +kume    P4 +kisa
etiket isabeti                0.6750      0.5917      0.4833      0.6750
eylem alani tasiyan           0.0000      0.3167      0.8833      0.8000
gecerli eylem alani           0.0000      0.1000      0.5250      0.8000
kesilen yanit payi            0.0000      0.2167      0.3583      0.0000
giris belirteci                 5300        5540        7460        8060
cikis belirteci                 1729        2210        2584        1745
toplam belirtec                 7029        7750       10044        9805
gecerli eylem basina               -       645.8       159.4       102.1

ikinci kosum (20260219)   P1 dusunce   P2 +eylem    P3 +kume    P4 +kisa
etiket isabeti                0.8083      0.4500      0.5917      0.7333
gecerli eylem alani           0.0000      0.3250      0.3417      0.9333

en buyuk iki kosum farki (gecerli eylem alani): 0.2250
  P1 dusunce -> P2 +eylem: fark +0.1000 / +0.3250  olculmedi
  P2 +eylem -> P3 +kume: fark +0.4250 / +0.0167  olculmedi
  P3 +kume -> P4 +kisa: fark +0.2750 / +0.5917  olculdu
```

İkinci ve üçüncü satır bu dersin asıl ayrımıdır. P3'te yanıtların **0,8833 payı** bir eylem
alanı taşıyor, ama yalnız **0,5250 payı** geçerli. Aradaki **0,3583**, hemen altındaki
satırda birebir duruyor: **kesilen yanıt payı 0,3583.** Kaybın kaynağı istemin metni değil,
çıktı uzunluğu sınırıdır. Düşünce ile eylem alanı aynı yanıtın 24 belirteçlik bütçesini
paylaşıyor; düşünce uzadığında durdurma koşulu tam eylem alanının üzerine düşüyor ve geriye
`eylem : belge _ara (` gibi, biçimi doğru görünen ama argümanı kapanmamış bir kalıntı
kalıyor. Bir alanın **var görünmesi** ile **okunabilir olması** aynı şey değildir.

P4 bu kaybı kapatıyor: düşünceyi tek cümleye indiren tek bir cümle, kesilen yanıt payını
**0,3583'ten 0,0000'a**, geçerli eylem alanını **0,5250'den 0,8000'e** taşıyor. Metinde
değişen şey eylemle ilgili bile değil, düşüncenin uzunluğuyla ilgili.

## Bedel ve Ölçülemeyen Fark

Giriş belirteci **5300'den 8060'a** çıktı; eylem kümesini ve kısa tutma cümlesini her
talebin başına yazmak istemi **1,52 kata** getirdi. Çıkış belirteci P3'te **2584'e** çıkıp
P4'te **1745'e** indi: kısa düşünce hem üretilen metni hem kesilmeyi azalttı. Çağrı sayısı
dört istemde de 120'dir, bedelin tamamı belirteçtir. Asıl karşılaştırma son satırdadır:
**geçerli eylem alanı başına 645,8 belirteçten 102,1 belirtece**.

Son blok kursun ölçü kuralını uygular. Geçerli eylem alanında iki koşum arasındaki en büyük
fark **0,2250**. Eylem kümesini isteme yazmak birinci koşumda **+0,4250**, ikinci koşumda
**+0,0167** kattı; iki koşum birbirini tutmadığı için bu fark **ölçülmemiş sayılır**. Etiket
kümesini isteme yazmanın işe yaradığı biliniyordu, ama aynı hamlenin eylem kümesinde de işe
yaradığı **bu ölçümle gösterilemedi**. Düşünceyi kısaltmak ise iki koşumda da bandın
üzerinde kaldı: **+0,2750 ve +0,5917**. Etiket isabetinde hiçbir değişiklik tutarlı bir fark
üretmedi; iki koşum farkı en fazla **0,1417**, en güçlü aday olan P3'ten P4'e geçiş
**+0,1917 ve +0,1416** ile tam bandın sınırında kalıyor. **Eylem alanı istemek isabeti
oynatmadı; makinece okunabilir bir eylem alanı kazandırdı ve bedeli belirteçle ödendi.**

## Özet

- Düşünce ile eylemin aynı istemde istenmesi tek bir sayıyla ölçülemez: **eylem alanı
  taşıyan yanıt payı** ile **geçerli eylem alanı payı** ayrı sayılır.
- Eylem alanı ilk kez istendiğinde yanıtların yalnız **0,1000 payı** geçerli bir alan
  üretti; eylem kümesi yazıldığında 0,5250'ye, düşünce kısaltıldığında **0,8000'e** çıktı.
- P3'teki **0,3583**'lük varlık ile geçerlilik farkı tam olarak **kesilen yanıt payıdır**:
  iki alan aynı 24 belirteçlik çıktı bütçesini paylaşır ve sınır alanın üzerine düşer.
- Bedel: giriş belirteci **5300 → 8060**, geçerli eylem alanı başına **645,8 → 102,1
  belirteç**. Çağrı sayısı değişmedi.
- İki koşum kuralı uygulandığında eylem kümesini yazmanın farkı **ölçülemez** kaldı
  (+0,4250 ve +0,0167); yalnız düşünceyi kısaltmanın farkı ölçüldü.

## Sonraki Adım

Bu derste de, önceki dördünde de modelin attığı her ek adım **görünürdü**: düşünce alanı
yanıtın içindeydi, belirteci sayıldı ve kesildiğinde ne olduğu okundu. Adımı kısaltma kararı
ancak adım görüldüğü için verilebildi. Bir model sınıfı bu adımları yanıt metnine hiç
koymadan, çağrının içinde üretirse elde ne kalır: adımlar okunamaz, uzunlukları
kısıtlanamaz, ama **belirteçleri yine ödenir**. Sonraki ders bu sınıfı yapısal farkıyla
ölçer — aynı görevde iki sınıf, isabet ve toplam belirteç olarak yan yana — ve **görünmeyen
belirtecin** hangi görevde bir şey kazandırdığını, hangisinde farkın ölçülemez kaldığını
yazar.
