---
title: 'Belirsizlik ve Yeniden Üretilebilirlik'
source: 'https://academia.sh/tr/kurslar/model-apileri/belirsizlik-ve-yeniden-uretilebilirlik'
course: "Model API'leri ile Uygulama Geliştirme"
language: tr
updated: '2026-08-17T18:06:37+00:00'
license: 'CC BY-SA 4.0'
---

# Belirsizlik ve Yeniden Üretilebilirlik

Bir model çağrısının çıktısını belirleyen kalemlerin sayılması ve her birinin tek başına serbest bırakılması: on iki kalemin 11'i yanıtları oynatıyor, en büyük oynama yönergenin biçim sözcüğünde (bütün yanıtlar değişiyor, isabet 0,9125'ten 0,5525'e iniyor). Anlamı hiç değiştirmeyen boşluk düzeni yanıtların 0,0700'ünü, istemci normalleştirmesi 0,1300'ünü oynatıyor. Tek başına hiçbir şey oynatmayan en büyük çıktı uzunluğu, yönerge sözcüğüyle birlikte serbest bırakıldığında isabeti 0,5525'ten 0,2675'e indiriyor. Kalemlerin 9'u istemcide, 3'ü sağlayıcıdadır ve üçü birlikte serbest kaldığında yanıtların 0,1150'si oynuyor, isabet 0,0200 düşüyor: önceki iki dersin eşiği budur.

Önceki iki derste bir eşik tekrar tekrar kullanıldı: iki koşum arasındaki fark. Maliyet defterinde
0,0200 çıktı, kesinti tablosunda yine 0,0200 çıktı, ve bu sayının altında kalan her kazanç
ölçülmemiş sayıldı. Eşiğin kendisi hiç sorulmadı. Aynı kod, aynı iş yükü ve aynı istem iki koşumda
niçin iki ayrı sayı veriyor.

Sorunun bir bölümü daha önce kapandı. Görselleştirme, Raporlama ve Ölçekli Analiz kursu bir
raporun yeniden üretilmesini elli dokuz kalem olarak yazdı: hazırlama defterinin otuz dokuz
kararı, çalışma ortamının dokuz kalemi ve raporun kendi on bir kalemi. Derin Öğrenme kursu aynı hesabı bir eğitim
için yaptı, eğitime özgü sekiz kalemi ekledi ve altmış yediye çıkardı. Bu hesap burada
tekrarlanmaz. Eklenen soru şudur: bir **model çağrısının** kendi kalemleri nelerdir ve kaçı bizim
elimizdedir.

- **UK45.** Kod bir **benzeticidir**; gerçek bir uç nokta çağrılmaz. Talepler, konuşmalar ve
  belgeler **kurgudur**, tohum **20260218**.
- **UK46.** İş yükü önceki iki dersinkiyle aynıdır: 154 kurgu konuşmadan gelen 400 istek.
- **UK47. Kalem**, çağrının çıktısını belirleyebilecek ve koşumdan koşuma taşınması gereken her
  karardır. Her kalem **eşit ölçüde savunulabilir** bir alternatife geçirilir; yanlış bir değere
  değil.
- **UK48.** İki ölçü basılır: **değişen yanıt payı** (400 yanıttan kaçı taban koşumdakinden farklı)
  ve **isabet**. İkisi ayrı şeylerdir.
- **UK49. Kalemler iki tarafa ayrılır.** Dokuzu istemcide, üçü sağlayıcıdadır. Sağlayıcı kalemleri
  benzeticide sabitlenebilir ama gerçek bir uç noktada sabitlenemez; bu derste **sabitlenemez**
  sayılırlar.
- **UK50.** Devralınan kalemler: hazırlama defterinin **39** kararı ve çalışma ortamının **9**
  kalemi. Eğitime özgü sekiz kalem devralınmaz, çünkü model verilmiştir ve eğitilmez.
- **UK51.** Yönergenin biçim sözcüğü kalemi listenin uç noktasıdır: benzetici yanıtın biçimini
  istemdeki `tek` sözcüğüne bağlar. Bu, biçim uyumunun **yüzey sözcüğüne** bağlı olmasının
  modellenmiş hâlidir.
- **UK52.** Sağlayıcının sürüm değişikliği, iz tablosuna iki girdi eklenmesiyle modellenir.

## Bir Çağrının Kalemleri

