İçeriğe geç
academia.sh

Ders 04 / 26

Yapılandırılmış Çıktı Kipi

Şemanın isteme yazılmasıyla arayüze verilmesinin yan yana ölçülmesi: dört alanlı şemada isteme yazmak 7654 giriş belirteci harcayıp 0,7583 uyum verirken arayüz alanı 4294 belirteçle 0,9000 veriyor. Şema on iki alana çıktığında istemle uyum 0,6083'e düşüyor, arayüzle 0,9000'de sabit kalıyor ve tasarruf 6360 belirtece çıkıyor. Ağ katmanı dışarıda bırakıldığında arayüz zorunluluğunun uyumu tam olarak 1,0000'dır ve bu, İstem Mühendisliği kursunun ölçtüğü sayıdır; ağ hesaba katıldığında aynı sayı 0,9000'e iniyor, yani şema zorunluluğunun kalan hata payı modelden değil ağdan geliyor. Doğru kayıt başına belirteç dört alanda 125,8'den 65,7'ye, on iki alanda 287,1'den 123,0'a düşüyor. Alan eklemek her iki kipte de çıkış belirtecini büyütüyor ama doğru kayıt oranını yükseltmiyor.

İçindekiler

Önceki ders bir çağrının geçerliliğini sonradan denetledi: yanıt geldi, ayrıştırıldı, doğrulandı ve geçmeyen atıldı. Doğrulayıcı iyi bir sayaçtı ama geçmeyen çağrılar için yapabildiği tek şey onları saymaktı.

İstem Mühendisliği kursu biçimi isteme yazarak dayatmayı ölçtü: şemaya uyan yanıt oranı serbest metinde 0,0000, biçim tarifiyle 0,8000, üretimi kısıtlayan şema dayatmasıyla 1,0000 çıkmıştı. O sayılar bu dersin girdisidir ve yeniden türetilmez. Burada eklenen iki şey var. Birincisi, şema bir istek alanı olarak taşınabildiğinde istemin uzunluğundan bağımsız hâle gelir; şema büyüdükçe iki yolun bedeli ayrışır. İkincisi, o 1,0000 sayısı ağsız bir dünyada ölçülmüştür; bir ağ işleminde aynı zorunluluk aynı sayıyı vermez.

  • AK25. Kod bir benzeticidir; talepler ve alan kümesi kurgudur, tohum 20260218. Şema doğrulama yordamı İstem Mühendisliği kursunda ölçüldü ve burada yalnız sayaç olarak kullanılır.
  • AK26. Alan havuzu on iki alandır; şema ilk dört, ilk sekiz ya da tümüdür. Alan kuralı ya sayı ya kapalı bir değer kümesidir.
  • AK27. İki dayatma yolu ölçülür. İstemle dayatmada şemanın tarifi sistem mesajına yazılır: alan adları ve izin verilen değerler. Arayüzle dayatmada şema bir istek alanıdır; yalnız alan adları taşınır ve bu belirteçler de sayıma girer.
  • AK28. Arayüzle dayatmada üretim şemanın dışına çıkamaz. İstemle dayatmada her alan bağımsız bir çekilişle doğru üretilir; başarısız çekilişte alan atlanır, adı bozulur ya da değeri kapalı kümenin dışına çıkar.
  • AK29. Ağ katmanı sürer. Hız sınırı, zaman aşımı ve yarıda kesilme kaydı bozar; ağsız uyum sütunu yalnız tamamlanan çağrılar üzerinde okunur ve İstem Mühendisliği kursunun ölçtüğü sayıya karşılık gelir.
  • AK30. Kavram yalnız son kullanıcı mesajından okunur, böylece iki kip arasında yalnız dayatma yolu değişir.
  • AK31. Ürün ölçütü doğru kayıttır: hem şemaya uyan hem konu alanı talebin konusuna eşit olan yanıt.
  • AK32. Bağlam penceresi ve en büyük çıktı uzunluğu bu derste büyük kayıtlara göre genişletilmiştir; eşikler kurgudur. Çağrı sayısı altı kurulumda da 120’dir.

Şemanın İki Taşınma Biçimi

