---
title: 'Düşünce Zinciri'
source: 'https://academia.sh/tr/kurslar/istem-muhendisligi/dusunce-zinciri'
course: 'İstem Mühendisliği'
language: tr
updated: '2026-08-17T18:06:39+00:00'
license: 'CC BY-SA 4.0'
---

# Düşünce Zinciri

Modelden sonucu değil sonuca giden ara adımları istemenin iki ayrı görevde ölçülmesi: çok adımlı kurgu tarife hesabında isabet 0,3000'den 0,8833'e çıkıyor ve doğru yanıt başına belirteç 243,2'den 150,1'e iniyor, tek adımlı destek talebi sınıflandırmasında ise fark üç koşumda -0,0500, -0,0417 ve +0,0750 olarak işaret değiştiriyor ve koşum bandının içinde kalıyor. İki görevde de toplam belirteç yaklaşık 1,8 kat artıyor; sınıflandırmada doğru yanıt başına bedel 59,1'den 114,1 belirtece yükseliyor.

İstem tasarımı konusu sekiz derste isteme **ne söyleneceğini** düzenledi: yönerge, rol, ölçülebilir
talep, biçim, örnek, yasak bildirimi, ve hepsinin ölçerek yinelenmesi. Hiçbirinde modelin **nasıl
düşüneceği** istenmedi. Sekizinci dersin bıraktığı istem hâlâ tek bir şey soruyor ve tek bir yanıt
bekliyor.

Düşünce zinciri bu boşluğu doldurur: modelden sonucu değil, sonuca giden **ara adımları** istemek.
Bu ders o tek cümlelik değişikliği **iki görevde** ölçer, çünkü kursun ikinci iddiası burada
kurulur: akıl yürütme teknikleri pahalıdır ve **her görevde kazandırmaz.**

- **AY1.** Kod gerçek bir uç nokta çağırmaz; standart kitaplıkla yazılmış bir dil modeli
  **benzeticisini** çağırır. Tohum **20260218**.
- **AY2.** Destek talepleri ve tarife **kurgudur**: 120 kısa Türkçe talep, 60 hesap kaydı.
- **AY3.** Kurgu tarifenin basamakları 10, 25 ve 40 m³'tür; üstüne sabit bir bedel ve abone tipine
  bağlı bir indirim gelir. Tarife açıklaması istemin içindedir ve belirteç bedeline girer.
- **AY4.** Benzeticinin iki hesap yolu vardır: **tek hamlede** kısayol kalıplarından birini seçen
  yol, ve **adım adım** her basamağı ayrı hesaplayan, adım başına 0,05 kayma payı taşıyan yol. Bu
  ayrım bir modelleme varsayımıdır.
- **AY5.** Sınıflandırmada adım adım istemek yalnız yanıtın **biçimini** değiştirir; etiket
  puanlaması aynı kalır. Ölçüt hesapta **kesin eşitlik**, sınıflandırmada **etiket isabetidir**.
- **AY6.** Adımlı yanıt uzundur; en büyük çıktı uzunluğu 24'ten **96 belirtece** çıkarılır, yoksa
  durdurma koşulu sonucu keser. Bu genişletme de bedelin parçasıdır.
- **AY7.** **Koşum bandı**: aynı istem üç tohumda koşulur ve en yüksek ile en düşük isabet
  arasındaki fark banttır. Farkı bandın içinde kalan değişiklik **ölçülmemiş sayılır**.

## Aynı İstemin İki Hâli

Üç sayı sabittir: **önceki istem**, **değiştirilmiş istem**, **bedel**. Önceki istem, istem tasarımı
konusunun bıraktığı hâldir: görev tanımlı, tarife verilmiş, biçim dayatılmış. Değiştirilmiş istem
ona tek bir cümle ekler — önce her basamağı ayrı ayrı adım adım yaz.