```python
# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz; talepler, konusmalar
# ve belgeler kurgudur, tohum 20260218.
import math
TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE = 240


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"]
KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"]
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"]}
IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura", "borc": "odeme",
      "odedi": "odeme", "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",
      "yardi": "bilgi", "nered": "bilgi", "kayit": "sikayet", "bekle": "sikayet"}
SERBEST = ["talebiniz {k} konusunda kaydedildi ve ekibe iletildi",
           "{k} ile ilgili kaydiniz olusturuldu en kisa surede donulecek",
           "kaydiniz alindi ilgili birim sizinle iletisime gececek"]
SAYAC = [0]


def oku(y):
    return next((s for s in y.split() if s in KONU), None)


BELGE = ["TR1 tarife basamaklari abone tipine gore belirlenir ve yilda bir guncellenir",
         "FT2 fatura itirazi kayit acildiktan sonra on is gunu icinde sonuclanir",
         "SY3 sayac degisimi randevusu saha ekibinin bolge programina baglidir",
         "AR4 ariza kaydi acilan adreste ekip ayni gun icinde yonlendirilir",
         "KS5 planli kesinti duyurulari bir hafta once ilan panosuna asilir"]
KONUS, i = [], 0
while sum(len(c["tur"]) for c in KONUS) < 400:      # KURGU is yuku: konusmalar
    r = uretec(TOHUM + 900 + i)
    i += 1
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    u = [1, 2, 3, 5, 8, 12][ayrik(r(), [0.46, 0.24, 0.14, 0.09, 0.05, 0.02])]
    KONUS.append({"no": i, "belge": ayrik(r(), [0.74, 0.16, 0.07, 0.03]),
                  "tur": [{"konu": k, "metin": KALIP[k][(i + t) % 3]} for t in range(u)]})
ISTEK = [{"kon": c, "sira": t, "talep": c["tur"][t]}
         for c in KONUS for t in range(len(c["tur"]))][:400]
VAR = dict(tohum=TOHUM, sicaklik=0.6, en_uzun=24, soz="tek", etiket="kurgu",
           bosluk="tek", durum="tam", parca="belge sonra", normal="ham",
           deneme=3, iz="surum a", esik=37)
IZ_B = dict(IZ, gecen="fatura", ekip="kesinti")     # saglayicinin surum degisikligi


def cagir3(istem, a):
    """Ayar sozlugu ile cagri: her kalem ayri bir anahtardir."""
    SAYAC[0] += 1
    bel = belirtecle(istem)
    if len(bel) > PENCERE:
        return {"durum": "baglam_asimi", "yanit": ""}
    if SAYAC[0] % a["esik"] == 0:
        return {"durum": "hiz_siniri", "yanit": ""}
    r = uretec(a["tohum"] ^ izno(istem))
    if len(bel) > 90 and r() < 0.04:
        return {"durum": "zaman_asimi", "yanit": ""}
    iz = IZ if a["iz"] == "surum a" else IZ_B
    aday = [k for k in KAVRAM if k[:5] in bel]
    p = {k: 0.15 for k in (aday if len(aday) >= 3 else KAVRAM)}
    for t in bel:
        if iz.get(t) in p:
            p[iz[t]] += 1.0
    w = [math.exp(p[q] / a["sicaklik"]) for q in sorted(p)]
    k = sorted(p)[ayrik(r(), [x / sum(w) for x in w])]
    y = k if "tek" in bel else SERBEST[int(r() * 3)].format(k=k)
    cb = belirtecle(y)
    return {"durum": "tamam",
            "yanit": " ".join(cb[:a["en_uzun"]]) if len(cb) > a["en_uzun"] else y}


def istem_kur(x, a):
    et = KONU if a["etiket"] == "kurgu" else sorted(KONU)
    yon = ("Talebi su etiketlerden birine ata: " + " , ".join(et) + " . Yanit olarak "
           + ("tek" if a["soz"] == "tek" else "yalnizca") + " etiket yaz . Talep: ")
    t = x["kon"]["tur"][:x["sira"]]
    g = "".join(f"Onceki: {o['metin']} Yanit: {o['konu']} . "
                for o in (t[-2:] if a["durum"] == "iki tur" else t))
    b = "".join(BELGE[(x["kon"]["no"] + j) % 5] + " . " for j in range(x["kon"]["belge"]))
    s = yon + (b + g if a["parca"] == "belge once" else g + b) + x["talep"]["metin"]
    if a["bosluk"] == "cift":
        s = s.replace(" ", "  ")
    if a["normal"] == "sadelesmis":
        s = " ".join(s.lower().split())
    return s


def kos(**d):
    a = dict(VAR, **d)
    SAYAC[0] = 0
    cikti = []
    for x in ISTEK:
        ist = istem_kur(x, a)
        for i in range(a["deneme"]):
            s = cagir3(ist, dict(a, tohum=a["tohum"] + i))
            if s["durum"] == "tamam":
                break
        cikti.append(s["yanit"])
    return cikti


def isabet(c):
    return sum(oku(y) == x["talep"]["konu"] for y, x in zip(c, ISTEK)) / 400


def degisen(c, ref):
    return sum(a != b for a, b in zip(ref, c)) / 400


KALEM = [("saglayici", "ornekleme durumu", dict(tohum=TOHUM + 1)),
         ("saglayici", "model surumu", dict(iz="surum b")),
         ("saglayici", "hiz siniri esigi", dict(esik=31)),
         ("istemci", "dagilim sicakligi", dict(sicaklik=0.8)),
         ("istemci", "en buyuk cikti uzunlugu", dict(en_uzun=10)),
         ("istemci", "yonerge bicim sozcugu", dict(soz="yalnizca")),
         ("istemci", "etiket kumesi sirasi", dict(etiket="alfabetik")),
         ("istemci", "bosluk duzeni", dict(bosluk="cift")),
         ("istemci", "konusma durumu", dict(durum="iki tur")),
         ("istemci", "baglam parcasi sirasi", dict(parca="belge once")),
         ("istemci", "istemci normallestirmesi", dict(normal="sadelesmis")),
         ("istemci", "yeniden deneme sayisi", dict(deneme=1))]
REF = kos()
print("taban isabet %.4f , kalem sayisi %d" % (isabet(REF), len(KALEM)))
print("taraf      kalem                     degisen  isabet     fark")
for taraf, ad, d in KALEM:
    c = kos(**d)
    print(f"{taraf:<10} {ad:<25} {degisen(c, REF):>7.4f} {isabet(c):>7.4f}"
          f" {isabet(c) - isabet(REF):>+8.4f}")
print("oynatan kalem", sum(degisen(kos(**d), REF) > 0 for _, _, d in KALEM), "/", len(KALEM))
```

