---
title: 'Yapılandırılmış Çıktı'
source: 'https://academia.sh/tr/kurslar/istem-muhendisligi/yapilandirilmis-cikti'
course: 'İstem Mühendisliği'
language: tr
updated: '2026-08-17T18:06:38+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

Ö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.

```python
# 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.

```python
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.