```python
# BENZETICI. Bu kod gercek bir model uc noktasi cagirmaz; standart kitaplikla yazilmis
# bir dil modeli benzeticisidir. Destek talepleri ve tarife de KURGU'dur.
import math

TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE, EN_UZUN, EN_UZUN_ADIM = 240, 24, 96     # baglam penceresi ve cikti sinirlari


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):                  # KURGU belirtecleyici: parca en cok bes damga
    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):                        # istemin icerigine bagli, kosumdan bagimsiz iz
    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})

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"}
TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura",
         "ekip": "kesinti", "takip": "tarife", "giril": "fatura"}   # yaniltici baglar
GEREKCE = ("birinci adim : talep metnindeki isaretler tarandi . ikinci adim : en guclu "
           "isaret {k} kavramini gosteriyor . ucuncu adim : etiket {k}")

# KURGU tarife: basamak ust siniri (m3) ve birim, sabit bedel, abone tipi indirimi
BASAMAK, SABIT = [(10, 3), (25, 5), (40, 8), (10 ** 6, 12)], 20
TIP = {"konut": 0, "tarim": 20, "resmi": 10}
HESAP = []
for i in range(60):
    r = uretec(TOHUM + 900 + i)
    m3 = 6 + int(r() * 52)
    tp = sorted(TIP)[ayrik(r(), [0.40, 0.34, 0.26])]
    HESAP.append({"no": 7001 + i, "m3": m3, "tip": tp,
                  "metin": f"tuketim {m3} m3 abone tipi {tp} tutar ne kadar"})


def kademe(m3):                     # basamaklara bolunmus tuketimin toplami
    alt, kalan, t = 0, m3, 0
    for ust, birim in BASAMAK:
        pay = min(kalan, ust - alt)
        t, kalan, alt = t + pay * birim, kalan - pay, ust
        if kalan <= 0:
            break
    return t


def kesin(m3, tip):                 # gorevin dogru cevabi, benzeticinin disinda
    return ((kademe(m3) + SABIT) * (100 - TIP[tip])) // 100


SAYAC = [0]


def _gorev(bel):                    # istemin sonundaki talepten tuketim ve abone tipi
    return (next((int(u) for u in reversed(bel) if u.isdigit()), 0),
            next((t for t in reversed(bel) if t in TIP), "konut"))


def _adim_adim(m3, tip, r, kayma=0.05):         # her basamak ayri, adim basina kayma
    alt, kalan, t, s = 0, m3, 0, []
    for i, (ust, birim) in enumerate(BASAMAK):
        pay = min(kalan, ust - alt)
        b = BASAMAK[i + 1][1] if r() < kayma and i + 1 < len(BASAMAK) else birim
        t, kalan, alt = t + pay * b, kalan - pay, ust
        s.append(f"basamak {i + 1} , {pay} m3 , birim {b} , ara toplam {t}")
        if kalan <= 0:
            break
    if r() < kayma:
        s.append(f"sabit bedel atlandi ara toplam {t}")
    else:
        t += SABIT
        s.append(f"sabit bedel {SABIT} ara toplam {t}")
    ind = 0 if r() < kayma else TIP[tip]
    t = (t * (100 - ind)) // 100
    return " . ".join(s + [f"indirim {ind} sonuc {t}"])


def _tek_hamle(m3, tip, r):                     # basamaklari atlayan kisayol kaliplari
    d, ind = next(b for u, b in BASAMAK if m3 <= u), TIP[tip]
    aday = [kesin(m3, tip), ((m3 * d + SABIT) * (100 - ind)) // 100, kademe(m3) + SABIT,
            (kademe(m3) * (100 - ind)) // 100, m3 * BASAMAK[0][1] + SABIT]
    return aday[ayrik(r(), [0.16, 0.30, 0.22, 0.20, 0.12])]


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": ""}
    if SAYAC[0] % 37 == 0:
        return {"durum": "hiz_siniri", "giris": len(bel), "cikis": 0, "yanit": ""}
    r = uretec(tohum ^ izno(istem))
    adimli = "adim" in bel                      # istem adim adim cozum istiyor mu
    if "hesap" in bel:                          # cok adimli hesap gorevi
        m3, tip = _gorev(bel)
        y = _adim_adim(m3, tip, r) if adimli else f"sonuc {_tek_hamle(m3, tip, r)}"
    else:                                       # tek adimli siniflandirma gorevi
        p = {k: 0.15 for k in KONU}             # etiket kumesi zaten istemde yazili
        for t in bel:
            for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)):
                if tablo.get(t) in p:
                    p[tablo[t]] += w
        e = [math.exp(p[a] / sicaklik) for a in sorted(p)]
        k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])]
        y = GEREKCE.format(k=k) if adimli else k
    cb = belirtecle(y)
    if len(cb) > en_uzun:                       # durdurma kosulu
        cb = cb[:en_uzun]
        y = " ".join(cb)
    return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y}


def oku(y):                                     # yanittaki ilk etiket
    return next((s for s in y.split() if s in KONU), None)


def oku_sayi(y):                                # yanittaki son sayi
    return next((int(x) for x in reversed(y.split()) if x.isdigit()), None)


TARIFE = ("Tarife: ilk 10 m3 birim 3 , sonraki 15 m3 birim 5 , sonraki 15 m3 birim 8 , "
          "40 ustu birim 12 . Sabit bedel 20 . Abone tipi indirimi yuzde konut 0 , "
          "tarim 20 , resmi 10 . Tutari hesapla . ")
H_ONCE = TARIFE + "Son satira sadece sonucu yaz . Talep: "
H_ADIM = TARIFE + "Once her basamagi ayri ayri adim adim yaz , sonra sonucu yaz . Talep: "
S_ONCE = ("Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , kesinti . "
          "Yanit olarak tek etiket yaz . Talep: ")
S_ADIM = ("Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , kesinti . "
          "Once adim adim incele , sonra yalniz etiketi yaz . Talep: ")
x = HESAP[0]
print(f"KURGU hesap kumesi {len(HESAP)} kayit, KURGU talep kumesi {len(TALEP)} kayit")
print(f"ornek {x['no']}: {x['metin']} , dogru cevap {kesin(x['m3'], x['tip'])}")
for ad, i, u in (("onceki", H_ONCE, EN_UZUN), ("adimli", H_ADIM, EN_UZUN_ADIM)):
    s = cagir(i + x["metin"], en_uzun=u)
    ik = cagir(i + x["metin"], tohum=TOHUM + 1, en_uzun=u)
    print(f"\n{ad} istem, giris {s['giris']} cikis {s['cikis']} belirtec: {s['yanit']}")
    print(f"  ayni istem tohum {TOHUM + 1}: {oku_sayi(ik['yanit'])}")
t = TALEP[2]
print(f"\nsiniflandirma ornegi {t['no']} , dogru etiket {t['konu']}:")
for ad, i, u in (("onceki", S_ONCE, EN_UZUN), ("adimli", S_ADIM, EN_UZUN_ADIM)):
    s = cagir(i + t["metin"], en_uzun=u)
    print(f"  {ad} istem , {s['giris']}+{s['cikis']} belirtec: {s['yanit']}")
```

