İçeriğe geç
academia.sh

Ders 04 / 22

Açık ve Ölçülebilir Talep

Belirsiz bir talebin tek bir yanlış yanıt değil bir dağılım ürettiği ölçülüyor: aynı belirsiz istem on koşumda kayıt başına ortalama 4,81 ayrı yanıt veriyor, en sık yanıt koşumların yalnız 0,3944 payında tekrarlanıyor ve yanıtların 0,4333 payından hiçbir etiket okunamıyor. Dört talep biçimi yan yana konuyor. Fiili açmak iki belirteç ekliyor ve dağılımı 4,53'e indiriyor; seçenek kümesini kapatmak 15 belirteç ekleyip dağılımı 3,89'a, etiketsiz payı 0,2889'a indiriyor; belirsizlik kuralı eklemek 10 belirteç daha ekleyip etiketsiz payı 0,3722'ye geri çıkarıyor. Tek koşumda okunan isabetin bandı 0,2778 ile 0,3333 arasındadır ve dört talebi birbirinden ayıramaz.

İçindekiler

Önceki ders isteme kimlik ve yordam ekledi ve dört önekten hiçbirinin farkının ölçülebilir olmadığını buldu. O ölçüm boyunca bir şey hiç değişmedi: ne istendiği. Talep her istemde aynı cümleydi ve o cümlenin kendisi hiç sorgulanmadı. Oysa görev tanımı istemin en pahalı parçası değil, en belirleyici parçasıdır.

Belirsiz bir talebin bedeli, belirsiz bir yanıt vermesi değildir. Belirsiz talep tek bir yanlış cevap üretmez; bir dağılım üretir. Aynı istem, aynı kayıt, aynı model — ve on ayrı koşumda birbirinin yerine geçmeyen birkaç ayrı yanıt. Bu dağılım tek koşuma bakan hiçbir ölçüde görünmez; tek koşumda görünen şey, o dağılımdan çekilmiş tek bir örnektir. Bu ders dağılımı ölçer ve talebi ölçülebilir kılmanın onu ne kadar darattığını sayar.

  • IT26. Kod bir benzeticiyi çağırır; gerçek bir model uç noktası çağrılmaz. Destek talepleri kurgudur ve önceki derslerdeki kümenin ilk 36 kaydıdır. Küme küçültüldü çünkü her kayıt on kez çağrılıyor.
  • IT27. Her kayıt on koşumla ölçülür: tohum 20260218’den 20260227’ye. Dağılım ölçüleri bu on yanıtın toplamıdır, tek bir koşumun değil.
  • IT28. Ayrı yanıt sayısı, on koşumda birbirinden farklı çıkan yanıt metinlerinin sayısıdır ve kayıt başına ortalanır. En küçük değeri 1, en büyüğü 10’dur.
  • IT29. En sık pay, on koşumda en çok tekrarlanan yanıtın payıdır. Dar bir dağılımda 1’e, geniş bir dağılımda 0,1’e yaklaşır.
  • IT30. Hız sınırı her otuz yedinci çağrıda tetiklenir ve boş yanıt döndürür. Dağılım sayımını bozmaması için çağrı sayacı her kaydın on koşumundan önce sıfırlanır; bu bir ölçüm kararıdır ve koddadır.
  • IT31. Dört talep biçimi artımlı kurulur: belirsiz fiil, açık fiil, açık fiil ile kapalı seçenek kümesi, buna eklenmiş belirsizlik kuralı.
  • IT32. Bu derste yanıtın biçimi hiçbir istemde istenmez. Ölçülen şey talebin açıklığıdır; çıktının biçimi bir sonraki dersin konusudur.
  • IT33. İsabet, on koşumun her birinde ayrı hesaplanır; tabloda ortalaması ve bandı (en büyük ile en küçük koşum arasındaki fark) basılır.
  • IT34. Bedel belirteçtir ve istek başına giriş ile çıkış olarak yazılır; on koşum bedeli on katıdır.

Belirsiz Talebin Ürettiği Dağılım