Aynı şema iki yoldan gidebilir: istemin içinde bir cümle olarak, ya da isteğin bir alanı olarak. İlkinde şema modelin okuduğu metnin parçasıdır ve her alan için birkaç belirteç eder; ikincisinde yalnız alan adları taşınır ve üretim kısıtlanır.

# BENZETICI -- KURGUDUR. Gercek bir uc nokta cagrilmaz; ag katmani da benzeticide.
TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE, EN_UZUN, HIZ = 480, 60, 37


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 parcala(m):
    """KURGU belirtecleyici; parca en cok bes damga."""
    b = []
    for s in m.lower().replace(",", " , ").split():
        yeni = True
        while len(s) > 5:
            b.append((s[:5], yeni))
            s, yeni = s[5:], False
        b.append((s, yeni))
    return b


def belirtecle(m):
    return [p for p, _ in parcala(m)]


def birlestir(pl):
    s = ""
    for p, yeni in pl:
        s += (" " if yeni and s else "") + p
    return s


def izno(m):
    h = 2166136261
    for c in m:
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


def cekilis(istem, tohum, tuz):
    return uretec((tohum + tuz) ^ izno(istem))()


KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"]
IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura", "borc": "fatura",
      "ariza": "ariza", "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza",
      "sayac": "sayac", "endek": "sayac", "okuma": "sayac", "rande": "sayac",
      "tarif": "tarife", "birim": "tarife", "abone": "tarife", "basam": "tarife",
      "kesin": "kesinti", "duyur": "kesinti", "mahal": "kesinti"}
TUZAK = {"degis": "tarife", "kayit": "ariza", "ekip": "kesinti", "takip": "tarife"}
ALANLAR = [("talep_no", "sayi"), ("konu", KONU),
           ("oncelik", ["dusuk", "orta", "yuksek"]),
           ("aksiyon", ["kayit", "yonlendirme", "bilgi"]), ("abone_no", "sayi"),
           ("kanal", ["telefon", "uygulama", "web"]), ("bolge_no", "sayi"),
           ("durum", ["acik", "beklemede", "kapali"]), ("sayac_no", "sayi"),
           ("ariza_kodu", "sayi"), ("adim_no", "sayi"), ("kayit_no", "sayi")]
SAYAC = [0]


def duzlestir(mesajlar):
    return " ".join(f"{r} : {i}" for r, i in mesajlar)


def cagir(mesajlar, sema, arayuzle, tohum=TOHUM, sicaklik=0.6):
    """sema arayuzle dayatiliyorsa istek alani olarak tasinir ve uretim disina cikamaz."""
    SAYAC[0] += 1
    istem = duzlestir(mesajlar)
    bel = belirtecle(istem)
    if arayuzle:
        bel = bel + belirtecle(" ".join(sema))    # sema istek alani olarak tasinir
    ilk = 1 + len(bel) // 40
    bos = {"giris": len(bel), "cikis": 0, "yanit": "", "ilk": ilk}
    if len(bel) > PENCERE:
        return dict(bos, durum="baglam_asimi")
    if SAYAC[0] % HIZ == 0:
        return dict(bos, durum="hiz_siniri")
    if len(bel) > 90 and cekilis(istem, tohum, 3) < 0.04:
        return dict(bos, durum="zaman_asimi")
    son = mesajlar[-1][1]                         # kavram yalniz son mesajdan okunur
    p = {k: 0.15 for k in KONU}
    for t in belirtecle(son):
        for tablo, w in ((IZ, 1.0), (TUZAK, 0.6)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    ad = sorted(p)
    from math import exp
    e = [exp(p[a] / sicaklik) for a in ad]
    k = ad[ayrik(cekilis(son, tohum, 5), [x / sum(e) for x in e])]
    no = int(next((x for x in istem.split() if x.isdigit()), "0"))
    alan = []
    for i, (a, kural) in enumerate(sema.items()):
        d = k if kural == KONU else (str(no + i) if kural == "sayi"
                                     else kural[(no + i) % len(kural)])
        if arayuzle or cekilis(istem, tohum, 101 + i) < 0.955:
            alan.append(f"{a}={d}")               # sema disina cikilamaz
        else:                                     # istemle dayatmada uc bozulma
            b = ayrik(cekilis(istem, tohum, 211 + i), [0.34, 0.33, 0.33])
            if b == 1:
                alan.append(f"{a.replace('_', '')}={d}")
            elif b == 2:
                alan.append(f"{a}={'x' + d if kural == 'sayi' else 'acil'}")
    pl, durum = parcala(" ; ".join(alan)), "tamam"
    if len(pl) > EN_UZUN:
        pl, durum = pl[:EN_UZUN], "durduruldu"
    u = cekilis(istem, tohum, 91)                 # ag yaniti yarida keser
    if len(pl) > 3 and u < 0.08:
        pl, durum = pl[:1 + int(u / 0.08 * (len(pl) - 1))], "kesildi"
    return {"durum": durum, "giris": len(bel), "cikis": len(pl),
            "yanit": birlestir(pl), "ilk": ilk}


def dogrula(y, sema):
    """Sema dogrulama yordami Istem Muhendisligi kursunda olculdu; burada sayactir."""
    kayit = {}
    for parca in y.split(" ; "):
        a, _, d = parca.partition("=")
        kayit[a.strip()] = d.strip()
    if sorted(kayit) != sorted(sema):
        return False
    for a, kural in sema.items():
        d = kayit[a]
        if (not d.isdigit()) if kural == "sayi" else (d not in kural):
            return False
    return True


def oku(y, sema):
    for parca in y.split(" ; "):
        a, _, d = parca.partition("=")
        if a.strip() == "konu" and "konu" in sema:
            return d.strip()
    return None


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]})