```
KURGU hesap kumesi 60 kayit, KURGU talep kumesi 120 kayit
ornek 7001: tuketim 14 m3 abone tipi resmi tutar ne kadar , dogru cevap 63

onceki istem, giris 71 cikis 2 belirtec: sonuc 62
  ayni istem tohum 20260219: 70

adimli istem, giris 77 cikis 43 belirtec: basamak 1 , 10 m3 , birim 3 , ara toplam 30 . basamak 2 , 4 m3 , birim 5 , ara toplam 50 . sabit bedel 20 ara toplam 70 . indirim 10 sonuc 63
  ayni istem tohum 20260219: 63

siniflandirma ornegi 4003 , dogru etiket ariza:
  onceki istem , 50+1 belirtec: ariza
  adimli istem , 55+33 belirtec: birinci adim : talep metnindeki isaretler tarandi . ikinci adim : en guclu isaret ariza kavramini gosteriyor . ucuncu adim : etiket ariza
```

Tek hamlelik yanıt **62** dedi, doğru cevap **63**; ikinci tohumda **70** dedi. İkisi de yanlış ve
arada hiçbir ara adım yok. Adımlı yanıt basamakları tek tek yazdı: ilk 10 m³ birim 3'ten 30, kalan
4 m³ birim 5'ten 20, sabit bedelle 70, indirim düşülünce **63** — iki tohumda da aynı. Bedel aynı
satırda: çıkış belirteci **2'den 43'e** çıktı.