İlk blok benzeticiyi ve kurguyu kurar, dört talep biçimini tanımlar ve tek bir kurgu kaydı en belirsiz biçimle on kez çağırıp çıkan yanıtları 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


FIIL = "Su destek talebini konusuna gore etiketle ."
KUME_METNI = " Etiketler: fatura , ariza , sayac , tarife , kesinti ."
TALEP_BICIMI = (("belirsiz fiil", "Su destek talebini degerlendir ."),
                ("acik fiil", FIIL),
                ("kapali kume", FIIL + KUME_METNI),
                ("belirsizlik kurali",
                 FIIL + KUME_METNI + " Birden cok konu varsa ana konuyu sec ."))
KUME = TALEP[:36]
TOHUMLAR = [TOHUM + i for i in range(10)]


def kosumlar(bas, x):
    SAYAC[0] = 0            # hiz siniri dagilim sayimini bozmasin diye her talepte sifirlanir
    return [cagir(bas + " Talep: " + x["metin"], tohum=t) for t in TOHUMLAR]


def dokum(ad, bas, x):
    s = [c["yanit"] for c in kosumlar(bas, x)]
    print(f"{ad}, on kosum -> {len(set(s))} ayri yanit")
    for v in sorted(set(s)):
        print(f"  {s.count(v)}/10  {v}")


print(f"{'talep':<19} {'belirtec':>9}")
for ad, b in TALEP_BICIMI:
    print(f"{ad:<19} {len(belirtecle(b)):>9d}")
x0 = KUME[3]
print(f"KURGU talep {x0['no']} (gercek konu {x0['konu']}): {x0['metin']}")
dokum(TALEP_BICIMI[0][0], TALEP_BICIMI[0][1], x0)
talep                belirtec
belirsiz fiil               9
acik fiil                  11
kapali kume                26
belirsizlik kurali         36
KURGU talep 4004 (gercek konu ariza): ariza kaydi actim ama ekip gelmedi
belirsiz fiil, on kosum -> 7 ayri yanit
  1/10  bu kayit ariza basligina girer , ilgili ekibe yonlendirildi
  1/10  bu kayit odeme basligina girer , ilgili ekibe yonlendirildi
  1/10  bu kayit sayac basligina girer , ilgili ekibe yonlendirildi
  2/10  kaydiniz alindi , konuyu inceleyip donus yapacagiz
  1/10  talebiniz fatura konusuyla ilgili gorunuyor
  2/10  talebiniz kesinti konusuyla ilgili gorunuyor
  2/10  talebiniz sikayet konusuyla ilgili gorunuyor

Tek bir kayıt, on koşumda yedi ayrı yanıt verdi. En sık çıkan yanıt yalnız iki koşumda tekrarlandı. Yanıtlardan biri hiçbir etiket taşımıyor; ikisi ise odeme ve sikayet etiketlerini kullanıyor, yani saha ekibinin kurgu belge dağarcığında karşılığı olmayan adlar. İstem “değerlendir” dedi ve bu fiil hangi kümeden hangi biçimde bir sonuç istendiğini hiç söylemedi. Model bu boşluğu her koşumda ayrı bir şekilde doldurdu.

Bu tablonun asıl anlamı bir kayıtta değil, kayıtların dağılımındadır. Yedi ayrı yanıttan yalnız birine bakan bir gözlemci, istemin çalıştığı ya da çalışmadığı sonucuna eşit kolaylıkla varır.

Dört Talep Yan Yana

İkinci blok dört talep biçimini otuz altı kayıtta ve on koşumda ölçer. Her satırda kayıt başına ortalama ayrı yanıt sayısı, en sık yanıtın payı, etiketsiz yanıt payı, on koşumun ortalama isabeti, isabetin bandı ve belirteç bedeli durur.