def tarif(sema):
    """Semanin isteme yazilan hali: alan adlari ve izin verilen degerler."""
    p = [f"{a}=<{'sayi' if k == 'sayi' else '|'.join(k)}>" for a, k in sema.items()]
    return "Yaniti su bicimde yaz : " + " ; ".join(p) + " ."


def istemi(sema, x, arayuzle):
    onek = "" if arayuzle else tarif(sema)
    return [("sistem", "destek kaydi cikaran bir yardimcisin . " + onek),
            ("kullanici", f"Talep {x['no']} : {x['metin']}")]


SEMA4 = dict(ALANLAR[:4])
for arayuzle in (False, True):
    s = cagir(istemi(SEMA4, TALEP[0], arayuzle), SEMA4, arayuzle)
    yol = "arayuzle" if arayuzle else "istemle"
    print(f"{yol:<9} giris {s['giris']:>3}  cikis {s['cikis']:>2}  "
          f"uyum {dogrula(s['yanit'], SEMA4)}  {s['yanit']}")
print("dort alanli semanin tarifi:", len(belirtecle(tarif(SEMA4))),
      "belirtec , istek alani olarak:", len(belirtecle(" ".join(SEMA4))))
print("on iki alanli:", len(belirtecle(tarif(dict(ALANLAR)))), "belirtec ,",
      len(belirtecle(" ".join(dict(ALANLAR)))), "belirtec")
print("ayni istek tohum 20260219 ile ->",
      cagir(istemi(SEMA4, TALEP[0], False), SEMA4, False, TOHUM + 1)["yanit"])
istemle   giris  65  cikis 15  uyum True  talep_no=4001 ; konu=kesinti ; oncelik=orta ; aksiyon=bilgi
arayuzle  giris  37  cikis 15  uyum True  talep_no=4001 ; konu=kesinti ; oncelik=orta ; aksiyon=bilgi
dort alanli semanin tarifi: 35 belirtec , istek alani olarak: 7
on iki alanli: 74 belirtec , 21 belirtec
ayni istek tohum 20260219 ile -> talep_no=4001 ; konu=sayac ; oncelik=orta ; aksiyon=bilgi

İki yol aynı talepte aynı kaydı üretti ve ikisi de doğrulamadan geçti; fark giriş sütunundadır. Dört alanlı şemanın tarifi 35 belirteç, aynı şemanın istek alanı olarak taşınması 7 belirteç. Aradaki oran şema büyüdükçe korunuyor: on iki alanda 74’e karşı 21. Tarif alan adlarını, izin verilen değerleri ve bir yönerge cümlesini taşımak zorundadır; istek alanı yalnız adları taşır ve kuralı arayüz zaten bilir.

Son satır kursun üçüncü kuralının gereğidir: aynı istek ikinci bir tohumda konu alanına başka bir değer yazdı, üstelik o kayıt da şemadan geçerdi.