Son iki satır aynı değişikliğin öbür görevdeki karşılığıdır. Sınıflandırmada adım adım istemek
etiketi değiştirmedi, ama çıkış belirteci **1'den 33'e** çıktı. Otuz üç belirteçlik gerekçe, bir
belirteçlik yanıtın taşımadığı hiçbir bilgi taşımıyor.

## İki Görevde Aynı Değişiklik

Ölçüm bütün kümede yinelenir. Her istem üç tohumda koşulur ve çağrı sayısı iki yolda da eşittir.

```python
def olc(kume, istem, tohum, u, dogru, oku_yanit):
    SAYAC[0] = 0
    g = c = d = 0
    for x in kume:
        s = cagir(istem + x["metin"], tohum=tohum, en_uzun=u)
        g, c, d = g + s["giris"], c + s["cikis"], d + (oku_yanit(s["yanit"]) == dogru(x))
    return {"isabet": d / len(kume), "giris": g, "cikis": c, "toplam": g + c}


def yaz(baslik, kume, i1, i2, dogru, oku_yanit):
    A = [olc(kume, i1, TOHUM + j, EN_UZUN, dogru, oku_yanit) for j in range(3)]
    B = [olc(kume, i2, TOHUM + j, EN_UZUN_ADIM, dogru, oku_yanit) for j in range(3)]
    print(f"{baslik:<24} {'onceki':>9} {'adimli':>9} {'fark':>9}")
    for j in range(3):
        print(f"{'isabet tohum ' + str(TOHUM + j):<24} {A[j]['isabet']:>9.4f} "
              f"{B[j]['isabet']:>9.4f} {B[j]['isabet'] - A[j]['isabet']:>+9.4f}")
    bant = [max(x['isabet'] for x in v) - min(x['isabet'] for x in v) for v in (A, B)]
    print(f"{'uc kosumun bandi':<24} {bant[0]:>9.4f} {bant[1]:>9.4f}")
    for ad, k in (("giris belirteci", "giris"), ("cikis belirteci", "cikis"),
                  ("toplam belirtec", "toplam")):
        print(f"{ad:<24} {A[0][k]:>9d} {B[0][k]:>9d} {B[0][k] - A[0][k]:>+9d}")
    print(f"belirtec {B[0]['toplam'] / A[0]['toplam']:.2f} kat, dogru yanit basina "
          f"{A[0]['toplam'] / A[0]['isabet'] / len(kume):.1f} -> "
          f"{B[0]['toplam'] / B[0]['isabet'] / len(kume):.1f} belirtec\n")


yaz("cok adimli hesap", HESAP, H_ONCE, H_ADIM, lambda x: kesin(x["m3"], x["tip"]), oku_sayi)
yaz("tek adimli siniflandirma", TALEP, S_ONCE, S_ADIM, lambda x: x["konu"], oku)
```

```
cok adimli hesap            onceki    adimli      fark
isabet tohum 20260218       0.3000    0.8833   +0.5833
isabet tohum 20260219       0.3500    0.8833   +0.5333
isabet tohum 20260220       0.3000    0.9000   +0.6000
uc kosumun bandi            0.0500    0.0167
giris belirteci               4260      4620      +360
cikis belirteci                118      3334     +3216
toplam belirtec               4378      7954     +3576
belirtec 1.82 kat, dogru yanit basina 243.2 -> 150.1 belirtec

tek adimli siniflandirma    onceki    adimli      fark
isabet tohum 20260218       0.7750    0.7250   -0.0500
isabet tohum 20260219       0.7000    0.6583   -0.0417
isabet tohum 20260220       0.7333    0.8083   +0.0750
uc kosumun bandi            0.0750    0.1500
giris belirteci               5300      5900      +600
cikis belirteci                192      4023     +3831
toplam belirtec               5492      9923     +4431
belirtec 1.81 kat, dogru yanit basina 59.1 -> 114.1 belirtec
```

