İçeriğe geç
academia.sh

Ders 18 / 22

Cezalar ve Durdurma Dizileri

Yineleme cezası ve durdurma dizisinin aynı yanıt üretiminde ölçülmesi: taban düzenekte yineleme oranı 0,3431 ve 120 yanıtın 107'si uzunluk sınırında kesiliyor, isteme yazılan yasak bildirimi oranı 0,2167'ye indirirken giriş belirtecini 2734'ten 3574'e çıkarıyor, aynı işi 0,45 yineleme cezası sıfır ek belirteçle 0,1972'ye indiriyor. Durdurma dizisi kesilen yanıt sayısını 55'e, ceza ile birlikte 24'e düşürüyor ve çıkış belirtecini 4073'ten 2653'e indiriyor, ama yirmi beş yanıtı etiket cümlesi yazılmadan erken kesip kullanılabilirliği 0,8833'ten 0,7417'ye düşürüyor. Durdurma dizisi satırında iki koşum farkı 0,0543'tür ve tabana göre kazancın 0,0746 olması bu satırı sınırda ölçülebilir kılar.

İçindekiler

Önceki derste örnekleme ayarları hangi kavramın seçileceğini denetledi. Yanıtın nerede biteceği ise tek bir sert uzunluk sınırına bırakıldı ve o sınırda kaç yanıtın kesildiği hiç sayılmadı. Aynı biçimde, uzun bir yanıtın kendi içinde aynı cümleyi tekrar etmesi de ölçülmedi.

Bu ders iki denetimi ekler ve ikisini de sayıyla karşılaştırır. Yineleme cezası, daha önce üretilmiş bir parçanın puanını düşürür. Durdurma dizisi, belirlenen bir metin parçası üretildiğinde üretimi bitirir. İkisi de çağrı ayarıdır ve isteme tek bir belirteç eklemez; bu yüzden ders bir üçüncü yolu da yan yana ölçer: aynı işi isteme yazarak istemek.

  • CD9. Kod bir benzeticidir; gerçek bir uç nokta çağrılmaz. Talepler ve yanıt cümleleri kurgudur, tohum 20260218.
  • CD10. Benzetici yanıtı cümle cümle üretir. Her adımda altı kurgu cümleden biri puanına göre çekilir; çekiliş kısıtsızsa aynı cümle birden çok kez gelebilir.
  • CD11. Yineleme oranı, bir yanıtta tekrar eden cümlelerin payıdır: bir eksi ayrı cümle sayısının toplam cümle sayısına oranı, 120 yanıt üzerinde ortalanır.
  • CD12. Kesilen yanıt, çıktı belirteci sınırına (34 belirteç) çarpıp son cümlesi yarıda kalan yanıttır. Erken kesilen yanıt, durdurma dizisi yüzünden etiket cümlesi yazılmadan biten yanıttır; ikisi ayrı sayılır.
  • CD13. Etiket cümlesi, konunun kaydedildiğini bildiren cümledir. Yarıda kalmış bir son cümle tam sayılmaz; yanıtın kullanılabilirliği bu cümleye bakılarak ölçülür.
  • CD14. İstemdeki yasak bildirimi benzeticide ılımlı bir cezaya karşılık gelir. Bu, bir yönergenin bir ayara doğrudan çevrilmediğini gösteren bir kurgu kabuldür.
  • CD15. İki koşum tohum 20260218 ve 20260219 ile alınır; yineleme oranı iki koşumda ayrı ayrı basılır ve aradaki fark ölçülebilirlik eşiğidir.
  • CD16. Bedel giriş belirteci, çıkış belirteci ve çağrı sayısı olarak yazılır; çağrı sayısı bu derste hiç değişmez.

Yanıtın Kendini Tekrar Etmesi

Bir yanıt tek bir seçim değildir; art arda gelen birçok seçimdir. Her adımda en yüksek puanlı parça biraz daha olasıdır ve bir kez seçilmesi onu daha az olası kılmaz. Sonuç, uzun yanıtlarda kendini gösteren bir döngüdür: aynı cümle döner durur ve yanıt sınırda kesilir.

# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz. Bu blok yaniti
# cumle cumle ureten bir dil modeli benzeticisidir; talepler de KURGU'dur.
import math