Altı Kurulumun Uyum ve Bedel Tablosu

Aynı 120 kurgu talep iki dayatma yolunda ve üç şema büyüklüğünde koşturulur.

def olc(n, arayuzle, tohum=TOHUM):
    SAYAC[0] = 0
    sema = dict(ALANLAR[:n])
    g = c = agda = uyan = tamam = tamam_uyan = kayit = 0
    for x in TALEP:
        s = cagir(istemi(sema, x, arayuzle), sema, arayuzle, tohum)
        g, c = g + s["giris"], c + s["cikis"]
        u = dogrula(s["yanit"], sema)
        agda += s["durum"] != "tamam"
        uyan += u
        if s["durum"] == "tamam":
            tamam, tamam_uyan = tamam + 1, tamam_uyan + u
        kayit += u and oku(s["yanit"], sema) == x["konu"]
    return g, c, agda, uyan / 120, tamam_uyan / tamam, kayit / 120


print("kip       alan  giris  cikis  agda  uyum A  uyum B  agsiz uyum  dogru kayit")
for arayuzle in (False, True):
    for n in (4, 8, 12):
        a, b = olc(n, arayuzle), olc(n, arayuzle, TOHUM + 1)
        print(f"{'arayuzle' if arayuzle else 'istemle':<9} {n:>4} {a[0]:>6} {a[1]:>6}"
              f" {a[2]:>5}  {a[3]:>6.4f}  {b[3]:>6.4f}  {a[4]:>10.4f}  {a[5]:>11.4f}")

for n in (4, 12):
    i, y = olc(n, False), olc(n, True)
    print(f"\n{n} alan : arayuz {i[0] - y[0]} giris belirteci tasarruf ediyor ,"
          f" uyum farki {y[3] - i[3]:.4f} ,"
          f" dogru kayit basina belirtec {(i[0] + i[1]) / (i[5] * 120):.1f}"
          f" -> {(y[0] + y[1]) / (y[5] * 120):.1f}")
kip       alan  giris  cikis  agda  uyum A  uyum B  agsiz uyum  dogru kayit
istemle      4   7654   1658    11  0.7583  0.8167      0.8349       0.6167
istemle      8  10294   3361    14  0.7250  0.7333      0.8208       0.6000
istemle     12  12334   4894    16  0.6083  0.5583      0.7019       0.5000
arayuzle     4   4294   1688    12  0.9000  0.9167      1.0000       0.7583
arayuzle     8   5014   3417    12  0.9000  0.9167      1.0000       0.7583
arayuzle    12   5974   5219    12  0.9000  0.9167      1.0000       0.7583

4 alan : arayuz 3360 giris belirteci tasarruf ediyor , uyum farki 0.1417 , dogru kayit basina belirtec 125.8 -> 65.7

12 alan : arayuz 6360 giris belirteci tasarruf ediyor , uyum farki 0.2917 , dogru kayit basina belirtec 287.1 -> 123.0

İstemle dayatma satırları şema büyüdükçe aşağı iner: uyum 0,7583, sonra 0,7250, sonra 0,6083. Nedeni yapısaldır. Her alan bağımsız bir çekilişe bağlıysa, bütün alanların birden doğru olma olasılığı alan sayısıyla üstel olarak düşer; dört alanda ödenen küçük risk on iki alanda ödenmez bir hâle gelir. Arayüzle dayatma satırları ise üç büyüklükte de 0,9000’da duruyor. Şema büyüdü, uyum değişmedi.

Giriş sütunu aynı ayrışmayı bedelde gösteriyor. İstemle dayatma 7654’ten 12334 belirtece çıkarken arayüzle dayatma 4294’ten 5974‘e çıkıyor; tasarruf dört alanda 3360, on iki alanda 6360 belirteç. Çıkış sütunu ise iki kipte de büyüyor (1688’den 5219’a), çünkü kayıt gerçekten uzuyor. On iki alanda arayüzle dayatmanın çıkışı istemle dayatmanınkinden fazladır: 5219’a karşı 4894. Bunun nedeni bozulan alanların atlanmasıdır; eksik kayıt daha kısadır.

Ağsız Uyum ve Ağın Payı

