Ders 11 / 22
Düşünce Ağacı
Çözümün ortasından dallanmanın ölçülmesi: aynı 48 kurgu destek talebinde otuz iki arıza kodunu tek istemde soran düzen 0,4792 isabet ve 48 çağrı veriyor, çözümü adımlara bölüp her adımda birkaç uzatma isteyen düşünce ağacı dal 1'de 0,0833'e düşüyor, dal 3'te 0,6250'ye çıkıyor ve dal 4'te duruyor. Dallanma 3'ten 4'e çıkarken isabet 0,0208 geriliyor ama çağrı sayısı 795'ten 1086'ya, belirteç 43182'den 59835'e yükseliyor; bu fark aynı düzenin iki koşumu arasındaki 0,0417 farktan küçük olduğu için ölçülmemiş sayılıyor.
İçindekiler
Bir önceki ders aynı istemi birden çok kez koşturup yanıtları oyladı. Öz tutarlılık işe yaradı: tek yanıtın yakaladığı sayı, dokuz örneğin uzlaşmasıyla yukarı çıktı. Ama üretilen çözümlerin ortak bir yanı vardı. Her biri baştan sona birbirinden bağımsız üretildi; hiçbiri ötekinin neresinde yanıldığını görmedi. Bir çözümün ilk adımı sabit tutulup ikinci adımı birkaç ayrı yönde denenmedi, kötü giden bir yol yarıda bırakılmadı.
Bu ders o boşluğu doldurur. Değiştirilen şey yine metindir, ama bu kez tek bir istem değil istemlerin düzenidir: uzun tek bir istem yerine, her biri çözümü bir adım ilerleten kısa istemler ve tutulacak dalları seçen bir kural. Ölçülecek olan bunun ne kazandırdığı ve kaç çağrıya mal olduğudur.
- AY21. Görev kurgudur: kısa Türkçe destek taleplerine üç bileşenli bir arıza kodu atanır — alan, belirti ve derece. Dört alan, alan başına dört belirti, iki derece; toplam otuz iki kod.
- AY22. Çağrılan şey bir benzeticidir; gerçek bir model uç noktasına hiçbir istek gitmez. Benzetici bu müfredatın giriş kursunda kurulan biçimini sürdürür, tek farkla: seçenek kümesi dışarıdan verilir ve her seçenek bir yoldur, puanı bileşenlerinin izlerinden toplanır.
- AY23. Tohum 20260218; aynı istem aynı tohumda aynı yanıtı verir. Belirsizlik tohum değiştirilerek ölçülür ve her düzenin ikinci koşumu 20260219 ile alınır.
- AY24. Talep metninde alan izi zayıf, belirti izi güçlüdür; ayrıca her talepte yanıltıcı bir alan adı geçer ve izi doğru alanınkinden ağırdır. Kurgu bu yapı ağacın ölçüleceği yeri açar: ilk adım en zayıf kanıtla atılır.
- AY25. Ağaç iki tür çağrı yapar. Uzatma çağrısı bir yolu bir adım uzatır ve dal sayısı kadar tekrarlanır; seçim çağrısı biriken adaylardan tutulacakları ayıklar. İkisi de sayılır.
- AY26. Dallanma çarpanı ile tutulan dal sayısı eşit tutulur. Ölçek küçüktür: dal en çok dört, derinlik en çok üç. Ölçüt üç bileşenin birden doğru olmasıdır.
- AY27. Bedel üç birimle yazılır: çağrı sayısı, belirteç ve başarısız çağrı. Hız sınırı çağrı sayısına bağlı olduğu için dallanma başarısızlığı da çoğaltır.
Yolun Ortasından Dallanmak
Önceki istem tektir ve her şeyi bir kerede ister: otuz iki kodun tamamı isteme yazılır, talep eklenir, tek yanıt beklenir. Değiştirilmiş düzen aynı işi üç adıma böler — önce alan, sonra o alanın belirtisi, sonra derece — ve her adımda birkaç ayrı uzatma ister; biriken adaylardan bir bölümü tutulur, kalanı atılır. İlk blok benzeticiyi, kurgu kod ağacını ve bir talebin ilk iki düzeyini kurar.
# BENZETICI. Bu kod gercek bir model uc noktasi cagirmaz; standart kitaplikla yazilmis # bir dil modeli benzeticisidir. Destek talepleri ve ariza kodlari da KURGU'dur. import math TOHUM, M32 = 20260218, 0xFFFFFFFF PENCERE = 240 # baglam penceresi, belirtec 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 ALAN = ["dagitim", "sayac", "abonelik", "saha"] BELIRTI = {"dagitim": ["kesinti", "basinc", "sizinti", "tikanma"], "sayac": ["endeks", "bozukluk", "degisim", "okuma"], "abonelik": ["tarife", "fatura", "odeme", "kayit"], "saha": ["randevu", "erisim", "malzeme", "gecikme"]} DERECE = ["birinci", "ikinci"] A_SOZ = {"dagitim": "sebeke", "sayac": "olcum", "abonelik": "sozlesme", "saha": "ekip"} T_SOZ = {"dagitim": "hatti", "sayac": "cihaz", "abonelik": "hesap", "saha": "servis"} B_SOZ = {"kesinti": "akmiyor", "basinc": "zayif", "sizinti": "islak", "tikanma": "dolmus", "endeks": "rakam", "bozukluk": "calismiyor", "degisim": "yenisi", "okuma": "girilmemis", "tarife": "basamak", "fatura": "tutar", "odeme": "borcum", "kayit": "musteri", "randevu": "saatte", "erisim": "kapali", "malzeme": "parca", "gecikme": "bekliyor"} D_SOZ = {"birinci": "acil", "ikinci": "normal"} A_IZ = {A_SOZ[a][:5]: a for a in ALAN} # alan izi, zayif T_IZ = {T_SOZ[a][:5]: a for a in ALAN} # yaniltici alan izi, daha agir B_IZ = {B_SOZ[b][:5]: b for a in ALAN for b in BELIRTI[a]} D_IZ = {D_SOZ[d][:5]: d for d in DERECE} TALEP = [] for i in range(48): r = uretec(TOHUM + i) a = ALAN[int(r() * 4)] b = BELIRTI[a][int(r() * 4)] d = DERECE[int(r() * 2)] y = ALAN[(ALAN.index(a) + 1 + int(r() * 3)) % 4] # talepte gecen yaniltici alan if r() < 0.5: m = (f"{T_SOZ[y]} icin kayit acilmisti ama sorun {A_SOZ[a]} tarafinda , " f"{B_SOZ[b]} durumu var , {D_SOZ[d]} bakilmasi gerekiyor") else: m = (f"{T_SOZ[y]} uzerinden bildirdim , {A_SOZ[a]} ile ilgili " f"{B_SOZ[b]} diye yaziyor , {D_SOZ[d]} olarak degerlendirin") TALEP.append({"no": 5001 + i, "metin": m, "kod": (a, b, d)}) TUM = [(a, b, d) for a in ALAN for b in BELIRTI[a] for d in DERECE] SAYAC = [0, 0, 0] # cagri sayisi, belirtec, basarisiz cagri def yaz(y): return " ".join(y) def uzat(p, k): # yolu k bilesen uzatan butun secenekler y = [p] for _ in range(k): z = [] for q in y: z += [q + (s,) for s in (ALAN if not q else BELIRTI[q[0]] if len(q) == 1 else DERECE)] y = z return y def cagir(istem, secenek, tohum=TOHUM, sicaklik=0.6): SAYAC[0] += 1 bel = belirtecle(istem) SAYAC[1] += len(bel) if len(bel) > PENCERE or SAYAC[0] % 37 == 0: SAYAC[2] += 1 return {"giris": len(bel), "yanit": None} r = uretec(tohum ^ izno(istem)) p = {k: 0.15 for k in secenek} for t in bel: for tablo, w in ((A_IZ, 1.0), (T_IZ, 1.3), (B_IZ, 1.6), (D_IZ, 0.9)): h = tablo.get(t) if h is not None: for k in p: if h in k: # secenek bir yoldur; puan bilesenlerden toplanir p[k] += w d = sorted(p, key=yaz) if sicaklik <= 0.0: k = max(d, key=lambda a: p[a]) else: e = [math.exp(p[a] / sicaklik) for a in d] k = d[ayrik(r(), [v / sum(e) for v in e])] SAYAC[1] += len(belirtecle(yaz(k))) return {"giris": len(bel), "yanit": k} def istemle(basmak, secenek, metin): return (basmak + " secenekler : " + " , ".join(yaz(k) for k in secenek) + " . Talep : " + metin) x = TALEP[2] print(f"KURGU: {len(TALEP)} talep, {len(TUM)} ariza kodu (4 alan x 4 belirti x 2 derece)") print(f"talep {x['no']}: {x['metin']}") print(f"dogru kod: {yaz(x['kod'])}") s = cagir(istemle("Talebe bir ariza kodu ata .", TUM, x["metin"]), TUM) print(f"tek cagri: giris {s['giris']} belirtec, yanit '{yaz(s['yanit'])}'") ilk, aday = uzat((), 1), [] print("\nilk duzeyde uc ayri uzatma cagrisi:") for j in range(3): u = cagir(istemle("Cozum yolunu bir adim uzat .", ilk, x["metin"]), ilk, TOHUM + j) print(f" aday {j + 1}: {yaz(u['yanit'])} (giris {u['giris']} belirtec)") if u["yanit"] not in aday: aday.append(u["yanit"]) print("ikinci duzeyde her dalin uzantisi:") for p in aday: se = uzat(p, 1) u = cagir(istemle("Cozum yolunu bir adim uzat .", se, x["metin"]), se) print(f" {yaz(p)} -> {yaz(u['yanit'])}")
KURGU: 48 talep, 32 ariza kodu (4 alan x 4 belirti x 2 derece) talep 5003: hesap uzerinden bildirdim , olcum ile ilgili rakam diye yaziyor , acil olarak degerlendirin dogru kod: sayac endeks birinci tek cagri: giris 235 belirtec, yanit 'sayac endeks birinci' ilk duzeyde uc ayri uzatma cagrisi: aday 1: abonelik (giris 43 belirtec) aday 2: abonelik (giris 43 belirtec) aday 3: sayac (giris 43 belirtec) ikinci duzeyde her dalin uzantisi: abonelik -> abonelik kayit sayac -> sayac endeks
İki sayı hemen görünüyor. Otuz iki kodu isteme yazmak istemi 235 belirtece çıkarıyor; bağlam penceresi 240, yani tek istemli düzen sınırın beş belirteç altında duruyor. Ağacın istemi yalnız o düzeyin seçeneklerini taşıdığı için 43 belirteç. Bölmenin ilk kazancı budur.
Alt dört satır dallanmanın niçin gerekli olduğunu gösteriyor. Talepte geçen “hesap” yanıltıcı
alanın izidir ve doğru alanın izi olan “olcum” sözcüğünden ağırdır; bu yüzden ilk iki uzatma
çağrısı abonelik diyor, doğru alan sayac ancak üçüncüde çıkıyor. Tek dallı bir arama burada
biterdi ve ikinci düzeyde abonelik kayit üretip talepte karşılığı olmayan bir yolda
derinleşirdi. Doğru dal tutulduğunda ikinci düzey sayac endeks veriyor, çünkü belirti izi
güçlüdür. Ağacın vaat ettiği şey budur: zayıf kanıtla atılmış yanlış bir ilk adım, tek adım
olmadığı sürece geri alınabilir.
Dal, Derinlik ve Çağrı Sayısı
İkinci blok ağacı kurar ve altı düzeni yan yana koyar: dallanma bire, ikiye, üçe ve dörde çıkarılır, sonra dal üçte tutulup derinlik bire ve ikiye indirilir. Tek çağrı ile bir önceki dersin beş örnekli öz tutarlılığı da tabloya girer; her satırın ikinci koşumu tohum değiştirilerek alınır.
BOLUM = {1: (3,), 2: (2, 1), 3: (1, 1, 1)} # yol kac adima bolunuyor def agac(x, dal, tut, derinlik, tohum): yol = [()] for k in BOLUM[derinlik]: aday = [] for p in yol: # uretim: her dali dal kez uzat se = uzat(p, k) for j in range(min(dal, len(se))): s = cagir(istemle("Cozum yolunu bir adim uzat .", se, x), se, tohum + j) if s["yanit"] is not None and s["yanit"] not in aday: aday.append(s["yanit"]) if not aday: aday = uzat(yol[0], k)[:1] if len(aday) <= tut: yol = aday # secilecek bir sey yok, cagri harcanmaz else: yol = [] for j in range(tut): # secim: tutulacak dallari ayikla s = cagir(istemle("En umut verici yollari sec .", aday, x), aday, tohum + j) if s["yanit"] is not None and s["yanit"] not in yol: yol.append(s["yanit"]) yol = yol or aday[:tut] s = cagir(istemle("Kalan yollardan birini kod olarak yaz .", yol, x), yol, tohum) return s["yanit"] or yol[0] def tekli(x, k, tohum): # k = 1 tek cagri, k > 1 oz tutarlilik sayim = {} for j in range(k): s = cagir(istemle("Talebe bir ariza kodu ata .", TUM, x), TUM, tohum + j) if s["yanit"] is not None: sayim[s["yanit"]] = sayim.get(s["yanit"], 0) + 1 return max(sorted(sayim, key=yaz), key=lambda a: sayim[a]) if sayim else None def olc(f, tohum): SAYAC[:] = [0, 0, 0] d = 0 for x in TALEP: d += f(x["metin"], tohum) == x["kod"] return {"isabet": d / len(TALEP), "cagri": SAYAC[0], "bel": SAYAC[1], "hata": SAYAC[2]} SIRA = [("tek cagri", lambda x, t: tekli(x, 1, t)), ("oz tutarlilik 5 ornek", lambda x, t: tekli(x, 5, t)), ("agac dal 1 derinlik 3", lambda x, t: agac(x, 1, 1, 3, t)), ("agac dal 2 derinlik 3", lambda x, t: agac(x, 2, 2, 3, t)), ("agac dal 3 derinlik 3", lambda x, t: agac(x, 3, 3, 3, t)), ("agac dal 4 derinlik 3", lambda x, t: agac(x, 4, 4, 3, t)), ("agac dal 3 derinlik 1", lambda x, t: agac(x, 3, 3, 1, t)), ("agac dal 3 derinlik 2", lambda x, t: agac(x, 3, 3, 2, t))] print(f"{'istem duzeni':<22}{'isabet':>8}{'kosum2':>8}{'fark':>8}{'cagri':>7}" f"{'belirtec':>10}{'basarisiz':>10}") for ad, f in SIRA: A, B = olc(f, TOHUM), olc(f, TOHUM + 1) print(f"{ad:<22}{A['isabet']:>8.4f}{B['isabet']:>8.4f}" f"{B['isabet'] - A['isabet']:>+8.4f}{A['cagri']:>7d}{A['bel']:>10d}" f"{A['hata']:>10d}")
istem duzeni isabet kosum2 fark cagri belirtec basarisiz tek cagri 0.4792 0.5208 +0.0417 48 11617 1 oz tutarlilik 5 ornek 0.7292 0.7708 +0.0417 240 58074 6 agac dal 1 derinlik 3 0.0833 0.2708 +0.1875 192 9776 5 agac dal 2 derinlik 3 0.4167 0.5417 +0.1250 506 26651 13 agac dal 3 derinlik 3 0.6250 0.5833 -0.0417 795 43182 21 agac dal 4 derinlik 3 0.6042 0.5833 -0.0208 1086 59835 29 agac dal 3 derinlik 1 0.6250 0.6250 +0.0000 192 37617 5 agac dal 3 derinlik 2 0.7292 0.7500 +0.0208 421 30650 11
Üçüncü satır bu dersin en sert sayısıdır. Çözümü üç adıma bölmek ama hiç dallanmamak isabeti 0,4792’den 0,0833’e düşürüyor ve bunu dört kat çağrıyla yapıyor. Sebep birinci blokta görüldü: dallanmayan bir arama ilk adımı en zayıf kanıtla atar ve bir daha dönemez. Tek istemli düzende üç bileşen aynı puanda birlikte değerlendirildiği için güçlü belirti izi zayıf alan izini taşıyabiliyordu; bölme bu taşımayı kesti. Adıma bölmek tek başına bir iyileştirme değildir; bedeli kesin, kazancı eksidir.
Dallanma bunu geri alıyor. Dal ikide 0,4167, dal üçte 0,6250. Kazancın nerede durduğu dördüncü adımda görünür: dal dörde çıkarıldığında isabet 0,0208 geriliyor, buna karşılık çağrı sayısı 795’ten 1086’ya, belirteç 43182’den 59835’e, başarısız çağrı 21’den 29’a çıkıyor. Aynı düzenin iki koşumu arasındaki fark dal üçte 0,0417’dir. Dal üçten dörde geçişin kattığı fark bu sayıdan küçük olduğu için ölçülmemiş sayılır: iki yüz doksan bir çağrı ve on altı binden fazla belirteç, gösterilemeyen bir değişiklik için harcandı.
Son iki satır derinlik eksenidir ve tersine bir sonuç verir. Aynı dal sayısıyla derinlik üçten ikiye indirildiğinde isabet 0,6250’den 0,7292’ye çıkıyor ve çağrı 795’ten 421’e iniyor: alanla belirti birlikte seçildiğinde güçlü belirti izi zayıf alan izini yeniden taşıyabiliyor. Derinlik bire indiğinde isabet 0,6250’de kalıyor ve çağrı 192’ye düşüyor, ama istemler otuz iki seçeneği birden taşıdığı için belirteç 30650’den 37617’ye çıkıyor. Çağrı sıralaması ile belirteç sıralaması aynı değildir.
Tablonun ikinci satırı dersi kapatır. Bir önceki dersin beş örnekli öz tutarlılığı 0,7292 veriyor — en iyi ağaç düzeniyle aynı sayı — ve bunu 421 yerine 240 çağrıyla yapıyor. Belirteçte durum tersine dönüyor: 58074’e karşı 30650. İki teknik arasındaki seçim bir üstünlük sıralaması değil bir birim seçimidir; ağacın bu görevde kattığı ölçülebilir tek şey, aynı isabete daha az belirteçle ulaşmasıdır. Ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir, ve bu tabloda değiştirilen istemlerin yarısı bir iyileştirme değildi.
Özet
- Düşünce ağacı tek bir istem değil bir istem düzenidir: çözüm adımlara bölünür, her adımda birden çok uzatma istenir, adayların bir bölümü tutulur. Uzatma ve seçim çağrıları birlikte sayılır.
- Adıma bölmek dallanmadan yapıldığında zarar verir: isabet 0,4792’den 0,0833’e düşüyor, çağrı 48’den 192’ye çıkıyor. Yanlış atılan ilk adım tek adımsa geri alınamıyor.
- Dallanma kazandırıyor ama doyuyor: dal 1’den 3’e isabet 0,0833’ten 0,6250’ye çıkıyor, dal 4’te 0,0208 geriliyor. Çağrı 192’den 1086’ya, belirteç 9776’dan 59835’e yükseliyor.
- Dal üçten dörde geçişin farkı, aynı düzenin iki koşumu arasındaki 0,0417 farktan küçüktür; ölçülmemiş sayılır ve kazanç olarak yazılamaz.
- Derinlik ters yönde çalışıyor: 3 yerine 2 kullanmak isabeti 0,7292’ye çıkarıp çağrıyı 421’e indiriyor. Öz tutarlılık aynı isabeti 240 çağrı ve 58074 belirteçle veriyor; ağacın 30650 belirteci ucuz, 421 çağrısı pahalıdır.
Sonraki Adım
Bu üç teknik de aynı yönde çalıştı: modelden daha çok adım istendi. Düşünce zinciri adımları tek yanıtın içine yazdırdı, öz tutarlılık aynı adımları birden çok kez ürettirip oyladı, düşünce ağacı adımların arasına bir seçim kuralı koydu. Üçünde de adımlar aynı düzeydedir: hepsi çözümün ayrıntısına doğru ilerler. Yanlış giden şey ise bu derste ayrıntının kendisiydi; yanıltıcı bir sözcük ilk adımı bozdu ve sonraki bütün adımlar o bozuk adımın üzerine kuruldu.
Ayrıntıya inmeden önce yukarı çıkmak hiç denenmedi. Bir talebe kod atamadan önce o talebin hangi genel kurala girdiğini sormak elde bulunan bir seçenekti. Sonraki ders bunu ölçer: istem iki aşamaya bölünür, önce ilke sorulur sonra çözüm istenir, ve iki aşamalının tek aşamalıya göre isabeti ne kadar oynattığı ile kaç belirteç eklediği yan yana basılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.