TOHUM, M32 = 20260218, 0xFFFFFFFF
EN_UZUN, EN_COK_CUMLE = 34, 6           # cikti belirteci siniri ve cumle siniri


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 = [("bu ayki fatura tutari gecen aya gore cok yuksek geldi", "fatura"),
         ("faturami odedim ama sistemde borc gorunuyor", "fatura"),
         ("fatura ayrintisini nereden gorebilirim", "fatura"),
         ("evde su akmiyor bir ariza var galiba", "ariza"),
         ("baglanti bozuk oldu ve hic calismiyor", "ariza"),
         ("ariza kaydi actim ama ekip gelmedi", "ariza"),
         ("sayac okumasi yanlis girilmis endeks tutmuyor", "sayac"),
         ("sayac degisimi icin randevu istiyorum", "sayac"),
         ("sayac uzerindeki endeks ile fatura ayni degil", "sayac"),
         ("hangi tarife basamagindayim ogrenmek istiyorum", "tarife"),
         ("tarife degisikligi icin ne yapmam gerekiyor", "tarife"),
         ("birim ucret abone tipine gore degisiyor mu", "tarife"),
         ("mahallede kesinti var ne zaman gelecek", "kesinti"),
         ("planli kesinti duyurusu nereden takip edilir", "kesinti"),
         ("aksamdan beri kesinti yasiyoruz", "kesinti")]
TALEP = []
for i in range(120):                    # 120 KURGU destek talebi
    r = uretec(TOHUM + i)
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    TALEP.append({"no": 4001 + i, "konu": k,
                  "metin": [x for x in KALIP if x[1] == k][int(r() * 3)][0]})

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"}
CUMLE = [("talebiniz alindi", 1.00), ("konu {k} olarak kaydedildi", 1.25),
         ("ilgili ekibe yonlendirildi", 1.05), ("en kisa surede donus yapilacak", 0.95),
         ("ek bilgi icin kayit numaranizi hazir bulundurun", 0.80),
         ("anlayisiniz icin tesekkur ederiz", 0.85)]
SAYAC = [0]


def yanitla(istem, tohum=TOHUM, ceza=0.0, durdurma=None, en_uzun=EN_UZUN):
    """Yanit cumle cumle uretilir. ceza kullanilan cumlenin puanini dusurur;
    durdurma dizisi uretilen cumlede gorunurse uretim o cumleyi yazmadan biter."""
    SAYAC[0] += 1
    bel = belirtecle(istem)
    p = {k: 0.15 for k in KONU}
    for t in bel:
        if IZ.get(t) in p:
            p[IZ[t]] += 1.0
    k = max(sorted(p), key=lambda a: p[a])
    if "tekra" in bel:                                  # istemdeki yasak bildirimi
        ceza = max(ceza, 0.45)
    r = uretec(tohum ^ izno(istem))
    kullanim, cumleler, belir, kesildi, erken = {}, [], [], False, False
    while len(cumleler) < EN_COK_CUMLE:
        s = [b - ceza * kullanim.get(c, 0) for c, b in CUMLE]
        e = [math.exp(v / 0.35) for v in s]
        c = CUMLE[ayrik(r(), [v / sum(e) for v in e])][0].format(k=k)
        if durdurma and durdurma in c:                  # durdurma dizisi
            erken = not any("konu" in x for x in cumleler)
            break
        kullanim[c.replace(k, "{k}")] = kullanim.get(c.replace(k, "{k}"), 0) + 1
        yeni = belirtecle(c)
        if len(belir) + len(yeni) > en_uzun:            # uzunluk siniri: kesilme
            belir, kesildi = (belir + yeni)[:en_uzun], True
            cumleler.append(c)
            break
        belir += yeni
        cumleler.append(c)
    tam = cumleler[:-1] if kesildi else cumleler
    return {"cumle": cumleler, "belirtec": len(belir), "kesildi": kesildi,
            "erken": erken, "etiket": any(c.startswith("konu") for c in tam)}


YONERGE = "Su destek talebine kisa bir yanit yaz . Talep "
ORNEK = TALEP[4]
o = yanitla(YONERGE + f"{ORNEK['no']} : {ORNEK['metin']}")
print(f"KURGU talep kumesi {len(TALEP)} kayit; ornek talep {ORNEK['no']}")
print(f"cikti siniri {EN_UZUN} belirtec, cumle siniri {EN_COK_CUMLE}")
for c in o["cumle"]:
    print(f"  - {c}")
