Ders 09 / 22
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.
İçindekiler
İ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.
# 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.
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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.