---
title: 'Yapılandırılmış Çıktı Kipi'
source: 'https://academia.sh/tr/kurslar/model-apileri/yapilandirilmis-cikti-kipi'
course: "Model API'leri ile Uygulama Geliştirme"
language: tr
updated: '2026-08-17T18:06:38+00:00'
license: 'CC BY-SA 4.0'
---

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

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

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

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