Tablonun en önemli sütunu ağsız uyumdur. Arayüzle dayatmada bu sütun üç satırda da tam 1,0000’dır. İstem Mühendisliği kursunun ölçtüğü sayı budur ve burada aynen çıkıyor: üretim şemanın dışına çıkamıyorsa, tamamlanan her yanıt şemaya uyar.

Aynı satırların uyum sütunu ise 0,9000‘dır. Aradaki 0,1000, modelin değil ağın payıdır: 120 çağrının 12’si hız sınırına, zaman aşımına ya da yarıda kesilmeye takılıyor ve yarım bir kayıt şemadan geçmiyor. Kursun kuralı burada doğrudan görünür hâle gelir. Bir işlev çağrısı olarak ölçüldüğünde şema zorunluluğunun uyumu 1,0000’dır; bir ağ işlemi olarak ölçüldüğünde 0,9000. Başarısızlığı yazılmayan çağrı ölçülmemiş sayılır, ve aradaki fark tam olarak yazılmayan o başarısızlıktır.

İki koşum farkı en çok 0,0583‘tür (istemle dayatma, dört alan). Arayüzün dört alandaki kazancı 0,1417, on iki alandaki kazancı 0,2917; ikisi de bu farkın üstünde ve ölçülmüştür. Doğru kayıt başına belirteç dört alanda **125,8’den 65,7’ye**, on iki alanda 287,1’den 123,0’a iniyor.

Son sütun bir uyarı taşıyor. Arayüzle dayatmada doğru kayıt oranı üç büyüklükte de 0,7583’te sabit; uyum 0,9000 ile arasındaki 0,1417, şemadan geçen ama konusu yanlış olan kayıtlardır. Alan eklemek çıkış belirtecini üç katına çıkardı ve doğru kayıt oranını hiç değiştirmedi. Biçimin garantisi içeriğin garantisi değildir; bu ayrım İstem Mühendisliği kursunda ölçüldü ve burada bir kez daha, arayüz düzeyinde, aynı yerde duruyor.

Özet

  • Aynı şemanın isteme yazılan tarifi dört alanda 35, on iki alanda 74 belirteç eder; istek alanı olarak taşınan biçimi 7 ve 21 belirteçtir.
  • İstemle dayatmanın uyumu şema büyüdükçe 0,7583’ten 0,6083’e iner, çünkü her alan bağımsız bir risktir; arayüzle dayatma üç büyüklükte de 0,9000’da kalır.
  • Giriş belirteci istemle 7654’ten 12334’e, arayüzle 4294’ten 5974’e çıkar; tasarruf dört alanda 3360, on iki alanda 6360 belirteçtir.
  • Arayüzle dayatmanın ağsız uyumu tam 1,0000’dır; ağ hesaba katıldığında 0,9000’e iner ve aradaki 0,1000 modelin değil ağın payıdır.
  • Doğru kayıt başına belirteç dört alanda 125,8’den 65,7’ye, on iki alanda 287,1’den 123,0’a düşer; iki koşum farkı en çok 0,0583 olduğu için bu kazançlar ölçülmüştür.
  • Alan eklemek çıkış belirtecini 1688’den 5219’a çıkarır ama doğru kayıt oranını 0,7583’te sabit bırakır: biçim garantisi içerik garantisi değildir.

Sonraki Adım

Dört derste arayüzün dört yeteneği ölçüldü ve her birinin bedeli belirteçle yazıldı: konuşma durumunun taşınması, yanıtın parça parça alınması, çıktının bir çağrıya bağlanması ve çıktının bir şemaya oturtulması. Dördünün ortak bir varsayımı vardı ve hiç sorgulanmadı: girdi hep metindi. Talep bir cümleydi, durum bir dökümdü, şema bir alan listesiydi ve hepsi aynı belirteçleyiciden geçti.

Bir destek talebinin yanında bir sayaç fotoğrafı, bir sesli mesaj ya da bir kısa görüntü geldiğinde bu sayıların hiçbiri olduğu gibi kalmaz. Aynı bilgi metin olarak da verilebiliyorsa hangisi kaç belirteç ediyor, ve biçim değiştiğinde isabet ne oluyor. Sonraki ders girdinin biçimini bir değişken hâline getirir ve bedelini aynı ölçekte sayar.

İ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