Ders 07 / 22
Kısıt ve Yasak Bildirimi
Aynı kural iki ayrı biçimde yazılıp 120 kurgu destek talebinde ölçülüyor. Hiçbir bildirim yokken ihlal oranı 0,2583; yasak bildirimi eklendiğinde 0,5333'e çıkıyor ve yasaklanan sözcüklerden birinin geçtiği yanıt sayısı 5'ten 35'e yükseliyor. Aynı kuralı olumlu bildiren istem ihlali 0,0167'ye indiriyor ve etiket isabetini 0,6667'den 0,8333'e çıkarıyor. İkisi birlikte yazıldığında ihlal 0,1583 oluyor: yasağı olumlu bildirime eklemek sayıyı yaklaşık on kat kötüleştiriyor. Bedel yan yana yazılıyor; olumlu bildirim önlenen ihlal başına 115,9 giriş belirteci tutuyor.
İçindekiler
Önceki iki derste isteme yazılan her şey olumluydu: şunu yap, şu biçimde yaz, şu örneklere bak. Uygulamada yazılan istemlerin büyük bölümü bunun tersini de içerir. Bir etiketi kullanma, tarih verme, kesin konuşma, uydurma. Bu cümlelere yasak bildirimi denir ve sezgi onların en kötü ihtimalle etkisiz kalacağını söyler: model uyarsa iyi, uymazsa hiçbir şey değişmez.
Bu ders o sezginin sayısını alır. Aynı kural iki ayrı biçimde yazılır — bir kez neyin yapılmayacağı, bir kez neyin yapılacağı olarak — ve ikisinin ürettiği ihlal sayısı yan yana konur. Ortaya çıkan sonuç bu kursun ikinci iddiasının ilk örneğidir: bir istem eklentisi sayıyı düşürmek yerine yükseltebilir, ve bunu ölçmeden anlamanın yolu yoktur.
- IT54. Model bir benzeticidir, tohumu 20260218’dir ve gerçek bir uç nokta çağrılmaz. Destek talepleri, yanıt kalıpları ve kural kümesi kurgudur.
- IT55. Görev kısa yanıt yazmadır: model talebi bir etikete atar ve tek cümlelik bir yanıt üretir. Yanıt altı kurgu kalıptan biriyle kurulur.
- IT56. Kural kümesi üç sözcüktür: yanıtta
hemen,yarinvegenelgeçmemelidir. Bunlar kurgu bir yazım kılavuzunun karşılığıdır — söz verme, tarih verme, belirsiz etiket koyma. - IT57. İhlal ölçüsü açıktır: yanıtta bu üç sözcükten biri geçiyorsa kayıt ihlallidir. Her sözcüğün kaç yanıtta geçtiği ayrıca sayılır.
- IT58. Benzetici yanıt kalıbını istemde geçen belirteçlere göre seçer. Her kalıbın kendi ayırt edici belirteçleri vardır ve bu belirteçler istemde geçtiğinde o kalıbın puanı yükselir. Model belirtecin olumlu mu olumsuz mu anıldığını ayırt etmez.
- IT59. Dört istem karşılaştırılır: bildirimsiz, yasak bildirimli, olumlu bildirimli ve ikisi birlikte. Görev tanımı, etiket kümesi ve talep kümesi dördünde de aynıdır.
- IT60. Bedel giriş belirteciyle yazılır ve ayrıca önlenen ihlal başına birim maliyet hesaplanır.
Aynı Kuralın İki Yazımı
# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz; standart kitaplikla # yazilmis bir dil modeli benzeticisidir. Talepler ve yanit kaliplari da kurgudur. 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): # 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): 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"} SAYAC = [0] # KURGU kural kumesi: yanitta gecmemesi gereken uc sozcuk. YASAKLI = ["hemen", "yarin", "genel"] # Her yanit kalibi bir taban agirlik ve kendi ayirt edici belirtecleriyle gelir. YANIT = [("kaydiniz {k} konusunda acildi , inceleme suruyor", 1.2, ["incel", "acild"]), ("{k} talebiniz ilgili ekibe yonlendirildi", 1.1, ["ilgil", "ekibe"]), ("bu {k} kaydi hemen ele alinacak", 0.5, ["hemen"]), ("{k} kaydiniz yarin sonuclandirilacak", 0.4, ["yarin"]), ("talebiniz genel bir basvuru olarak alindi", 0.3, ["genel", "basvu"]), ("{k} kaydiniz durumu inceleniyor", 1.0, ["durum", "incel"])] def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN): SAYAC[0] += 1 bel = belirtecle(istem) bos = {"giris": len(bel), "cikis": 0, "yanit": "", "kalip": -1} if len(bel) > PENCERE: return dict(bos, durum="baglam_asimi") if SAYAC[0] % 37 == 0: return dict(bos, durum="hiz_siniri") r = uretec(tohum ^ izno(istem)) 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 e = [math.exp(p[a] / sicaklik) for a in sorted(p)] k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])] # Kalip puani: taban agirlik + kalibin belirteclerinin istemde gecme sayisi. puan = [t + 0.85 * sum(a in bel for a in an) for _, t, an in YANIT] q = [math.exp(x / sicaklik) for x in puan] i = ayrik(r(), [x / sum(q) for x in q]) y = YANIT[i][0].format(k=k) cb = belirtecle(y) if len(cb) > en_uzun: cb, y = cb[:en_uzun], " ".join(cb[:en_uzun]) return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y, "kalip": i} def oku(y): for s in y.lower().split(): if s in KONU: return s return None GOREV = ("Talebi su etiketlerden birine ata ve kisa bir yanit yaz : fatura , ariza , " "sayac , tarife , kesinti . Talep : ") YASAK = "Yanitinda su sozcukleri kullanma : hemen , yarin , genel . " OLUMLU = ("Yanitinda yalnizca sunlar olsun : kaydin acildigi , ilgili ekibe " "yonlendirildigi ve durumun inceleniyor olmasi . ") DURUM = (("bildirimsiz", ""), ("yasak bildirimi", YASAK), ("olumlu bildirim", OLUMLU), ("yasak + olumlu", YASAK + OLUMLU)) def olc(onek, tohum=TOHUM): SAYAC[0] = 0 d = {"ihlal": 0, "etiketli": 0, "isabet": 0, "giris": 0, "cikis": 0} sayim, kalip = {w: 0 for w in YASAKLI}, [0] * len(YANIT) for x in TALEP: s = cagir(onek + GOREV + x["metin"], tohum=tohum) d["giris"], d["cikis"] = d["giris"] + s["giris"], d["cikis"] + s["cikis"] if s["kalip"] >= 0: kalip[s["kalip"]] += 1 gecen = [w for w in YASAKLI if w in s["yanit"].split()] for w in gecen: sayim[w] += 1 d["ihlal"] += bool(gecen) d["etiketli"] += oku(s["yanit"]) is not None d["isabet"] += oku(s["yanit"]) == x["konu"] for a in ("ihlal", "etiketli", "isabet"): d[a] /= len(TALEP) return dict(d, sayim=sayim, kalip=kalip, cagri=SAYAC[0]) print(f"KURGU: {len(TALEP)} destek talebi , yasakli sozcukler {YASAKLI}") print(f"\n{'istem':<17}{'ihlal':>8}{'etiketli':>10}{'isabet':>9}{'giris':>8}" f"{'hemen':>7}{'yarin':>7}{'genel':>7}") O = {} for ad, onek in DURUM: d = O[ad] = olc(onek) print(f"{ad:<17}{d['ihlal']:>8.4f}{d['etiketli']:>10.4f}{d['isabet']:>9.4f}" f"{d['giris']:>8}" + "".join(f"{d['sayim'][w]:>7}" for w in YASAKLI))
KURGU: 120 destek talebi , yasakli sozcukler ['hemen', 'yarin', 'genel'] istem ihlal etiketli isabet giris hemen yarin genel bildirimsiz 0.2583 0.9000 0.6667 5060 5 17 9 yasak bildirimi 0.5333 0.8583 0.5750 6740 35 16 13 olumlu bildirim 0.0167 0.9667 0.8333 8420 1 0 1 yasak + olumlu 0.1583 0.9417 0.6500 10100 12 3 4
Birinci satır taban çizgisidir: hiçbir bildirim yokken yanıtların 0,2583 payı yasaklanan
sözcüklerden birini taşıyor. İkinci satır bu dersin sayısıdır. Yasak bildirimi eklendiğinde ihlal
oranı 0,5333 oluyor, yani iki katından fazla. Yasağı yazmak, yasaklanan şeyi
yasaklamıyor; iki misline çıkarıyor. Sağdaki üç sütun artışın nerede toplandığını gösteriyor:
hemen sözcüğünü taşıyan yanıt sayısı 5’ten 35’e çıkıyor, genel 9’dan 13’e çıkıyor,
yarin 17’de kalıyor. Artış eşit dağılmıyor, ama hiçbir sözcükte düşüş yok.
Üçüncü satır aynı kuralın olumlu yazımıdır. İstem hangi sözcüklerin yasak olduğunu hiç anmaz; bunun yerine yanıtta neyin bulunacağını söyler. İhlal oranı 0,0167 oluyor, taban çizgisinin on beşte biri. Yan etki de olumlu yöndedir: etiketi okunabilen yanıt oranı 0,9000’dan 0,9667‘ye, etiket isabeti 0,6667’den 0,8333’e çıkıyor. Aynı kural, aynı model, aynı görev ve aynı küme; değişen tek şey kuralın cümlesi.
Dördüncü satır uygulamada en sık görülen yazımdır: önce ne isteniyorsa söylenir, sonra “şunları da yapma” diye eklenir. İhlal oranı 0,1583 oluyor — olumlu bildirimin tek başına verdiği 0,0167’nin yaklaşık on katı. Yasak cümlesi olumlu bir istemin yanına eklendiğinde de kendi zararını taşıyor. Etiket isabeti de 0,8333’ten 0,6500’e geri düşüyor.
Yasağın Niçin Ters Çalıştığı
print("kalip bildirimsiz yasak olumlu ikisi") for i, (metin, _, an) in enumerate(YANIT): isim = ("yasakli: " + [w for w in YASAKLI if w in metin][0]) if any( w in metin for w in YASAKLI) else "uygun: " + an[0] print(f"{isim:<30}" + "".join(f"{O[ad]['kalip'][i]:>7}" for ad, _ in DURUM)) print("\nartisin kosumdan bagimsizligi") for th in (TOHUM, TOHUM + 1, TOHUM + 2): v = [olc(onek, tohum=th)["ihlal"] for _, onek in DURUM] print(f" tohum {th}: " + " ".join(f"{x:.4f}" for x in v)) i0 = [olc(onek)["ihlal"] for _, onek in DURUM] i1 = [olc(onek, tohum=TOHUM + 1)["ihlal"] for _, onek in DURUM] print(" iki kosum farki: " + " ".join(f"{abs(a - b):.4f}" for a, b in zip(i0, i1))) n = len(TALEP) taban = O["bildirimsiz"] print("\nbedel") for ad, _ in DURUM[1:]: d, fark = O[ad], round((O[ad]["ihlal"] - taban["ihlal"]) * n) ek = d["giris"] - taban["giris"] birim = f"{ek / abs(fark):.1f}" if fark else "-" print(f" {ad:<16} ihlal {round(taban['ihlal'] * n):>3} -> {round(d['ihlal'] * n):>3}" f" ({fark:+d}) , giris belirteci {ek:+d} , ihlal basina {birim}")
kalip bildirimsiz yasak olumlu ikisi uygun: incel 39 18 19 52 uygun: ilgil 26 16 77 23 yasakli: hemen 5 35 1 12 yasakli: yarin 17 16 0 3 yasakli: genel 9 13 1 4 uygun: durum 21 19 19 23 artisin kosumdan bagimsizligi tohum 20260218: 0.2583 0.5333 0.0167 0.1583 tohum 20260219: 0.2750 0.4167 0.0000 0.1167 tohum 20260220: 0.3833 0.4917 0.0083 0.1167 iki kosum farki: 0.0167 0.1167 0.0167 0.0417 bedel yasak bildirimi ihlal 31 -> 64 (+33) , giris belirteci +1680 , ihlal basina 50.9 olumlu bildirim ihlal 31 -> 2 (-29) , giris belirteci +3360 , ihlal basina 115.9 yasak + olumlu ihlal 31 -> 19 (-12) , giris belirteci +5040 , ihlal basina 420.0
Üstteki çizelge mekanizmayı açık ediyor. Bildirimsiz istemde hemen kalıbı 5 kez seçiliyor;
yasak bildirimli istemde 35 kez. Yasak cümlesi bu kalıbın metnindeki belirteci istemin içine
yazdı ve benzetici o belirteci istemde gördüğü bir sözcük olarak işledi. Model bir sözcüğün
“kullanma” ile birlikte mi yoksa “kullan” ile birlikte mi anıldığını ayırt etmiyor; gördüğü şey
sözcüğün orada olmasıdır. Olumlu bildirim aynı mekanizmayı ters yönde kullanıyor: ilgil
belirteçli uygun kalıp 26’dan 77’ye çıkıyor, çünkü istemde geçen sözcükler bu kez uygun
kalıbın sözcükleri.
Orta bölüm farkın koşumdan bağımsız olup olmadığını sınıyor. Üç tohumda da sıralama aynı: yasak bildirimi tabanın üstünde, olumlu bildirim tabanın çok altında. İki koşum arasındaki fark bildirimsiz istemde 0,0167, olumlu bildirimde 0,0167, yasak bildiriminde 0,1167. Yasak bildiriminin kattığı +0,2750, kendi koşum farkının iki katından büyüktür ve ölçülmüş sayılır. Olumlu bildirimin kattığı −0,2416, koşum farkının on dört katıdır ve tartışmasızdır. Yasak bildiriminin koşum farkının öbür ikisinden yedi kat büyük olması ayrıca bir bulgudur: yasak, sonucu yalnız kötüleştirmiyor, daha kararsız da yapıyor.
Alt bölüm bedeli veriyor. Yasak bildirimi 1680 giriş belirteci ekliyor ve ihlal sayısını 31’den 64’e çıkarıyor; eklenen her belirteç sayıyı yanlış yöne itiyor. Olumlu bildirim 3360 giriş belirteci ekliyor ve ihlali 31’den 2’ye indiriyor: önlenen ihlal başına 115,9 giriş belirteci. Yasağı olumluya eklemek 5040 belirteç harcayıp yalnız 12 ihlal önlüyor, yani önlenen ihlal başına 420,0 belirteç — aynı sonucu üçte bir bedelle veren bir istem varken. İki katı belirteç harcayan istem burada doğru istemdir, ve bunu ancak ikisini de koşturup sayarak söylemek mümkün. Ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir; bu derste tahmin, sayının tersi yönde çıktı.
Özet
- Aynı kural iki ayrı yazımla ölçüldü. Bildirimsiz istemde ihlal oranı 0,2583, yasak bildirimli istemde 0,5333: yasağı yazmak ihlali iki katından fazlaya çıkardı.
- Artış yasaklanan sözcüklerde toplanıyor:
hementaşıyan yanıt sayısı 5’ten 35’e çıkıyor ve hiçbir yasaklı sözcükte düşüş görülmüyor. - Olumlu bildirim aynı kuralı hiçbir yasaklı sözcüğü anmadan kuruyor ve ihlali 0,0167‘ye indiriyor; etiket isabeti de 0,6667’den 0,8333’e çıkıyor.
- İkisi birlikte yazıldığında ihlal 0,1583 oluyor, yani olumlu bildirimin tek başına verdiğinin yaklaşık on katı. Yasak cümlesi olumlu bir istemin içinde de kendi zararını taşıyor.
- Bedel: yasak bildirimi +1680 giriş belirteciyle 33 ihlal ekliyor, olumlu bildirim +3360 giriş belirteciyle 29 ihlal önlüyor (önlenen ihlal başına 115,9 belirteç), ikisi birlikte +5040 belirteçle yalnız 12 ihlal önlüyor.
Sonraki Adım
Dört derste dört ayrı tasarım kararı ölçüldü ve her biri tek başına, bir defada denendi. Gerçek bir istem böyle yazılmaz. Bir istem yazılır, ölçülür, bir yeri değiştirilir, yeniden ölçülür ve bu döngü sayı iyileşmez olana kadar sürer. Sonraki ders bu döngünün kendisini ölçü altına alır: kaç yinelemede kazanç doyuyor, ve daha rahatsız edici olan soru, yineleme boyunca bakılan kümenin sayısı ile hiç bakılmayan bir kümenin sayısı birbirinden ne zaman ayrılmaya başlıyor. Bu ders aynı zamanda konunun kapanışıdır ve sekiz dersin toplamını bir soruyla bağlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.