```
taban isabet 0.9125 , kalem sayisi 12
taraf      kalem                     degisen  isabet     fark
saglayici  ornekleme durumu           0.1200  0.8925  -0.0200
saglayici  model surumu               0.0150  0.9175  +0.0050
saglayici  hiz siniri esigi           0.0050  0.9075  -0.0050
istemci    dagilim sicakligi          0.0600  0.8575  -0.0550
istemci    en buyuk cikti uzunlugu    0.0000  0.9125  +0.0000
istemci    yonerge bicim sozcugu      1.0000  0.5525  -0.3600
istemci    etiket kumesi sirasi       0.1100  0.9100  -0.0025
istemci    bosluk duzeni              0.0700  0.9325  +0.0200
istemci    konusma durumu             0.0050  0.9125  +0.0000
istemci    baglam parcasi sirasi      0.0025  0.9150  +0.0025
istemci    istemci normallestirmesi   0.1300  0.8775  -0.0350
istemci    yeniden deneme sayisi      0.0375  0.8750  -0.0375
oynatan kalem 11 / 12
```

On iki kalemin **on biri** tek başına serbest bırakıldığında yanıtları oynatıyor. Listenin en
öğretici satırları, oynatması beklenmeyenlerdir. **Boşluk düzeni** istemin anlamına hiç dokunmuyor,
aynı sözcükleri aynı sırada gönderiyor ve yanıtların **0,0700**'ünü değiştiriyor. **İstemci
normalleştirmesi** aynı biçimde anlamı korurken **0,1300**'ünü değiştiriyor. **Etiket kümesinin
sırası** beş etiketi başka sırada yazıyor ve **0,1100** oynatıyor. Bir istemin metni, anlamıyla
değil **birebir kendisiyle** bir girdidir.

Değişen yanıt ile bozulan yanıt aynı şey değildir ve tablo bunu ayrı sütunlarda tutuyor. Boşluk
düzeni yanıtların yüzde yedisini değiştiriyor ama isabeti **0,9125'ten 0,9325'e yükseltiyor**;
kazanç tesadüfidir ve bir sonraki koşumda tersine dönebilir. Etiket sırası 0,1100 oynatıp isabeti
yalnız 0,0025 düşürüyor. Buna karşılık **dağılım sıcaklığı** yalnız 0,0600 oynatıp isabeti
**0,0550** düşürüyor: az sayıda yanıt değişiyor ama değişenlerin neredeyse tamamı doğrudan yanlışa
gidiyor. Oynama payı tek başına bir zarar ölçüsü değildir.