def olc(bas):
    ay = ec = bos = gi = ci = 0
    ds = [0] * len(TOHUMLAR)
    for x in KUME:
        c = kosumlar(bas, x)
        s = [v["yanit"] for v in c]
        e = [oku(v) for v in s]
        ay += len(set(s))
        ec += max(s.count(v) for v in s) / len(s)
        bos += sum(v is None for v in e) / len(e)
        for j, v in enumerate(e):
            ds[j] += v == x["konu"]
        gi += sum(v["giris"] for v in c) / len(c)
        ci += sum(v["cikis"] for v in c) / len(c)
    n = len(KUME)
    iso = [v / n for v in ds]
    return (ay / n, ec / n, bos / n, sum(iso) / len(iso), max(iso) - min(iso),
            gi / n, ci / n)


print(f"{'talep':<19} {'bel':>4} {'ayri yanit':>11} {'en sik':>7} {'etiketsiz':>10} "
      f"{'isabet':>7} {'bant':>7} {'giris':>6} {'cikis':>6}")
for ad, b in TALEP_BICIMI:
    ay, ec, bos, d, bant, gi, ci = olc(b)
    print(f"{ad:<19} {len(belirtecle(b)):>4d} {ay:>11.2f} {ec:>7.4f} {bos:>10.4f} "
          f"{d:>7.4f} {bant:>7.4f} {gi:>6.1f} {ci:>6.1f}")
print()
dokum(TALEP_BICIMI[2][0], TALEP_BICIMI[2][1], x0)
talep                bel  ayri yanit  en sik  etiketsiz  isabet    bant  giris  cikis
belirsiz fiil          9        4.81  0.3944     0.4333  0.4611  0.3333   23.1   11.4
acik fiil             11        4.53  0.4333     0.4500  0.4417  0.3333   25.1   11.3
kapali kume           26        3.89  0.4083     0.2889  0.5306  0.2778   40.1   11.5
belirsizlik kurali    36        3.78  0.4611     0.3722  0.4722  0.3333   50.1   11.6

kapali kume, on kosum -> 4 ayri yanit
  2/10  bu kayit kesinti basligina girer , ilgili ekibe yonlendirildi
  3/10  kaydiniz alindi , konuyu inceleyip donus yapacagiz
  2/10  talebiniz ariza konusuyla ilgili gorunuyor
  3/10  talebiniz kesinti konusuyla ilgili gorunuyor

Fiili Açmak Ölçülebilirlik Değildir

İkinci satır bu dersin en kolay yanlış anlaşılan sonucudur. “Değerlendir” fiili “konusuna göre etiketle” ile değiştirildi; talep dilbilgisi olarak açık, eylem olarak nettir. Ayrı yanıt sayısı 4,81’den 4,53’e indi, isabet 0,4611’den 0,4417’ye düştü, etiketsiz yanıt payı 0,4333’ten 0,4500’e çıktı. İki belirteçlik ek, dağılımı ölçülebilir biçimde daraltmadı.

Sebep yapısaldır. Açık bir fiil ne yapılacağını söyler, hangi kümeden seçileceğini söylemez. “Etiketle” diyen bir istem, etiketin nereden geleceğini modele bırakır ve model her koşumda kendi sözlüğünden bir ad üretir. Bir talebin ölçülebilir olması, fiilinin net olması değil, cevabın alınabileceği kümenin kapalı olmasıdır.

Üçüncü satır bunu gösteriyor. Beş etiketin adı isteme yazıldığında ayrı yanıt sayısı 3,89’a iniyor, etiketsiz pay 0,4333’ten 0,2889’a düşüyor ve isabet 0,5306’ya çıkıyor. Bedel açıkça sayılıdır: istek başına giriş 25,1’den 40,1 belirtece çıkıyor, yani 15 belirteç. Otuz altı kayıtta 540, on koşumda 5400 belirteç. Aynı kaydın kapalı kümeyle alınan on koşumu blok çıktısının sonundadır: yedi ayrı yanıt dörde inmiş ve küme dışı adlar kaybolmuş durumda. Bu kayıtta yoğunlaşma yanlış etikette oldu; dağılımın daralması isabet güvencesi değildir ve iki sayı ayrı sütunlarda durmalıdır.

Dördüncü satır kursun ikinci iddiasını ödüyor. “Birden çok konu varsa ana konuyu seç” cümlesi on belirteç ekliyor ve ayrı yanıt sayısını 3,89’dan 3,78’e indiriyor. Aynı cümle etiketsiz payı 0,2889’dan 0,3722’ye çıkarıyor ve isabeti 0,5306’dan 0,4722’ye düşürüyor. Belirsizliği azaltmak için yazılmış bir cümle, ölçüldüğünde belirsizliği artırmış olabilir.

Dağılım Tek Koşumda Görünmez

Tablonun bant sütunu bu dersin yöntem sonucudur. Dört talebin on koşumdaki isabet bandı sırasıyla 0,3333, 0,3333, 0,2778 ve 0,3333. Kapalı kümenin isabete etkisi +0,0695; kendi bandının dörtte birinden küçük. Önceki dersin ölçütüyle okunduğunda bu fark ölçülmemiş sayılır. Yani dört talebin hangisinin daha iyi olduğu, tek koşumda okunan isabetle hiçbir biçimde ayırt edilemez.

Ayırt edebilen sayılar başkadır ve hepsi on koşumun toplamıdır: ayrı yanıt sayısı 4,81’den 3,89’a, etiketsiz pay 0,4333’ten 0,2889’a iniyor. Bu iki ölçü tek bir koşumdan hesaplanamaz, çünkü tek koşumda her kaydın bir yanıtı vardır ve o yanıtın kaç olasılıktan biri olduğu görünmez. Belirsiz bir talebin bedeli, tek koşumda ölçülemeyen bir bedeldir; bu yüzden çoğu istem denemesi onu hiç görmez ve tek bir başarılı örnekle kapanır.

Özet

  • Belirsiz bir talep tek bir yanlış yanıt değil bir dağılım üretir. Tek kayıt on koşumda yedi ayrı yanıt verdi; küme genelinde kayıt başına ortalama 4,81 ayrı yanıt ve en sık yanıt için yalnız 0,3944 pay çıktı.
  • Fiili açmak ölçülebilirlik değildir: iki belirteçlik ek ayrı yanıtı 4,53’e indirdi, isabeti 0,4417’ye düşürdü ve etiketsiz payı 0,4500’e çıkardı.
  • Talebi ölçülebilir kılan karar seçenek kümesini kapatmaktır: ayrı yanıt 3,89, etiketsiz pay 0,2889, isabet 0,5306. Bedeli istek başına 15 belirteç, on koşumda 5400 belirteçtir.
  • Belirsizlik kuralı eklemek on belirteç ekleyip etiketsiz payı 0,3722’ye, isabeti 0,4722’ye götürdü: belirsizliği azaltmak için yazılan cümle ölçüldüğünde belirsizliği artırdı.
  • İsabetin on koşumdaki bandı 0,2778 ile 0,3333 arasında; kapalı kümenin +0,0695 etkisi bandın içindedir. Dağılım ölçüleri tek koşumdan hesaplanamaz.

Sonraki Adım

Dört derste istemin bileşenleri ayrıldı, kalıcı yönergenin tekrar bedeli sayıldı, rol öneklerinin farkı ölçülemez bulundu ve talep kapalı bir kümeye bağlandı. Buna rağmen kapalı kümeli istem bile kayıt başına ortalama 3,89 ayrı yanıt üretiyor ve yanıtların 0,2889 payından hiçbir etiket okunamıyor. Kalan dağılımın kaynağı artık ne istendiği değil, nasıl söylendiğidir: aynı etiket üç ayrı cümle kalıbıyla, bazen de hiçbir etiket adı geçmeden veriliyor. Talep açıldı, ama yanıtın biçimi hâlâ modele bırakıldı. Sonraki ders bunu ele alır: çıktı biçimi istendiğinde kaç yanıt makinece ayrıştırılabiliyor ve uzunluk sınırı isabetten ne kadarını geri alıyor.

İ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