print(f"cumle {len(o['cumle'])}, ayri cumle {len(set(o['cumle']))}, "
      f"belirtec {o['belirtec']}, kesildi {o['kesildi']}, etiket {o['etiket']}")
d = yanitla(YONERGE + f"{ORNEK['no']} : {ORNEK['metin']}", ceza=0.90,
            durdurma="ek bilgi")
print("ceza 0,90 ve durdurma dizisi 'ek bilgi' ile ayni talep:")
for c in d["cumle"]:
    print(f"  - {c}")
print(f"cumle {len(d['cumle'])}, ayri cumle {len(set(d['cumle']))}, "
      f"belirtec {d['belirtec']}, kesildi {d['kesildi']}, erken {d['erken']}")
KURGU talep kumesi 120 kayit; ornek talep 4005
cikti siniri 34 belirtec, cumle siniri 6
  - anlayisiniz icin tesekkur ederiz
  - ilgili ekibe yonlendirildi
  - en kisa surede donus yapilacak
  - talebiniz alindi
  - ilgili ekibe yonlendirildi
  - en kisa surede donus yapilacak
cumle 6, ayri cumle 4, belirtec 34, kesildi True, etiket False
ceza 0,90 ve durdurma dizisi 'ek bilgi' ile ayni talep:
  - anlayisiniz icin tesekkur ederiz
  - ilgili ekibe yonlendirildi
  - en kisa surede donus yapilacak
  - talebiniz alindi
  - konu sayac olarak kaydedildi
cumle 5, ayri cumle 5, belirtec 31, kesildi False, erken False

Aynı talep iki ayarda iki ayrı yanıt verdi ve ikisinin farkı bir üslup meselesi değil. Üstteki yanıt altı cümlenin dördü ayrı olacak biçimde iki tekrar taşıyor, otuz dört belirtecin tamamını harcıyor, sınırda kesiliyor ve etiket cümlesini hiç yazamıyor. Yanıt kullanılamaz: talebin hangi konuya atandığı içinde yok. Alttaki yanıt beş ayrı cümleyle otuz bir belirteçte bitiyor ve etiket cümlesi sona yetişiyor. Kesilme yok, tekrar yok.

Buradaki nedensellik önemlidir. Tekrar, yanıtı yalnız çirkinleştirmiyor; sınırlı bütçeyi tüketip asıl içeriği dışarıda bırakıyor. Yineleme, uzunluk sınırıyla birleştiğinde bir biçim sorunu olmaktan çıkıp bir içerik kaybına dönüşür.

Üç Yolun Aynı Tabloda Sayılması

Aynı 120 talep beş düzenekte koşturulur. İkinci satır isteme yazılan bir yasak bildirimidir; üçüncü ve dördüncü satır çağrı ayarı olan yineleme cezasıdır; beşinci satır durdurma dizisi, altıncısı ikisinin birleşimidir.

YASAK = "Ayni cumleyi tekrar etme . "
DUZENEK = [("taban", YONERGE, 0.0, None),
           ("istemde yasak bildirimi", YASAK + YONERGE, 0.0, None),
           ("yineleme cezasi 0,45", YONERGE, 0.45, None),
           ("yineleme cezasi 0,90", YONERGE, 0.90, None),
           ("durdurma dizisi", YONERGE, 0.0, "ek bilgi"),
           ("ceza + durdurma", YONERGE, 0.90, "ek bilgi")]


def olc(yonerge, ceza, durdurma, tohum=TOHUM):
    SAYAC[0] = 0
    yin = kes = erk = kul = g = c = 0
    for x in TALEP:
        istem = yonerge + f"{x['no']} : {x['metin']}"
        o = yanitla(istem, tohum=tohum, ceza=ceza, durdurma=durdurma)
        n = len(o["cumle"])
        yin += 0.0 if n == 0 else 1 - len(set(o["cumle"])) / n
        kes += o["kesildi"]
        erk += o["erken"]
        kul += o["etiket"]
        g += len(belirtecle(istem))
        c += o["belirtec"]
    return (yin / len(TALEP), kes, erk, kul / len(TALEP), g, c)