İki satır beklenenden küçük çıkıyor. **Konuşma durumu** yalnız 0,0050 oynatıyor, oysa 400 isteğin
113'ünde istem metni değişti; **bağlam parçası sırası** 0,0025 oynatıyor, oysa 60 istekte iki parça
birden vardı. Uzun konuşmalar en kararlı isteklerdir, çünkü aynı konudan gelen izler birikince
seçim tek bir kavramda toplanır ve çekiliş onu bozamaz. Kararlılık isteğe göre değişir; tek bir
oynama payı bütün iş yükünü anlatmaz.

En büyük satır ise ölçek olarak diğerlerinden ayrılır. **Yönergenin biçim sözcüğü** eşanlamlısıyla
değiştirildiğinde yanıtların **tamamı** değişiyor ve isabet 0,9125'ten **0,5525**'e iniyor. Bu
kalem çekilişi değil **görevi** değiştiriyor: biçim kısıtı kalkınca model tek etiket yerine cümle
yazmaya başlıyor ve cümlelerin bir bölümü hiçbir etiket taşımıyor. Eşanlamlı bir sözcük, ölçüyü
0,3600 düşürdü.

## Birlikte Serbest Bırakılan Kalemler

```python
ikili = kos(en_uzun=10, soz="yalnizca")
tek_kalem = kos(soz="yalnizca")
print("yalniz en buyuk cikti uzunlugu     degisen %.4f  isabet %.4f"
      % (degisen(kos(en_uzun=10), REF), isabet(kos(en_uzun=10))))
print("yalniz yonerge bicim sozcugu       degisen %.4f  isabet %.4f"
      % (degisen(tek_kalem, REF), isabet(tek_kalem)))
print("ikisi birlikte                     degisen %.4f  isabet %.4f"
      % (degisen(ikili, REF), isabet(ikili)))
uc = kos(tohum=TOHUM + 1, iz="surum b", esik=31)
print("dokuz istemci kalemi sabit, uc saglayici kalemi serbest:"
      " degisen %.4f  isabet %.4f" % (degisen(uc, REF), isabet(uc)))
print("sabitlenebilir kalem 39 + 9 + 9 =", 39 + 9 + 9,
      ", sabitlenemeyen 3 , toplam", 39 + 9 + 12)
```

```
yalniz en buyuk cikti uzunlugu     degisen 0.0000  isabet 0.9125
yalniz yonerge bicim sozcugu       degisen 1.0000  isabet 0.5525
ikisi birlikte                     degisen 1.0000  isabet 0.2675
dokuz istemci kalemi sabit, uc saglayici kalemi serbest: degisen 0.1150  isabet 0.8925
sabitlenebilir kalem 39 + 9 + 9 = 57 , sabitlenemeyen 3 , toplam 60
```

Tablonun tek sıfırı **en büyük çıktı uzunluğuydu**. Sınır yirmi dörtten ona indirildiğinde hiçbir
yanıt değişmiyor, çünkü tek etiketlik yanıtlar iki belirteçten uzun değil. Bir sabitleme listesi
hazırlarken bu kalemi atmak akla yatkın görünür.

İkinci ve üçüncü satır bunun niçin yanlış olduğunu gösteriyor. Biçim sözcüğü tek başına serbest
bırakıldığında isabet 0,5525'e iniyor; **ikisi birlikte** serbest bırakıldığında **0,2675**'e
iniyor. Aradaki **0,2850**, tek başına hiçbir şey oynatmayan kalemin hesabıdır: cümleye dönen
yanıtlar on belirteçte kesiliyor ve kesilen metinde etiket okunamıyor. Aynı sonuca iki kurs daha
varmıştı: Görselleştirme, Raporlama ve Ölçekli Analiz kursu tek başına raporu oynatmayan bir
kalemin başka bir kalemle birlikte oranı 87,168'den 94,432'ye taşıdığını, Derin Öğrenme kursu tek
başına sıfır oynatan tur sayısının toplu boyla birlikte iki aboneyi kaydırdığını ölçtü. **Tek başına oynatmayan
kalem, sabitlenmesi gerekmeyen kalem değildir.**

