Ders 01 / 22
İstem Nedir
İstemin girdi, bağlam ve yönerge bileşenlerine ayrılması ve her birinin belirteç payının ölçülmesi: 120 kurgu destek talebinde yönerge 0,3945, bağlam 0,3114, girdi 0,2941 pay tutuyor. Tek bir bileşen çıkarıldığında sayı ve bedel yan yana okunuyor. Tam istem 0,7833 etiket isabeti ve 5974 belirteç veriyor; bağlam çıkarıldığında 0,7083 ve 4177, yönerge çıkarıldığında 0,7167 ve 4751, girdi çıkarıldığında 0,1417 ve 4197. İki koşum farkı tam istemde 0,0583 iken bileşeni eksik istemlerde 0,2000 ile 0,2583 arasına çıkıyor.
İçindekiler
Önceki kurs on dört derste modelin yüzeyini ölçtü ve her sayının yanına bedelini yazdı: kaç belirteç girdi, kaç belirteç çıktı, sınır neredeydi, aynı girdi iki koşumda ne verdi. Kapanışında bir eksik duruyordu. Bütün o ölçümler boyunca modele ne söylendiği hep aynı kaldı. Yönerge metni bir kez yazıldı, sonra sabit bir arka plan gibi davranıldı; aynı görevde aynı modele başka bir metin verildiğinde sayının ne kadar oynadığı hiç sorulmadı.
Bu kurs o metni ölçüm nesnesine dönüştürür. Model, görev ve talep kümesi kurs boyunca sabittir; değişen tek şey metindir. Her derste üç sayı yan yana durur: önceki istem, tek bir tasarım kararı uygulanmış değiştirilmiş istem, ve değişikliğin bedeli. Bedel belirteçle yazılır; belirteç maliyeti ve bütçe önceki kursun kapanış dersinde ölçüldü ve burada tekrarlanmaz. Kursun kuralı budur: istem bir tasarım nesnesidir; ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir. Bu ders o nesneyi parçalarına ayırır.
- IT1. Kod gerçek bir model uç noktası çağırmaz; standart kitaplıkla yazılmış bir benzeticiyi çağırır. Benzetici önceki kursta kurulan tanımın aynısıdır: kurgu belirteçleyici, 240 belirteçlik bağlam penceresi, 24 belirteçlik en büyük çıktı, tohuma bağlı belirsizlik, hız sınırı ve zaman aşımı.
- IT2. Destek talepleri kurgudur: 120 kayıt, beş konu, kayıtların bir bölümüne eklenmiş yanıltıcı bir cümle. Konu adları saha ekibinin kurgu belge dağarcığından gelir.
- IT3. İstem üç bileşene ayrılır ve ayrım metnin işlevine göredir. Yönerge ne yapılacağını söyler, bağlam kararın verileceği dünyayı tanımlar, girdi o kararın uygulanacağı kaydı taşır.
- IT4. Ölçüt etiket isabetidir. Yanıttan bir etiket okunamazsa kayıt yanlış sayılır ve etiketsiz yanıt payında ayrıca gösterilir.
- IT5. Bedel belirteçtir ve giriş ile çıkış ayrı ayrı yazılır. İkisi aynı yöne gitmez; bu dersin ana bulgularından biri budur.
- IT6. Bir bileşenin katkısı, o bileşen çıkarılarak ölçülür. Kalan iki bileşen, model, tohum ve talep kümesi değişmez.
- IT7. Her ölçüm iki tohumla koşulur (20260218 ve 20260219). Tohum bir ayar değil, belirsizliğin okunduğu yerdir.
- IT8. Belirteç, bağlam penceresi ve çıkarım önceki kursun dil modelleri konusunda tanımlandı; burada yalnızca kullanılır.
İstemin Üç Bileşeni
Bir isteme dışarıdan bakınca tek bir metin görünür. İçeriden bakınca üç ayrı iş yapan üç metin vardır ve üçünün bedeli de, katkısı da farklıdır. Yönerge görevi tanımlar: talebi bir etikete ata, yanıtı şu biçimde ver. Bağlam kararın verileceği dünyayı kurar: etiket kümesi nedir, hangi seçenekler var. Girdi her istekte değişen tek parçadır: sınıflandırılacak talebin kendisi. Yönerge ve bağlam yüz yirmi istekte aynı kalır, girdi yüz yirmi kez değişir.
İlk blok benzeticiyi ve kurguyu kurar, sonra bu üç bileşeni ayrı ayrı yazıp belirteçlerini sayar.
# 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 YONERGE = "Talebi asagidaki etiketlerden birine ata . Yanit olarak tek etiket yaz ." BAGLAM = "Etiketler: fatura , ariza , sayac , tarife , kesinti ." def istem(x, y=True, b=True, g=True): # uc bilesenden secerek istem kurar p = [] if y: p.append(YONERGE) if b: p.append(BAGLAM) if g: p.append("Talep: " + x["metin"]) return " ".join(p) x0 = TALEP[0] print(f"KURGU talep kumesi: {len(TALEP)} kayit, {len(KONU)} konu") for ad, m in (("yonerge", YONERGE), ("baglam", BAGLAM), ("girdi", "Talep: " + x0["metin"])): print(f"{ad:<9} {len(belirtecle(m)):>2} belirtec | {m}") i0 = istem(x0) print(f"{'tam istem':<9} {len(belirtecle(i0)):>2} belirtec") for th in (TOHUM, TOHUM + 1): print(f"tohum {th}: {cagir(i0, tohum=th)['yanit']}")
KURGU talep kumesi: 120 kayit, 5 konu yonerge 19 belirtec | Talebi asagidaki etiketlerden birine ata . Yanit olarak tek etiket yaz . baglam 15 belirtec | Etiketler: fatura , ariza , sayac , tarife , kesinti . girdi 13 belirtec | Talep: planli kesinti duyurusu nereden takip edilir tam istem 47 belirtec tohum 20260218: kesinti tohum 20260219: kesinti
Kırk yedi belirteçlik istemin yalnız on üçü asıl işe, yani sınıflandırılacak talebe ait. Geri kalan otuz dördü, her istekte yeniden gönderilen sabit metindir. İki tohumun aynı yanıtı vermesi belirsizliğin ortadan kalktığı anlamına gelmez; tek bir kayıtta iki koşumun çakıştığı anlamına gelir. Kurs boyunca bu karşılaştırma kümenin tamamında yapılır.
Her Bileşenin Belirteç Payı
Bir bileşenin bedeli, kendi uzunluğu değil, uzunluğunun istek sayısıyla çarpımıdır. Katkısı ise ancak çıkarılarak ölçülebilir. İkinci blok ikisini birden yapar: önce üç bileşenin toplam giriş belirtecindeki payını çıkarır, sonra her seferinde bir bileşeni düşürüp aynı 120 kaydı yeniden koşar.
def olc(tohum=TOHUM, **kw): SAYAC[0] = 0 gi = ci = d = bos = 0 for x in TALEP: s = cagir(istem(x, **kw), tohum=tohum) gi, ci = gi + s["giris"], ci + s["cikis"] e = oku(s["yanit"]) bos += e is None d += e == x["konu"] n = len(TALEP) return {"isabet": d / n, "bos": bos / n, "giris": gi, "cikis": ci} ty, tb = len(belirtecle(YONERGE)), len(belirtecle(BAGLAM)) tg = sum(len(belirtecle("Talep: " + x["metin"])) for x in TALEP) / len(TALEP) top = ty + tb + tg print(f"{'bilesen':<10} {'belirtec':>9} {'pay':>8}") for ad, v in (("yonerge", ty), ("baglam", tb), ("girdi", tg), ("toplam", top)): print(f"{ad:<10} {v:>9.2f} {v / top:>8.4f}") print() DURUM = (("tam istem", {}), ("baglam yok", {"b": False}), ("yonerge yok", {"y": False}), ("girdi yok", {"g": False})) print(f"{'istem':<12} {'isabet':>7} {'kosum 2':>8} {'fark':>7} {'etiketsiz':>10} " f"{'giris':>6} {'cikis':>6} {'toplam':>7}") for ad, kw in DURUM: A, B = olc(**kw), olc(tohum=TOHUM + 1, **kw) print(f"{ad:<12} {A['isabet']:>7.4f} {B['isabet']:>8.4f} " f"{abs(A['isabet'] - B['isabet']):>7.4f} {A['bos']:>10.4f} {A['giris']:>6d} " f"{A['cikis']:>6d} {A['giris'] + A['cikis']:>7d}")
bilesen belirtec pay yonerge 19.00 0.3945 baglam 15.00 0.3114 girdi 14.17 0.2941 toplam 48.17 1.0000 istem isabet kosum 2 fark etiketsiz giris cikis toplam tam istem 0.7833 0.7250 0.0583 0.0250 5780 194 5974 baglam yok 0.7083 0.5083 0.2000 0.0667 3980 197 4177 yonerge yok 0.7167 0.4583 0.2583 0.2167 3500 1251 4751 girdi yok 0.1417 0.2167 0.0750 0.0250 4080 117 4197
İlk tablo kurs boyunca hatırlanacak orantıyı veriyor. Asıl veri, yani sınıflandırılacak talep, istemin 0,2941 payını tutuyor. Yönerge ve bağlam birlikte 0,7059 tutuyor ve bu iki metin yüz yirmi istekte harf harf aynı. Ortalama talep 14,17 belirteç, sabit metin 34 belirteç: her istekte verinin 2,4 katı kadar sabit metin yeniden gönderiliyor.
Bir Bileşen Çıkarıldığında
İkinci tablo bileşenlerin katkısını verir ve üçünün de aynı işi yapmadığını gösterir.
Bağlam çıkarıldığında isabet 0,7833’ten 0,7083’e iniyor ve toplam belirteç 5974’ten 4177’ye, yani 1797 belirteç düşüyor. Kazanç ile kayıp ilk bakışta dengeli görünüyor. Ama etiketsiz yanıt payı 0,0250’den 0,0667’ye çıkmış: etiket kümesi istemde yazılı değilken model, beş konunun dışında kalan sözcüklerle de yanıt veriyor ve o yanıtlardan hiçbir etiket okunamıyor. Bağlamın işi modeli akıllandırmak değil, cevap uzayını kapatmaktır.
Yönerge çıkarıldığında isabet 0,7167’ye iniyor, giriş belirteci 5780’den 3500’e düşüyor — ve çıkış belirteci 194’ten 1251’e fırlıyor. Bu, tablonun en sert satırıdır. Yönerge on dokuz belirteçlik en kısa bileşendi; onu atmak girişte 2280 belirteç kazandırdı, ama çıkışta 1057 belirteç geri aldı ve net kazanç 1223 belirtece indi. Yanıtlar cümleye dönüştüğü için etiketsiz pay 0,0250’den 0,2167’ye çıktı: her beş yanıttan biri makinece okunamaz hâle geldi. Yönerge bu istemde birim uzunluk başına en pahalı değil, en getirili bileşendir.
Girdi çıkarıldığında çıkan sayı bu dersin en öğretici satırıdır. İstem hâlâ geçerlidir, hâlâ 4197 belirteç harcar, hâlâ etiketsiz yanıt payı 0,0250’dir — yani çıktı sorunsuz görünür. İsabet ise 0,1417’ye çöker; yüz yirmi kaydın hepsine aynı istem gittiği için model her seferinde aynı tahmini üretir ve o tahmin ancak o etiketin kümedeki payı kadar tutar. Bir istem, veri taşımadan da düzgün biçimli ve kendinden emin bir yanıt üretir. İstemi biçimine bakarak değerlendirmenin niçin ölçüm sayılmadığı buradadır.
Ölçülmeden Değiştirilen İstem Bir Tahmindir
Tablonun fark sütunu, kursun üçüncü kuralını ilk kez çalıştırıyor. Tam istem iki tohumda 0,7833
ve 0,7250 verdi; iki koşum farkı 0,0583. Bağlamın çıkarılmasının isabete etkisi 0,0750,
yönergenin çıkarılmasının etkisi 0,0667. Her iki sayı da iki koşum farkının hemen üstünde duruyor
ve tek başlarına güvenilecek büyüklükte değil. Bu kursta böyle bir sayı ölçülmüş sayılmaz;
kural bir sonraki derslerde adıyla işletilir.
Aynı satırların ölçülmüş olan yanı başka yerdedir. Etiketsiz yanıt payı 0,0250’den 0,2167’ye çıktı, çıkış belirteci altı katına bindi, ve bileşeni eksik istemlerin kendi iki koşum farkı 0,2000 ile 0,2583 arasına yükseldi. Üç bileşen isabete ekledikleri kadar isabeti oturtuyor: tam istem koşumdan koşuma 0,0583 oynarken, bileşeni düşmüş istemler dört kat fazla oynuyor. İstemin bileşenleri modele bilgi vermekten çok, modelin serbestlik alanını daraltır; kazanç oradan gelir.
Bedel de bu okumadan ayrı yazılır. Tam istem doğru etiket başına 5974 / 0,7833 / 120, yani 63,5 belirteç harcıyor. Bağlamsız istem 49,1 belirteç, yönergesiz istem 55,2 belirteç harcıyor. Yani en isabetli istem aynı zamanda en pahalı istemdir ve bu ikisi ayrı satırlarda durmalıdır. Bir bileşeni çıkarmak bedeli düşürür; onu çıkarmanın nasıl bir kayıp olduğu ise ancak isabet ve etiketsiz pay birlikte okununca görünür.
Özet
- İstem üç bileşene ayrılır: yönerge (ne yapılacak), bağlam (hangi dünyada), girdi (hangi kayıt). 120 kurgu talepte paylar 0,3945 / 0,3114 / 0,2941; asıl veri istemin üçte birinden azdır.
- Bağlam cevap uzayını kapatır: çıkarıldığında isabet 0,7833’ten 0,7083’e, etiketsiz yanıt payı ise 0,0250’den 0,0667’ye gider ve 1797 belirteç kazanılır.
- Yönerge en kısa ve en getirili bileşendir: çıkarıldığında girişte 2280 belirteç kazanılır ama çıkışta 1057 belirteç geri ödenir, etiketsiz pay 0,2167’ye çıkar.
- Girdisiz istem de düzgün biçimli yanıt üretir ve 4197 belirteç harcar; isabeti 0,1417’dir. Biçimi doğru bir çıktı, isteminin ölçüldüğü anlamına gelmez.
- Tam istemin iki koşum farkı 0,0583; bileşeni eksik istemlerinki 0,2000 ile 0,2583. Bileşenlerin asıl ölçülen katkısı, isabeti yükseltmek kadar koşumlar arası oynamayı daraltmaktır.
Sonraki Adım
Bu derste yönerge ve bağlam yüz yirmi isteğin her birine yeniden yazıldı ve toplam girişin 0,7059 payını tuttu. Kod bunu tek satırda yaptığı için bedel görünmez kaldı: aynı otuz dört belirteç yüz yirmi kez gönderildi. Bir davranış tanımı bir kez yazılır ama her istekte ödenir, ve istek sayısı büyüdükçe bu tekrar toplam maliyetin baskın kalemi hâline gelir. Sonraki ders bunu ölçer: kalıcı bir sistem yönergesinin toplam belirteci istek sayısıyla nasıl büyüdüğü, yönergeyi kısaltmanın kaç belirteç kazandırdığı, ve o kısaltmanın isabetten ne kadarını geri aldığı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.