print("duzenek                 yineleme A  yineleme B  kesilen  erken  etiketli  giris  cikis")
for ad, y, ce, d in DUZENEK:
    a = olc(y, ce, d)
    b = olc(y, ce, d, TOHUM + 1)
    print(f"{ad:<23} {a[0]:>10.4f}  {b[0]:>10.4f}  {a[1]:>4}/{b[1]:<3}{a[2]:>6}"
          f"  {a[3]:>8.4f}  {a[4]:>5}  {a[5]:>5}")
duzenek                 yineleme A  yineleme B  kesilen  erken  etiketli  giris  cikis
taban                       0.3431      0.3750   107/106     0    0.8833   2734   4073
istemde yasak bildirimi     0.2167      0.1939   112/117     0    0.9083   3574   4072
yineleme cezasi 0,45        0.1972      0.1944   117/117     0    0.9667   2734   4078
yineleme cezasi 0,90        0.0892      0.0925   120/120     0    0.9833   2734   4080
durdurma dizisi             0.2685      0.3228    55/59     25    0.7417   2734   2942
ceza + durdurma             0.0578      0.0715    24/25     20    0.8333   2734   2653

İkinci ve üçüncü satır bu dersin asıl karşılaştırmasıdır. İkisi de aynı şeyi ister: kendini tekrar etme. Yasak bildirimi yineleme oranını 0,3431’den 0,2167’ye indiriyor ve giriş belirtecini 2734’ten 3574’e çıkarıyor — talep başına yedi belirteç, toplamda 840. Yineleme cezası aynı oranı 0,1972’ye indiriyor ve giriş belirteci 2734’te sabit kalıyor. Daha az etkili olan yol pahalı, daha etkili olan yol bedelsiz. Bir hedefin isteme yazılabiliyor olması, oraya yazılmasının doğru olduğu anlamına gelmez.

Ceza 0,45’ten 0,90’a çıkarıldığında yineleme 0,0892’ye iniyor ve kazanç 0,1080‘dir. Bu satırda iki koşum farkı yalnız 0,0033, yani kazanç farkın otuz katından büyük: rahatça ölçülebilir bir iyileştirme. Aynı okuma beşinci satırda ters sonuç verir. Durdurma dizisi yinelemeyi 0,3431’den 0,2685’e indiriyor, kazanç 0,0746; ama o satırın iki koşum farkı 0,0543’tür. Kazanç farkın ancak biraz üstünde kalıyor ve tek koşuma bakan biri bu satırı olduğundan güçlü gösterir. Ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir, ve ölçüm iki koşumu birlikte okumayı gerektirir.

İki koşum farkının satırdan satıra değişmesi de bir bilgidir. Ceza satırlarında fark 0,0033 ile 0,0028 arasında kalıyor, çünkü ceza aynı cümlenin ikinci kez seçilmesini her koşumda aynı ölçüde engelliyor. Durdurma dizisi satırında fark 0,0543’e çıkıyor, çünkü yanıtın nerede biteceği tek bir çekilişe bağlı ve o çekiliş tohumla birlikte kayıyor. Bir düzenek ölçtüğü sayıyı iyileştirirken o sayının güvenilirliğini düşürebilir; iki koşumu basmayan bir tablo bunu göstermez.

Yineleme oranı düşerken kesilen yanıt sayısının arttığı da tabloda görünüyor: taban 107, ceza 0,90 ile 120. Ceza tekrarı azaltır ama yanıtı kısaltmaz; tersine, tekrar yerine gelen ayrı cümleler daha uzundur ve bütçeyi daha hızlı tüketir. Uzunluk sorununu çözen tek düzenek durdurma dizisidir: kesilen yanıt 55’e, ceza ile birlikte 24’e iniyor ve çıkış belirteci 4073’ten 2653’e düşüyor. Toplam kazanç 1420 belirteç, yanıt başına 11,8 belirteçtir.

Durdurma Dizisinin Erken Kestiği

Durdurma dizisinin bedeli çıkışta değil içerikte ödenir. Beşinci satırda yirmi beş yanıt, etiket cümlesi hiç yazılmadan bitiyor: durdurma dizisini taşıyan cümle sıraya erken düştü ve üretim orada durdu. Kullanılabilir yanıt payı tabanın 0,8833’ünden 0,7417’ye iniyor. Yani çıkış belirtecinden kazanılan 1131 belirteç, on yedi kullanılabilir yanıtla ödendi.