## Sabitlenemeyen Üç Kalem

Son iki satır bu konunun kapanış sayısını veriyor. Bir model çağrısının yeniden üretilmesi **60**
kalemin sabitlenmesini ister: hazırlama defterinin 39 kararı, çalışma ortamının 9 kalemi ve bu
derste sayılan 12 kalem. Bunların **57'si** bizim elimizdedir. Kalan **üçü** — örnekleme durumu,
model sürümü ve hız sınırı eşiği — sağlayıcının elindedir ve hiçbir dosyaya yazılarak
sabitlenemez.

Dokuz istemci kalemi sabitken bu üçü birlikte serbest bırakıldığında yanıtların **0,1150**'si
oynuyor ve isabet 0,9125'ten **0,8925**'e iniyor. Düşüş **0,0200**. Önceki iki dersin eşiği tam
olarak budur: maliyet defterindeki 0,0200 ve kesinti tablosundaki 0,0200, bir gürültü değil, bu üç
kalemin **adıdır**. Eşik keyfi seçilmiş bir sayı değil, sabitlenemeyen kalemlerin ölçülmüş
payıdır.

Buradan çıkan sonuç, önceki iki kursunkinden yapıca farklıdır. Bir rapor 59 kalemin 59'uyla, bir
eğitim 67 kalemin 67'siyle sabitlenebilir; ikisi de eksiksiz yeniden üretilebilir. Bir model
çağrısı sabitlenemez. Bu yüzden belirlenimcilik bir hedef değil bir **sınırdır** ve ulaşılabilecek
en iyi şey oynamanın **ölçülmüş** olmasıdır. Bunun uygulamadaki karşılığı tek bir kuraldır: her
ölçüm raporunun yanına iki koşum farkı yazılır ve o farkın altındaki hiçbir kazanç kazanç sayılmaz.

## Özet

- Bir model çağrısının yeniden üretilmesi 60 kalem ister: devralınan 39 hazırlama kararı, 9 ortam
  kalemi ve çağrıya özgü 12 kalem.
- On iki kalemin 11'i tek başına serbest bırakıldığında yanıtları oynatıyor; en büyüğü yönergenin
  biçim sözcüğüdür ve isabeti 0,9125'ten 0,5525'e indiriyor.
- Anlamı hiç değiştirmeyen kalemler de oynatıyor: boşluk düzeni 0,0700, istemci normalleştirmesi
  0,1300, etiket kümesi sırası 0,1100.
- Değişen yanıt ile bozulan yanıt ayrı sayılır: boşluk düzeni 0,0700 oynatıp isabeti yükseltirken
  dağılım sıcaklığı 0,0600 oynatıp 0,0550 düşürüyor.
- Tek başına 0,0000 oynatan en büyük çıktı uzunluğu, biçim sözcüğüyle birlikte serbest
  bırakıldığında isabeti 0,5525'ten 0,2675'e indiriyor.
- Üç kalem sağlayıcıdadır ve sabitlenemez; birlikte serbest kaldıklarında yanıtların 0,1150'si
  oynuyor ve isabet 0,0200 düşüyor, yani önceki iki dersin eşiği ölçülmüş olur.

## Sonraki Adım

On dört derste çağrı bir **ürünün içinde** ele alındı. Mesaj tabanlı arayüzün ne sunduğu, akışın
ne değiştirdiği, bir araç çağrısının kaçının geçerli olduğu, hız sınırının ne kadara mal olduğu,
önbelleğin ne kazandırdığı, gecikmenin hangi sınıfa indiği, faturanın hangi kalemlerden oluştuğu,
kesintinin kaliteyi nasıl sessizce düşürdüğü ve aynı girdinin niçin iki çıktı verdiği sayıldı.
Bütün bu ölçümlerde çağrıyı yapan bir uygulamaydı ve o uygulamayı yazan kişi ölçümün dışında
durdu. Oysa aynı model geliştiricinin kendi masasında da çalışıyor: kod tamamlarken, var olan bir
işlevi açıklarken, bir dosyayı dönüştürürken, hatta çok adımlı bir görevi devralırken. Sonraki
konu ölçüyü oraya taşır ve aynı soruyu sorar: kurgu bir kod tabanında hangi görev sınıfında
düzeneksiz çağrı çöküyor, hangi bağlam kaç belirtece mal oluyor ve kabul edilen önerinin kaçı
gerçekten doğru.