Üst tablo tekniğin çalıştığı yerdir. İsabet **0,3000'den 0,8833'e** çıkıyor ve fark üç koşumda da
aynı işaretle büyük: +0,5833, +0,5333, +0,6000. Koşum bantları **0,0500** ve **0,0167**; fark
bandın on katından fazla, yani **ölçülmüş** sayılır. Toplam belirteç **1,82 kat** artıyor, artışın
neredeyse tamamı çıkıştan geliyor; buna karşılık doğru yanıt başına bedel **243,2'den 150,1
belirtece** iniyor.

Alt tablo aynı tekniğin ödemediği görevdir. Fark **-0,0500**, **-0,0417** ve **+0,0750**; **işaret
bile sabit değil** ve üçü de 0,0750 ile 0,1500'lük bantların içinde kalıyor. Kursun kuralına göre
bu fark **ölçülmemiştir**: aynı istemin koşumları arasındaki oynama, değişikliğin kattığı oynamadan
büyük. Bedel tarafında ise belirsizlik yok: toplam belirteç **1,81 kat**, doğru yanıt başına bedel
**59,1'den 114,1 belirtece** çıkıyor.

## Kazancın Nereden Geldiği

Farkı yaratan şey görevin yapısıdır. Tarife hesabı zincirlemedir; ara adımları yazmak zinciri
parçalara ayırır ve her parçanın hatası küçük kalır. Sınıflandırma tek adımlıdır: işaretler okunur,
etiket seçilir. Yazılacak ara adım yoktur; gerekçe metni kararı üretmez, **anlatır**. Bedel ise iki
görevde de aynı ödenir, çünkü belirteç ara adımın işe yarayıp yaramadığını bilmez.

Kursun kuralı buradan okunur: **ölçülmeden değiştirilen istem bir iyileştirme değil bir
tahmindir.**

## Özet

- Düşünce zinciri, modelden sonuca giden **ara adımları** istemektir: tek cümlelik bir istem
  değişikliği, sabit model ve küme.
- Çok adımlı kurgu tarife hesabında isabet **0,3000'den 0,8833'e** çıkıyor; fark üç koşumda da aynı
  işaretle büyük ve koşum bandının (0,0500 / 0,0167) çok dışında.
- Tek adımlı sınıflandırmada fark **-0,0500**, **-0,0417** ve **+0,0750**; işareti değişiyor ve
  koşum bandının (0,0750 / 0,1500) içinde kalıyor. **Bu fark ölçülmemiş sayılır.**
- Bedel iki görevde de kesindir: toplam belirteç **1,82** ve **1,81 kat** artıyor. Doğru yanıt
  başına bedel hesapta **243,2'den 150,1'e** iniyor, sınıflandırmada **59,1'den 114,1'e** çıkıyor —
  aynı teknik bir görevde ucuzlatıyor, öbüründe pahalılaştırıyor.

## Sonraki Adım

Adım adım çözüm hesapta kazandırdı, ama tek bir koşumda **tek bir zincir** üretti. Zincirin kendisi
de belirsizdir: adımlı yolun isabeti 0,8833 ile 0,9000 arasında oynuyor ve elde tek zincir varken
hangisinin doğru olduğu bilinemez. Sonraki ders bunu bir düzeneğe çevirir: aynı istem birden çok
kez koşulur ve yanıtlar oylanır. Ölçülecek olan, örnek sayısıyla kazancın nasıl değiştiği, **çağrı
sayısının kaç katına çıktığı** ve uzlaşmanın **yanlış bir cevapta** kurulduğu durumların sayısıdır.