Son satır iki düzeneğin birbirini nasıl düzelttiğini gösteriyor. Yineleme cezası eklenince erken kesme 25’ten 20’ye, kullanılabilirlik 0,8333’e çıkıyor. Sebep sıradadır: ceza, daha önce kullanılmış cümlelerin puanını düşürdüğü için etiket cümlesi yanıtın başlarına doğru kayıyor ve durdurma dizisi geldiğinde çoğu yanıtta zaten yazılmış oluyor. Buna karşın son satır hâlâ tabanın altındadır: 0,8333 karşısında 0,8833. İki düzenek birlikte çıkışı üçte bir oranında ucuzlattı ve kullanılabilirliği düşürdü.

Bu, durdurma dizisi seçiminin bir tasarım kararı olduğunu gösterir. Dizinin kendisi keyfi değildir: yanıtta zorunlu içerikten sonra görünmesi beklenen bir metin parçası seçilmelidir. Burada seçilen parça yanıtın sonlarında beklenen bir ek bilgi cümlesinin başıydı ve beklentinin tutmadığı yirmi beş yanıtta içerik kaybı oluştu. Ölçülmesi gereken şey dizinin kendisi değil, onun hangi sıklıkla zorunlu içerikten önce çıktığıdır; bu sayı basılmadan durdurma dizisi ölçülmüş sayılmaz.

Üç sayıyla toparlanır. Önceki istem, yalın yanıt yönergesidir: 2734 giriş belirteci, yineleme 0,3431, kesilen 107, çıkış 4073, kullanılabilirlik 0,8833. Değiştirilmiş istem iki ayrı biçimde kurulabilir. İsteme yasak bildirimi yazmak yinelemeyi 0,2167’ye indirir ve 840 belirteç ekler. Çağrı ayarını değiştirmek yinelemeyi 0,0578’e, kesileni 24’e, çıkışı 2653’e indirir; giriş belirteci ve çağrı sayısı hiç değişmez, karşılığında yirmi yanıt erken kesilir ve kullanılabilirlik tabanın altına iner. Bir düzeneğin bedeli her zaman belirteçle ödenmez; bazen doğrudan kullanılabilirlikle ödenir.

Özet

  • Yanıt cümle cümle üretildiği için tekrar kendiliğinden oluşur: taban düzenekte yineleme oranı 0,3431 ve 120 yanıtın 107’si uzunluk sınırında kesiliyor.
  • Tekrar bir üslup sorunu değildir; sınırlı çıkış bütçesini tüketip etiket cümlesini dışarıda bırakır ve yanıtı kullanılamaz kılar.
  • İsteme yazılan yasak bildirimi yinelemeyi 0,2167’ye indirir ve 840 giriş belirteci ekler; çağrı ayarı olan 0,45 yineleme cezası aynı oranı 0,1972’ye indirir ve sıfır belirteç ekler.
  • Ceza 0,45’ten 0,90’a çıkınca kazanç 0,1080 ve iki koşum farkı 0,0033’tür; durdurma dizisinin tabana göre kazancı 0,0746 ve iki koşum farkı 0,0543’tür, yani ikinci satır sınırdadır.
  • Durdurma dizisi kesilen yanıtı 107’den 55’e, ceza ile birlikte 24’e indirir ve çıkış belirtecini 4073’ten 2653’e düşürür; bedeli yirmi beş erken kesilen yanıt ve kullanılabilirliğin 0,8833’ten 0,7417’ye inmesidir.

Sonraki Adım

Bu iki denetim yanıtın ne kadar sürdüğünü düzenledi, neye benzediğini değil. Kesilme azaldı, tekrar azaldı, ama çıktı hâlâ serbest metin: etiketin yanıtın kaçıncı cümlesinde geçtiği, hangi sözcükle yazıldığı ve yanında başka ne bulunduğu her seferinde başka. Bir kayıt sistemine yazılacak bir çıktı bu biçimde okunamaz. Sonraki ders çıktının biçimini üç düzeyde karşılaştırır — serbest metin, isteme yazılmış biçim tarifi ve şema dayatması — ve her düzeyde şemaya uyan yanıt oranını belirteç bedeliyle birlikte basar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat