Ders 19 / 22
Yapılandırılmış Çıktı
Serbest metin, isteme yazılmış biçim tarifi ve şema dayatmasının aynı 120 kurgu talepte yan yana ölçülmesi: serbest metinde şemaya uyan yanıt oranı 0,0000, biçim tarifiyle 0,8000, örnek eklendiğinde 0,8833, şema dayatmasıyla 1,0000. Biçim tarifi satırının iki koşum farkı 0,0833'tür ve örnek eklemenin kattığı fark da 0,0833 olduğu için o kazanç ölçülmemiş sayılır, üstelik 2040 belirteç ekler. Konu isabeti dört düzeyde de 0,8833'te sabit kalıyor. Giriş belirteci 2254'ten biçim tarifiyle 5614'e, örnekle 7654'e çıkarken şema dayatması 2974'te kalıyor, yani en yüksek uyumu en ucuz istem veriyor.
İçindekiler
Önceki iki ders yanıtın hangi kavramı seçtiğini ve nerede bittiğini düzenledi. Yanıtın kendisi hâlâ bir cümleydi: etiketin kaçıncı sözcükte geçtiği, yanında hangi ifadenin bulunduğu ve bir kayıt alanının nereden okunacağı her seferinde başkaydı.
Bir destek yardımcısının çıktısı bir insana değil bir kayıt sistemine gidiyorsa, cümle kullanılamaz. Gereken şey belirli alanların belirli değerlerle dolu olduğu bir kayıttır. Bu ders o kaydı üç düzeyde ister — serbest metin, isteme yazılmış biçim tarifi, ve üretimi kısıtlayan şema dayatması — ve üçünün şemaya uyan yanıt oranını belirteç bedeliyle yan yana basar.
- CD17. Kod bir benzeticidir; gerçek bir uç nokta çağrılmaz. Talepler, alanlar ve değer kümeleri kurgudur, tohum 20260218.
- CD18. Şema dört alandır: sayı olması gereken bir talep numarası ve üçü kapalı değer kümesinden gelen konu, öncelik ve aksiyon. Talep numarası isteme yazılır, yani model onu uydurmak zorunda değildir.
- CD19. Şema doğrulayıcısı ders içinde yazılır; dışarıdan hiçbir şema kitaplığı kullanılmaz. Dört hata sınıfı sayılır: ayrıştırılamadı, eksik anahtar, fazladan anahtar, geçersiz değer.
- CD20. Biçim tarifi bir eğilimdir, bir garanti değildir. Benzetici, istemde biçim tarifi görürse yanıtın bir payını tarife uygun üretir; kalan pay beş bozuk biçimden birine düşer. Beşincisi şemadan geçer: alanlar yerindedir ama talep numarası kayıtlı olmayan bir sayıdır.
- CD21. Şema dayatması bir kısıttır. Bu kipte üretim şemanın dışına çıkamaz; alanlar eksiksiz ve değerler kapalı kümedendir.
- CD22. Benzeticideki her karar ayrı tuzlanmış tek bir çekilişten gelir; kararlar birbirine bağlanmaz. Konu seçimi yalnız talep metninden okunur, böylece biçim düzeyleri arasında yalnız biçim değişir.
- CD23. Kaydedilebilir doğru kayıt, hem şemaya uyan hem konusu doğru olan yanıttır; bu dersin ürün ölçütü budur.
- CD24. Bedel giriş ve çıkış belirteci olarak yazılır; çağrı sayısı üç düzeyde de talep başına birdir.
Şema, Ayrıştırıcı ve Doğrulayıcı
Şema doğrulaması M16’nın API sözleşmesi kursunda ve M24’te ölçüldü; yordamı burada tekrarlanmaz. Eklenen tek şey üreticinin kimliğidir: doğrulanan kayıt bir istemciden değil, belirsiz bir bileşenden geliyor. Bu yüzden doğrulayıcı bir güvenlik kapısı değil, bir ölçüm aracıdır: kaç yanıtın hangi sınıfta düştüğünü sayar.
# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz. Sema dogrulamasi # da ders icinde yazilir; disaridan hicbir sema kitapligi kullanilmaz. TOHUM, M32 = 20260218, 0xFFFFFFFF 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"] ONCELIK, AKSIYON = ["dusuk", "orta", "yuksek"], ["kayit", "yonlendirme", "bilgi"] SEMA = {"talep_no": "sayi", "konu": KONU, "oncelik": ONCELIK, "aksiyon": AKSIYON} 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"} TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura", "ekip": "kesinti", "takip": "tarife", "giril": "fatura"} # yaniltici baglar SAYAC = [0] def ayristir(metin): """Anahtar=deger cifti ayristirici. Ayrilamayan yanit icin None doner.""" if "=" not in metin: return None kayit = {} for parca in metin.split(";"): if "=" not in parca: return None a, _, d = parca.partition("=") kayit[a.strip()] = d.strip() return kayit def dogrula(kayit): """Sema dogrulama: eksik anahtar, fazladan anahtar, gecersiz deger.""" if kayit is None: return ["ayristirilamadi"] hata = [f"eksik:{a}" for a in SEMA if a not in kayit] hata += [f"fazla:{a}" for a in kayit if a not in SEMA] for a, kural in SEMA.items(): if a not in kayit: continue d = kayit[a] if kural == "sayi" and not d.isdigit(): hata.append(f"sayi_degil:{a}") elif kural != "sayi" and d not in kural: hata.append(f"gecersiz:{a}") return hata def cekilis(istem, tohum, tuz): """Her karar icin ayri tuzlanmis tek cekilis; kararlar birbirine baglanmaz.""" return uretec((tohum + tuz) ^ izno(istem))() def cagir(istem, talep, kip, tohum=TOHUM): """kip: serbest | tarif | sema. Sema kipinde uretim sema disina cikamaz.""" SAYAC[0] += 1 bel = belirtecle(istem) p = {k: 0.15 for k in KONU} for t in belirtecle(talep["metin"]): # konu yalniz talep metninden okunur for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)): if tablo.get(t) in p: p[tablo[t]] += w k = max(sorted(p), key=lambda a: p[a]) o = ONCELIK[ayrik(cekilis(istem, tohum, 11), [0.31, 0.44, 0.25])] a = AKSIYON[ayrik(cekilis(istem, tohum, 29), [0.46, 0.32, 0.22])] duz = f"talep_no={talep['no']} ; konu={k} ; oncelik={o} ; aksiyon={a}" if kip == "sema": # sema dayatmasi return duz, k if kip == "serbest": return f"talebiniz {k} konusunda kaydedildi ve {a} adimi baslatildi", k egilim = 0.62 if "bicim" in bel else 0.0 # istemdeki bicim tarifi if "ornek" in bel: egilim += 0.22 if cekilis(istem, tohum, 53) < egilim: return duz, k bozuk = ayrik(cekilis(istem, tohum, 71), # tarife uymayan yanit [0.22, 0.20, 0.18, 0.16, 0.24]) if bozuk == 0: return f"talebiniz {k} konusunda kaydedildi ve {a} adimi baslatildi", k if bozuk == 1: return f"talep_no={talep['no']} ; konu={k} ; aksiyon={a}", k if bozuk == 2: return f"talep_no={talep['no']} ; konu={k} ; oncelik=acil ; aksiyon={a}", k if bozuk == 3: return f"talep_no=TL{talep['no']} ; konu={k} ; oncelik={o} ; aksiyon={a}", k return f"talep_no={talep['no'] + 500} ; konu={k} ; oncelik={o} ; aksiyon={a}", k TARIF = ("Yaniti su bicimde yaz: talep_no=<sayi> ; konu=<fatura|ariza|sayac|" "tarife|kesinti> ; oncelik=<dusuk|orta|yuksek> ; aksiyon=<kayit|" "yonlendirme|bilgi> . ") def istemi(onek, x): return onek + f"Talep {x['no']} : {x['metin']}" print("sema anahtarlari:", " , ".join(SEMA)) for kip, onek in (("serbest", "Su talebi yanitla . "), ("tarif", TARIF), ("sema", "Sema: talep_no ; konu ; oncelik ; aksiyon . ")): y, _ = cagir(istemi(onek, TALEP[0]), TALEP[0], kip) h = dogrula(ayristir(y)) print(f"kip {kip:<8} {y}") print(f" hata {h if h else 'yok'}") print("\nbicim tarifi kipinde ilk dort dogrulama hatasi:") n = 0 for x in TALEP: y, _ = cagir(istemi(TARIF, x), x, "tarif") h = dogrula(ayristir(y)) if h and n < 4: n += 1 print(f" {h[0]:<22} {y[:52]}")
sema anahtarlari: talep_no , konu , oncelik , aksiyon
kip serbest talebiniz kesinti konusunda kaydedildi ve yonlendirme adimi baslatildi
hata ['ayristirilamadi']
kip tarif talep_no=TL4001 ; konu=kesinti ; oncelik=orta ; aksiyon=kayit
hata ['sayi_degil:talep_no']
kip sema talep_no=4001 ; konu=kesinti ; oncelik=orta ; aksiyon=bilgi
hata yok
bicim tarifi kipinde ilk dort dogrulama hatasi:
sayi_degil:talep_no talep_no=TL4001 ; konu=kesinti ; oncelik=orta ; aksi
gecersiz:oncelik talep_no=4009 ; konu=sayac ; oncelik=acil ; aksiyon=
ayristirilamadi talebiniz kesinti konusunda kaydedildi ve yonlendirm
sayi_degil:talep_no talep_no=TL4032 ; konu=tarife ; oncelik=orta ; aksiy
Üç kipin aynı talepte ürettiği çıktı, aradaki farkın nerede olduğunu gösteriyor. Serbest metnin
içinde doğru konu var (kesinti) ama kayıt alanı yok; ayrıştırıcı hiçbir şey bulamıyor. Biçim
tarifi kipinde yanıt neredeyse doğru: dört alan da yerinde, ama talep numarasının başına iki harf
gelmiş ve alan artık sayı değil. Kayıt sistemi bu satırı reddeder, üstelik yanıtın içeriği
tamamen doğrudur.
Dört hata örneği bozulmanın nerede olduğunu da söylüyor: bir alan sayı olmadığı için, biri kapalı kümenin dışında bir değer taşıdığı için, biri hiç ayrıştırılamadığı için düşüyor. Hepsi biçim hatasıdır ve hiçbiri konu hatası değildir.
Üç Düzeyin Uyum ve Bedel Tablosu
Aynı 120 talep dört istemle koşturulur. İlk üçü isteme yazarak ister, sonuncusu üretimi kısıtlar. İkinci koşum tohum 20260219 ile alınır ve şemaya uyan oran onun için ayrıca basılır.
ORNEK = "Ornek: talep_no=4000 ; konu=ariza ; oncelik=orta ; aksiyon=kayit . " DUZEY = [("serbest metin", "serbest", "Su talebi yanitla . "), ("bicim tarifi", "tarif", TARIF), ("bicim tarifi + ornek", "tarif", TARIF + ORNEK), ("sema dayatmasi", "sema", "Sema: talep_no ; konu ; oncelik ; aksiyon . ")] def konuyu_oku(y, kayit): if kayit and "konu" in kayit: return kayit["konu"] return next((s for s in y.split() if s in KONU), None) def olc(kip, onek, tohum=TOHUM): SAYAC[0] = 0 ayr = uy = isb = kay = g = c = 0 sayim = {} for x in TALEP: istem = istemi(onek, x) y, _ = cagir(istem, x, kip, tohum) kayit = ayristir(y) h = dogrula(kayit) ayr += kayit is not None uy += not h d = konuyu_oku(y, kayit) == x["konu"] isb += d kay += d and not h for e in h: sayim[e.split(":")[0]] = sayim.get(e.split(":")[0], 0) + 1 g += len(belirtecle(istem)) c += len(belirtecle(y)) return (ayr / 120, uy / 120, isb / 120, kay / 120, g, c, sayim) print("duzey ayristirilabilir uyan A uyan B konu isabeti" " kaydedilebilir giris cikis") for ad, kip, onek in DUZEY: a, b = olc(kip, onek), olc(kip, onek, TOHUM + 1) print(f"{ad:<21} {a[0]:>16.4f} {a[1]:>6.4f} {b[1]:>6.4f} {a[2]:>12.4f}" f" {a[3]:>14.4f} {a[4]:>5} {a[5]:>5}") for ad, kip, onek in DUZEY[1:3]: print(f"{ad:<21} hata dagilimi {dict(sorted(olc(kip, onek)[6].items()))}")
duzey ayristirilabilir uyan A uyan B konu isabeti kaydedilebilir giris cikis
serbest metin 0.0000 0.0000 0.0000 0.8833 0.0000 2254 1614
bicim tarifi 0.9333 0.8000 0.7167 0.8833 0.7000 5614 1789
bicim tarifi + ornek 0.9667 0.8833 0.8667 0.8833 0.7750 7654 1789
sema dayatmasi 1.0000 1.0000 1.0000 0.8833 0.8833 2974 1810
bicim tarifi hata dagilimi {'ayristirilamadi': 8, 'eksik': 1, 'gecersiz': 9, 'sayi_degil': 6}
bicim tarifi + ornek hata dagilimi {'ayristirilamadi': 4, 'eksik': 5, 'gecersiz': 2, 'sayi_degil': 3}
İlk satır kayıt sistemi açısından tam bir kayıptır. Serbest metnin konu isabeti 0,8833, yani yanıtların yaklaşık dokuzda sekizi doğru konuyu söylüyor. Kaydedilebilir doğru kayıt oranı ise 0,0000. Doğru bilgi üretildi ve okunamadığı için yok sayıldı. Bu, biçim denetiminin niçin bir süsleme değil bir ölçüt olduğunu gösteren en açık satırdır.
İkinci satır isteme yazmanın kısmi kazancıdır: ayrıştırılabilir yanıt 0,9333, ama şemaya uyan 0,8000. Aradaki 0,1333 tamamen ayrıştırılabilen fakat doğrulamayı geçemeyen yanıtlardır: dokuzunda öncelik kapalı kümenin dışında, altısında talep numarası sayı değil, birinde bir alan eksik. Ayrıştırılabilirlik ile geçerlilik aynı şey değildir ve tek sayıyla ölçülemez.
Ölçülemeyen Kazanç ve Bedelin Ters Yönü
Üçüncü satır sezgiye en uygun olan ve tabloda en zayıf duran satırdır. Örnek eklemek uyumu 0,8000’den 0,8833’e çıkarıyor; kazanç 0,0833. Aynı satırın iki koşum sütununa bakmak gerekiyor: biçim tarifi ikinci tohumda 0,7167 veriyor, yani o satırın iki koşum farkı da 0,0833. Kazanç, farktan büyük değil. Kursun kuralı burada doğrudan uygulanır: bir istem değişikliğinin kattığı fark iki koşum farkını aşmıyorsa ölçülmemiş sayılır. Örnek eklemek işe yaramış olabilir, ama bu tablo onu göstermiyor.
Aynı değişikliğin bedeli ise kesindir. Giriş belirteci 5614’ten 7654’e çıkıyor: talep başına on yedi, toplamda 2040 belirteç. Ölçülemeyen bir kazanç için ödenen ölçülebilir bir bedel, bu kursun ikinci iddiasının tam karşılığıdır.
Dördüncü satır bunun tersidir. Şema dayatması uyumu 1,0000’a çıkarıyor; tabana göre kazanç 0,2000, yani iki koşum farkının iki buçuk katı. Bedel sütunu daha da şaşırtıcıdır: giriş belirteci 2974’te kalıyor. Biçim tarifinin yarısından az, örnekli tarifin üçte biri kadar. Çünkü şema isteme uzun uzun anlatılmıyor, alan adlarıyla kısaca bildiriliyor ve asıl iş üretimin kısıtlanmasında yapılıyor. En yüksek uyumu en ucuz istem veriyor. Çıkış belirteci ise dört düzeyde birbirine yakındır (1614 ile 1810 arası), çünkü çıktının uzunluğu değil biçimi değişiyor.
Son olarak konu isabeti sütunu dört satırda da 0,8833’te sabittir ve bu tesadüf değildir. Şema dayatması yanıtın biçimini garanti eder, içeriğini değil. On dört talep hâlâ yanlış konuya atanıyor ve bu yanlış konu artık kusursuz biçimli bir kayıt içinde, geçerli bir değer olarak duruyor. Geçerlilik doğruluk değildir; şemadan geçen bir kayıt yanlış olabilir. Nitekim biçim tarifi satırında şemadan geçen kayıtların on üçü, isteme yazılan numaranın yerine kayıtlı olmayan bir talep numarası taşıyor ve doğrulayıcı bunların hiçbirini görmüyor.
Özet
- Şema dört alandır ve doğrulayıcısı ders içinde standart kitaplıkla yazılır; hata sınıfları ayrı ayrı sayılır.
- Serbest metinde konu isabeti 0,8833 iken kaydedilebilir doğru kayıt oranı 0,0000’dır: doğru bilgi okunamadığı için yok sayılır.
- Biçim tarifi uyumu 0,8000’e çıkarır; ayrıştırılabilirlik (0,9333) ile şemaya uygunluk aynı şey değildir.
- Örnek eklemek uyumu 0,8833’e çıkarır ama kazanç 0,0833, biçim tarifi satırının iki koşum farkı da 0,0833’tür: kazanç ölçülmemiş sayılır ve karşılığında 2040 belirteç ödenir.
- Şema dayatması uyumu 1,0000’a çıkarır ve bunu 2974 giriş belirteciyle yapar; en yüksek uyumu en ucuz istem veriyor.
- Konu isabeti dört düzeyde de 0,8833’te sabittir ve şemadan geçen on üç kayıt kayıtlı olmayan bir talep numarası taşır: şema biçimi garanti eder, içeriği değil.
Sonraki Adım
Bu derste doğrulayıcı yalnız bir sayaç olarak kullanıldı: kaç yanıtın düştüğünü saydı ve düşen yanıtlar atıldı. Bir üretim hattında atmak bir seçenek değildir; düşen kayıt ya kurtarılır ya da elle işlenir. Üstelik son paragrafta görülen sorun hiç ele alınmadı: şemadan geçen bir kayıt iş kurallarına aykırı olabilir ve kayıtlı olmayan bir talep numarası bunun en açık örneğidir. Sonraki ders iki denetimi ayrı ayrı sayar ve üzerine bir yeniden deneme döngüsü kurar: kaç yanıt şemaya uymuyor, kaçı iş kuralına takılıyor, yeniden deneme bunların kaçını kurtarıyor ve bu kurtarma kaç ek çağrıya mal oluyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.