Ders 02 / 22
Sistem Yönergesi
Kalıcı davranış tanımının her istekte yeniden gönderildiği ve bedelinin istek sayısıyla çarpıldığı ölçülüyor: 62 belirteçlik bir yönerge tek istemin 0,8378 payını, 120 istekte 7440 belirteci tutuyor. Dört uzunluk yan yana konuyor. Yönergesiz istem 0,4583 etiket isabeti ve 2985 belirteç, kısa yönerge 0,7167 ve 4751, orta yönerge 0,7500 ve 5856, uzun yönerge 0,7417 ve 9343 veriyor. Uzun yönergeyi ortaya indirmek 3487 belirteç kazandırıyor ve isabetten hiçbir şey götürmüyor; ortayı kısaya indirmek 1105 belirteç kazandırıyor ama etiketsiz yanıt payını 0,0250'den 0,2167'ye çıkarıyor.
İçindekiler
Önceki ders istemi üç bileşene ayırdı ve yönerge ile bağlamın toplam girişin 0,7059 payını tuttuğunu ölçtü. O ölçüm tek bir isteğin içinde yapıldı. Kod aynı iki metni yüz yirmi kez gönderdiğinde bedel tek satırda saklı kaldı, çünkü tekrar döngünün içindeydi ve hiçbir yerde sayılmadı.
Bu ders o tekrarı sayar. Bir sistem yönergesi, modelin her istekte aynı biçimde davranması için yazılan kalıcı davranış tanımıdır: görev nedir, hangi seçenekler vardır, yanıt hangi biçimde verilir, belirsizlikte ne yapılır. Adı kalıcıdır ama saklandığı yer istemin kendisidir; model iki çağrı arasında hiçbir şey hatırlamaz. Yönerge bu yüzden bir kez yazılır ve her istekte ödenir. Ölçülecek olan da budur: tekrarın toplamı, tekrarın payı, ve yönergeyi kısaltmanın isabetten ne kadarını geri aldığı.
- IT9. Kod bir benzeticiyi çağırır; gerçek bir model uç noktası çağrılmaz. Destek talepleri kurgudur ve önceki dersteki 120 kayıtla aynıdır.
- IT10. Sistem yönergesi ile girdi aynı istemin içindedir. Benzeticide ayrı bir yönerge alanı yoktur, çünkü ölçülen şey belirteç bedelidir ve alanın adı bedeli değiştirmez.
- IT11. Dört yönerge uzunluğu artımlı kurulur: yok, kısa (yalnız etiket kümesi), orta (etiket kümesi ve görev ile yanıt biçimi), uzun (buna belirsizlik kuralları eklenmiş hâli).
- IT12. Yönergenin bedeli uzunluk çarpı istek sayısıdır. Tabloda
tekrarsütunu bu çarpımdır ve toplam giriş belirtecinin içindedir. - IT13. Ölçüt etiket isabetidir; etiketsiz yanıt payı ayrıca basılır. Doğru etiket başına belirteç, toplam belirtecin isabete ve kayıt sayısına bölünmesiyle bulunur.
- IT14. Her satır iki tohumla koşulur (20260218 ve 20260219). İki koşum farkından küçük kalan bir isabet farkı bu kursta ölçülmüş sayılmaz.
- IT15. Hız sınırı her otuz yedinci çağrıda tetiklenir ve boş yanıt döndürür. Yüz yirmi çağrıda üç kayıt bu yüzden etiketsiz kalır; bu pay istemin değil yüzeyin payıdır.
- IT16. Belirteç maliyeti ve bütçe önceki kursun kapanış dersinde ölçüldü; burada yalnızca belirteç birimi kullanılır.
Yönerge Modelde Durmaz
İlk blok benzeticiyi ve kurguyu kurar, dört yönerge uzunluğunu artımlı olarak tanımlar ve her birinin yüz yirmi istekteki toplam bedelini yazar. Sonunda tek bir kurgu talep, kısa ve orta yönergeyle, iki ayrı tohumda çağrılır.
# BENZETICI. Bu kod gercek bir model uc noktasi cagirmaz; standart kitaplikla yazilmis # bir dil modeli benzeticisidir. Destek talepleri de KURGU'dur. import math TOHUM, M32 = 20260218, 0xFFFFFFFF PENCERE, EN_UZUN = 240, 24 # baglam penceresi ve en buyuk cikti, 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 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"} # yaniltici baglar SERBEST = ["talebiniz {k} konusuyla ilgili gorunuyor", "bu kayit {k} basligina girer , ilgili ekibe yonlendirildi", "kaydiniz alindi , konuyu inceleyip donus yapacagiz"] SAYAC = [0] 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)) if len(bel) > 90 and r() < 0.04: return {"durum": "zaman_asimi", "giris": len(bel), "cikis": 0, "yanit": ""} aday = [k for k in KAVRAM if k[:5] in bel] # istemde adi gecen kavramlar 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]) # en olasi secim else: e = [math.exp(p[a] / sicaklik) for a in sorted(p)] k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])] y = k if "tek" in bel else SERBEST[ayrik(r(), [0.42, 0.26, 0.32])].format(k=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): # yanittan etiket cikarma for s in y.lower().split(): if s in KONU: return s return None E1 = "Etiketler: fatura , ariza , sayac , tarife , kesinti ." E2 = " Talebi bu etiketlerden birine ata . Yanit olarak tek etiket yaz ." E3 = (" Birden cok etiket uyuyorsa talebin ana konusunu sec ." " Hicbiri uymuyorsa en yakin etiketi sec . Aciklama ekleme .") YONERGE = (("yok", ""), ("kisa", E1), ("orta", E1 + E2), ("uzun", E1 + E2 + E3)) def kur(s, x): # kalici yonerge + her istekte degisen girdi return (s + " " if s else "") + "Talep: " + x["metin"] print(f"{'yonerge':<8} {'belirtec':>9} {'120 istekte':>12}") for ad, s in YONERGE: b = len(belirtecle(s)) print(f"{ad:<8} {b:>9d} {b * len(TALEP):>12d}") x0 = TALEP[1] gb = len(belirtecle("Talep: " + x0["metin"])) ub = len(belirtecle(YONERGE[3][1])) print(f"uzun istem: yonerge {ub} + girdi {gb} belirtec, yonergenin payi " f"{ub / (ub + gb):.4f}") print(f"KURGU talep {x0['no']} ({x0['konu']}): {x0['metin']}") for ad, s in YONERGE[1:3]: SAYAC[0] = 0 for th in (TOHUM, TOHUM + 1): print(f"{ad} / tohum {th}: {cagir(kur(s, x0), tohum=th)['yanit']}")
yonerge belirtec 120 istekte yok 0 0 kisa 15 1800 orta 33 3960 uzun 62 7440 uzun istem: yonerge 62 + girdi 12 belirtec, yonergenin payi 0.8378 KURGU talep 4002 (fatura): fatura ayrintisini nereden gorebilirim kisa / tohum 20260218: talebiniz fatura konusuyla ilgili gorunuyor kisa / tohum 20260219: bu kayit fatura basligina girer , ilgili ekibe yonlendirildi orta / tohum 20260218: fatura orta / tohum 20260219: fatura
Son dört satır orta yönergenin ne yaptığını gösteriyor. Kısa yönergede iki koşum aynı etiketi buluyor ama iki ayrı cümleyle; orta yönergede iki koşum da tek sözcük veriyor. Etiket ikisinde de doğru. Değişen şey isabet değil, yanıtın okunabilirliğidir ve bedeli on sekiz belirteçtir.
Üstteki satırlar ise ölçülecek asıl orantıdır. Uzun yönerge 62 belirteç; sınıflandırılacak talep 12 belirteç. Tek bir istemde yönerge 0,8378 pay tutuyor. Yüz yirmi istekte aynı 62 belirteç yüz yirmi kez gönderiliyor ve toplam 7440 belirtece çıkıyor. Yönergeden bir belirteç atmak yüz yirmi istekte yüz yirmi belirteç kazandırır; bu, yönerge yazarken alınan her kararın istek sayısıyla çarpıldığı anlamına gelir.
Tekrarın Toplamı
İkinci blok dört yönergeyi aynı 120 kayıtta koşturur, sonra uzun yönergeyi üç ayrı istek sayısıyla tekrarlar ve son olarak her kısaltmanın kazandırdığı belirteci düşürdüğü isabetle yan yana koyar.
def olc(s, tohum=TOHUM, n=None): SAYAC[0] = 0 kume = TALEP if n is None else TALEP[:n] gi = ci = d = bos = 0 for x in kume: c = cagir(kur(s, x), tohum=tohum) gi, ci = gi + c["giris"], ci + c["cikis"] e = oku(c["yanit"]) bos += e is None d += e == x["konu"] m = len(kume) return {"isabet": d / m, "bos": bos / m, "giris": gi, "cikis": ci, "yonerge": len(belirtecle(s)) * m, "toplam": gi + ci} R = {ad: olc(s) for ad, s in YONERGE} print(f"{'yonerge':<8} {'tekrar':>7} {'giris':>6} {'pay':>7} {'cikis':>6} {'isabet':>7} " f"{'kosum 2':>8} {'etiketsiz':>10} {'dogru basina':>13}") for ad, s in YONERGE: v, k2 = R[ad], olc(s, tohum=TOHUM + 1)["isabet"] print(f"{ad:<8} {v['yonerge']:>7d} {v['giris']:>6d} {v['yonerge'] / v['giris']:>7.4f} " f"{v['cikis']:>6d} {v['isabet']:>7.4f} {k2:>8.4f} {v['bos']:>10.4f} " f"{v['toplam'] / v['isabet'] / len(TALEP):>13.1f}") print() print(f"{'istek':>6} {'yonerge belirteci':>18} {'toplam giris':>13} {'pay':>7}") for n in (30, 60, 120): v = olc(YONERGE[3][1], n=n) print(f"{n:>6d} {v['yonerge']:>18d} {v['giris']:>13d} {v['yonerge'] / v['giris']:>7.4f}") print() print(f"{'kisaltma':<16} {'kazanilan belirtec':>19} {'isabet farki':>13} " f"{'0,01 isabet basina':>19}") for (a1, _), (a2, _) in zip(YONERGE[1:], YONERGE[:-1]): kb = R[a1]["toplam"] - R[a2]["toplam"] fi = R[a2]["isabet"] - R[a1]["isabet"] o = f"{kb * 0.01 / abs(fi):.0f} belirtec" if fi < 0 else "kayipsiz" print(f"{a1 + ' -> ' + a2:<16} {kb:>19d} {fi:>+13.4f} {o:>19}")
yonerge tekrar giris pay cikis isabet kosum 2 etiketsiz dogru basina
yok 0 1700 0.0000 1285 0.4583 0.6333 0.2917 54.3
kisa 1800 3500 0.5143 1251 0.7167 0.4583 0.2167 55.2
orta 3960 5660 0.6996 196 0.7500 0.7500 0.0250 65.1
uzun 7440 9140 0.8140 203 0.7417 0.7583 0.0250 105.0
istek yonerge belirteci toplam giris pay
30 1860 2295 0.8105
60 3720 4547 0.8181
120 7440 9140 0.8140
kisaltma kazanilan belirtec isabet farki 0,01 isabet basina
kisa -> yok 1766 -0.2583 68 belirtec
orta -> kisa 1105 -0.0333 332 belirtec
uzun -> orta 3487 +0.0083 kayipsiz
İkinci tablo tekrarın nasıl davrandığını gösteriyor. Otuz istekte uzun yönerge 1860, altmış istekte 3720, yüz yirmi istekte 7440 belirteç ediyor: bedel istek sayısıyla doğrusal büyüyor. Yönergenin toplam giriş içindeki payı ise 0,8105 ile 0,8181 arasında sabit kalıyor. Ölçek büyüdükçe tekrarın payının seyrelmesi diye bir şey yok; istek sayısı ne olursa olsun girişin dörtte üçünden fazlası yönergedir. Bir yönerge ne kadar iyi yazılmış olursa olsun, bedeli kendi uzunluğu değil, uzunluğunun trafikle çarpımıdır.
Kısaltmanın Bedeli
Birinci tablo isabetin nerede doyduğunu söylüyor. Yönergesiz istem 0,4583 veriyor. Kısa yönerge 0,7167’ye çıkarıyor. Orta yönerge 0,7500’e çıkarıyor. Uzun yönerge ise 0,7417 veriyor, yani ortanın altında. Otuz dokuz belirteçlik ek — belirsizlik kuralları, ana konu seçimi, açıklama yasağı — 3487 belirteçlik bir toplam ekledi ve isabetten 0,0083 götürdü. Doğru etiket başına bedel 65,1’den 105,0 belirtece çıktı. Bu kursta böyle bir satır adıyla yazılır: eklenen metin bedeli kesin, kazancı belirsizdir.
Üçüncü tablo kısaltmayı ters yönden okur. Uzun yönergeden ortaya inmek 3487 belirteç kazandırıyor ve isabetten hiçbir şey götürmüyor; bu kayıpsız kısaltmadır. Ortadan kısaya inmek 1105 belirteç kazandırıyor ve 0,0333 isabet götürüyor, yani her 0,01 isabet için 332 belirteç. Kısadan yönergesize inmek 1766 belirteç kazandırıyor ve 0,2583 isabet götürüyor, yani her 0,01 isabet için 68 belirteç. Kısaltmanın karşılığı sabit değildir: yönerge kısaldıkça kalan her belirteç daha pahalı hâle gelir.
Tablonun etiketsiz sütunu kısaltmanın asıl kaybını gösteriyor. Yönergesiz istemde yanıtların
0,2917 payından, kısa yönergede 0,2167 payından hiçbir etiket okunamıyor. Orta yönergede bu pay
0,0250’ye iniyor ve orada kalıyor. Kalan üç kayıt istemin değil yüzeyin payıdır: hız sınırı
yüz yirmi çağrının üçünü boş döndürüyor. Yani orta yönerge, istemle kapatılabilecek boşluğun
tamamını kapatmış durumda. Uzun yönergenin ekleyecek bir şeyi kalmadığı için yalnız belirteç
ekliyor.
Son olarak kosum 2 sütunu okunur. Yönergesiz istem iki koşumda 0,4583 ve 0,6333, kısa yönerge
0,7167 ve 0,4583 verdi: ikinci koşumda yönergesiz istem kısa yönergeli istemi geçti. Kısa
yönergenin kazancı tek koşumda görünüyor, iki koşumda taşınmıyor. Orta yönerge ise iki koşumda da
0,7500 verdi. Uzun yönerge ise 0,7417 ve 0,7583 verdi; kendi iki koşum farkı 0,0167. Uzun ile orta
arasındaki 0,0083 fark bunun altında kalıyor ve bu kursta ölçülmemiş sayılır. Kural bir sonraki
derste adıyla işletilir.
Özet
- Sistem yönergesi kalıcı bir davranış tanımıdır ama kalıcılığı modelde değil istemdedir: her istekte yeniden gönderilir ve her istekte yeniden ödenir.
- 62 belirteçlik uzun yönerge tek istemin 0,8378 payını, 120 istekte 7440 belirteci tutuyor. Pay otuz, altmış ve yüz yirmi istekte 0,8105 ile 0,8181 arasında sabit; toplam ise doğrusal büyüyor.
- İsabet orta yönergede doyuyor: yok 0,4583, kısa 0,7167, orta 0,7500, uzun 0,7417. Uzun yönerge 3487 belirteç ekleyip 0,0083 isabet götürdü ve doğru etiket başına bedeli 65,1’den 105,0’a çıkardı.
- Kısaltmanın karşılığı sabit değil: uzundan ortaya inmek kayıpsız, ortadan kısaya inmek 0,01 isabet başına 332 belirteç, kısadan yönergesize inmek 68 belirteç kazandırıyor.
- Yönergenin kapattığı asıl boşluk etiketsiz yanıt payıdır: 0,2917’den 0,0250’ye iniyor ve orada duruyor. Kalan pay hız sınırından gelir, yani istemle kapatılamaz.
Sonraki Adım
Orta ile uzun yönerge arasındaki fark, uzunun kendi koşum farkının altında kaldı: eklenen otuz dokuz belirteç ölçülebilir bir şey üretmedi. Bu, yönergeye ne ekleneceği sorusunu kapatmıyor. Sık verilen bir cevap, modele kim olduğunu söylemektir: bir uzmanlık, bir görev unvanı, bir üslup. Bu ekin isabeti yükselttiği yaygın bir kabuldür ve tıpkı belirsizlik kuralları gibi her istekte ödenir. Sonraki ders bunu ölçer: rol belirtmenin kattığı fark nedir, bedeli kaç belirteçtir, ve o fark aynı istemin iki koşumu arasındaki farktan büyük müdür.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.