---
title: 'Kısıt ve Yasak Bildirimi'
source: 'https://academia.sh/tr/kurslar/istem-muhendisligi/kisit-ve-yasak-bildirimi'
course: 'İstem Mühendisliği'
language: tr
updated: '2026-08-17T18:06:39+00:00'
license: 'CC BY-SA 4.0'
---

# Kısıt ve Yasak Bildirimi

Aynı kural iki ayrı biçimde yazılıp 120 kurgu destek talebinde ölçülüyor. Hiçbir bildirim yokken ihlal oranı 0,2583; yasak bildirimi eklendiğinde 0,5333'e çıkıyor ve yasaklanan sözcüklerden birinin geçtiği yanıt sayısı 5'ten 35'e yükseliyor. Aynı kuralı olumlu bildiren istem ihlali 0,0167'ye indiriyor ve etiket isabetini 0,6667'den 0,8333'e çıkarıyor. İkisi birlikte yazıldığında ihlal 0,1583 oluyor: yasağı olumlu bildirime eklemek sayıyı yaklaşık on kat kötüleştiriyor. Bedel yan yana yazılıyor; olumlu bildirim önlenen ihlal başına 115,9 giriş belirteci tutuyor.

Önceki iki derste isteme yazılan her şey olumluydu: şunu yap, şu biçimde yaz, şu örneklere bak.
Uygulamada yazılan istemlerin büyük bölümü bunun tersini de içerir. Bir etiketi kullanma, tarih
verme, kesin konuşma, uydurma. Bu cümlelere **yasak bildirimi** denir ve sezgi onların en kötü
ihtimalle etkisiz kalacağını söyler: model uyarsa iyi, uymazsa hiçbir şey değişmez.

Bu ders o sezginin sayısını alır. Aynı kural iki ayrı biçimde yazılır — bir kez neyin
yapılmayacağı, bir kez neyin yapılacağı olarak — ve ikisinin ürettiği **ihlal sayısı** yan yana
konur. Ortaya çıkan sonuç bu kursun ikinci iddiasının ilk örneğidir: **bir istem eklentisi sayıyı
düşürmek yerine yükseltebilir**, ve bunu ölçmeden anlamanın yolu yoktur.

- **IT54.** Model bir **benzeticidir**, tohumu **20260218**'dir ve gerçek bir uç nokta
  çağrılmaz. Destek talepleri, yanıt kalıpları ve kural kümesi **kurgudur**.
- **IT55.** Görev **kısa yanıt yazmadır**: model talebi bir etikete atar ve tek cümlelik bir yanıt
  üretir. Yanıt altı kurgu kalıptan biriyle kurulur.
- **IT56.** Kural kümesi üç sözcüktür: yanıtta `hemen`, `yarin` ve `genel` geçmemelidir. Bunlar
  kurgu bir yazım kılavuzunun karşılığıdır — söz verme, tarih verme, belirsiz etiket koyma.
- **IT57.** **İhlal ölçüsü** açıktır: yanıtta bu üç sözcükten biri geçiyorsa kayıt ihlallidir.
  Her sözcüğün kaç yanıtta geçtiği ayrıca sayılır.
- **IT58.** Benzetici yanıt kalıbını **istemde geçen belirteçlere** göre seçer. Her kalıbın kendi
  ayırt edici belirteçleri vardır ve bu belirteçler istemde geçtiğinde o kalıbın puanı yükselir.
  Model belirtecin **olumlu mu olumsuz mu** anıldığını ayırt etmez.
- **IT59.** Dört istem karşılaştırılır: bildirimsiz, yasak bildirimli, olumlu bildirimli ve
  ikisi birlikte. Görev tanımı, etiket kümesi ve talep kümesi dördünde de aynıdır.
- **IT60.** Bedel **giriş belirteciyle** yazılır ve ayrıca **önlenen ihlal başına** birim maliyet
  hesaplanır.

## Aynı Kuralın İki Yazımı

```python
# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz; standart kitaplikla
# yazilmis bir dil modeli benzeticisidir. Talepler ve yanit kaliplari da kurgudur.
import math

TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE, EN_UZUN = 240, 24


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"]
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"]}
EK = ["ayrica gecen ay da ayni sorun olmustu", "bu konuda memnun degilim",
      "acil bilgi almam gerekiyor", "kayit numaram elimde yok"]

TALEP = []
for i in range(120):
    r = uretec(TOHUM + i)
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    m = KALIP[k][int(r() * 3)]
    if r() < 0.34:
        m += " " + EK[int(r() * 4)]
    TALEP.append({"no": 4001 + i, "metin": m, "konu": k})

KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"]
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", "borc": "odeme", "odedi": "odeme", "ucret": "odeme",
      "memnu": "sikayet", "sorun": "sikayet", "acil": "sikayet", "bilgi": "bilgi",
      "ogren": "bilgi", "nered": "bilgi"}
TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura",
         "ekip": "kesinti", "takip": "tarife", "giril": "fatura"}
SAYAC = [0]

# KURGU kural kumesi: yanitta gecmemesi gereken uc sozcuk.
YASAKLI = ["hemen", "yarin", "genel"]
# Her yanit kalibi bir taban agirlik ve kendi ayirt edici belirtecleriyle gelir.
YANIT = [("kaydiniz {k} konusunda acildi , inceleme suruyor", 1.2, ["incel", "acild"]),
         ("{k} talebiniz ilgili ekibe yonlendirildi", 1.1, ["ilgil", "ekibe"]),
         ("bu {k} kaydi hemen ele alinacak", 0.5, ["hemen"]),
         ("{k} kaydiniz yarin sonuclandirilacak", 0.4, ["yarin"]),
         ("talebiniz genel bir basvuru olarak alindi", 0.3, ["genel", "basvu"]),
         ("{k} kaydiniz durumu inceleniyor", 1.0, ["durum", "incel"])]


def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN):
    SAYAC[0] += 1
    bel = belirtecle(istem)
    bos = {"giris": len(bel), "cikis": 0, "yanit": "", "kalip": -1}
    if len(bel) > PENCERE:
        return dict(bos, durum="baglam_asimi")
    if SAYAC[0] % 37 == 0:
        return dict(bos, durum="hiz_siniri")
    r = uretec(tohum ^ izno(istem))
    aday = [k for k in KAVRAM if k[:5] in bel]
    if len(aday) < 3:
        aday = KAVRAM
    p = {k: 0.15 for k in aday}
    for t in bel:
        for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    e = [math.exp(p[a] / sicaklik) for a in sorted(p)]
    k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])]
    # Kalip puani: taban agirlik + kalibin belirteclerinin istemde gecme sayisi.
    puan = [t + 0.85 * sum(a in bel for a in an) for _, t, an in YANIT]
    q = [math.exp(x / sicaklik) for x in puan]
    i = ayrik(r(), [x / sum(q) for x in q])
    y = YANIT[i][0].format(k=k)
    cb = belirtecle(y)
    if len(cb) > en_uzun:
        cb, y = cb[:en_uzun], " ".join(cb[:en_uzun])
    return {"durum": "tamam", "giris": len(bel), "cikis": len(cb),
            "yanit": y, "kalip": i}


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


GOREV = ("Talebi su etiketlerden birine ata ve kisa bir yanit yaz : fatura , ariza , "
         "sayac , tarife , kesinti . Talep : ")
YASAK = "Yanitinda su sozcukleri kullanma : hemen , yarin , genel . "
OLUMLU = ("Yanitinda yalnizca sunlar olsun : kaydin acildigi , ilgili ekibe "
          "yonlendirildigi ve durumun inceleniyor olmasi . ")
DURUM = (("bildirimsiz", ""), ("yasak bildirimi", YASAK),
         ("olumlu bildirim", OLUMLU), ("yasak + olumlu", YASAK + OLUMLU))


def olc(onek, tohum=TOHUM):
    SAYAC[0] = 0
    d = {"ihlal": 0, "etiketli": 0, "isabet": 0, "giris": 0, "cikis": 0}
    sayim, kalip = {w: 0 for w in YASAKLI}, [0] * len(YANIT)
    for x in TALEP:
        s = cagir(onek + GOREV + x["metin"], tohum=tohum)
        d["giris"], d["cikis"] = d["giris"] + s["giris"], d["cikis"] + s["cikis"]
        if s["kalip"] >= 0:
            kalip[s["kalip"]] += 1
        gecen = [w for w in YASAKLI if w in s["yanit"].split()]
        for w in gecen:
            sayim[w] += 1
        d["ihlal"] += bool(gecen)
        d["etiketli"] += oku(s["yanit"]) is not None
        d["isabet"] += oku(s["yanit"]) == x["konu"]
    for a in ("ihlal", "etiketli", "isabet"):
        d[a] /= len(TALEP)
    return dict(d, sayim=sayim, kalip=kalip, cagri=SAYAC[0])


print(f"KURGU: {len(TALEP)} destek talebi , yasakli sozcukler {YASAKLI}")
print(f"\n{'istem':<17}{'ihlal':>8}{'etiketli':>10}{'isabet':>9}{'giris':>8}"
      f"{'hemen':>7}{'yarin':>7}{'genel':>7}")
O = {}
for ad, onek in DURUM:
    d = O[ad] = olc(onek)
    print(f"{ad:<17}{d['ihlal']:>8.4f}{d['etiketli']:>10.4f}{d['isabet']:>9.4f}"
          f"{d['giris']:>8}" + "".join(f"{d['sayim'][w]:>7}" for w in YASAKLI))
```

```
KURGU: 120 destek talebi , yasakli sozcukler ['hemen', 'yarin', 'genel']

istem               ihlal  etiketli   isabet   giris  hemen  yarin  genel
bildirimsiz        0.2583    0.9000   0.6667    5060      5     17      9
yasak bildirimi    0.5333    0.8583   0.5750    6740     35     16     13
olumlu bildirim    0.0167    0.9667   0.8333    8420      1      0      1
yasak + olumlu     0.1583    0.9417   0.6500   10100     12      3      4
```

Birinci satır taban çizgisidir: hiçbir bildirim yokken yanıtların **0,2583** payı yasaklanan
sözcüklerden birini taşıyor. İkinci satır bu dersin sayısıdır. Yasak bildirimi eklendiğinde ihlal
oranı **0,5333** oluyor, yani **iki katından fazla**. Yasağı yazmak, yasaklanan şeyi
yasaklamıyor; iki misline çıkarıyor. Sağdaki üç sütun artışın nerede toplandığını gösteriyor:
`hemen` sözcüğünü taşıyan yanıt sayısı **5'ten 35'e** çıkıyor, `genel` 9'dan 13'e çıkıyor,
`yarin` 17'de kalıyor. Artış eşit dağılmıyor, ama hiçbir sözcükte düşüş yok.

Üçüncü satır aynı kuralın olumlu yazımıdır. İstem hangi sözcüklerin yasak olduğunu hiç anmaz;
bunun yerine yanıtta **neyin bulunacağını** söyler. İhlal oranı **0,0167** oluyor, taban çizgisinin
on beşte biri. Yan etki de olumlu yöndedir: etiketi okunabilen yanıt oranı 0,9000'dan
**0,9667**'ye, etiket isabeti 0,6667'den **0,8333**'e çıkıyor. Aynı kural, aynı model, aynı görev
ve aynı küme; değişen tek şey kuralın cümlesi.

Dördüncü satır uygulamada en sık görülen yazımdır: önce ne isteniyorsa söylenir, sonra "şunları
da yapma" diye eklenir. İhlal oranı **0,1583** oluyor — olumlu bildirimin tek başına verdiği
0,0167'nin yaklaşık **on katı**. Yasak cümlesi olumlu bir istemin yanına eklendiğinde de kendi
zararını taşıyor. Etiket isabeti de 0,8333'ten 0,6500'e geri düşüyor.

## Yasağın Niçin Ters Çalıştığı

```python
print("kalip                          bildirimsiz  yasak  olumlu  ikisi")
for i, (metin, _, an) in enumerate(YANIT):
    isim = ("yasakli: " + [w for w in YASAKLI if w in metin][0]) if any(
        w in metin for w in YASAKLI) else "uygun: " + an[0]
    print(f"{isim:<30}" + "".join(f"{O[ad]['kalip'][i]:>7}" for ad, _ in DURUM))

print("\nartisin kosumdan bagimsizligi")
for th in (TOHUM, TOHUM + 1, TOHUM + 2):
    v = [olc(onek, tohum=th)["ihlal"] for _, onek in DURUM]
    print(f"  tohum {th}: " + " ".join(f"{x:.4f}" for x in v))
i0 = [olc(onek)["ihlal"] for _, onek in DURUM]
i1 = [olc(onek, tohum=TOHUM + 1)["ihlal"] for _, onek in DURUM]
print("  iki kosum farki: " + " ".join(f"{abs(a - b):.4f}" for a, b in zip(i0, i1)))

n = len(TALEP)
taban = O["bildirimsiz"]
print("\nbedel")
for ad, _ in DURUM[1:]:
    d, fark = O[ad], round((O[ad]["ihlal"] - taban["ihlal"]) * n)
    ek = d["giris"] - taban["giris"]
    birim = f"{ek / abs(fark):.1f}" if fark else "-"
    print(f"  {ad:<16} ihlal {round(taban['ihlal'] * n):>3} -> {round(d['ihlal'] * n):>3}"
          f" ({fark:+d}) , giris belirteci {ek:+d} , ihlal basina {birim}")
```

```
kalip                          bildirimsiz  yasak  olumlu  ikisi
uygun: incel                       39     18     19     52
uygun: ilgil                       26     16     77     23
yasakli: hemen                      5     35      1     12
yasakli: yarin                     17     16      0      3
yasakli: genel                      9     13      1      4
uygun: durum                       21     19     19     23

artisin kosumdan bagimsizligi
  tohum 20260218: 0.2583 0.5333 0.0167 0.1583
  tohum 20260219: 0.2750 0.4167 0.0000 0.1167
  tohum 20260220: 0.3833 0.4917 0.0083 0.1167
  iki kosum farki: 0.0167 0.1167 0.0167 0.0417

bedel
  yasak bildirimi  ihlal  31 ->  64 (+33) , giris belirteci +1680 , ihlal basina 50.9
  olumlu bildirim  ihlal  31 ->   2 (-29) , giris belirteci +3360 , ihlal basina 115.9
  yasak + olumlu   ihlal  31 ->  19 (-12) , giris belirteci +5040 , ihlal basina 420.0
```

Üstteki çizelge mekanizmayı açık ediyor. Bildirimsiz istemde `hemen` kalıbı 5 kez seçiliyor;
yasak bildirimli istemde **35 kez**. Yasak cümlesi bu kalıbın metnindeki belirteci istemin içine
yazdı ve benzetici o belirteci **istemde gördüğü bir sözcük** olarak işledi. Model bir sözcüğün
"kullanma" ile birlikte mi yoksa "kullan" ile birlikte mi anıldığını ayırt etmiyor; gördüğü şey
sözcüğün **orada olmasıdır**. Olumlu bildirim aynı mekanizmayı ters yönde kullanıyor: `ilgil`
belirteçli uygun kalıp 26'dan **77'ye** çıkıyor, çünkü istemde geçen sözcükler bu kez uygun
kalıbın sözcükleri.

Orta bölüm farkın koşumdan bağımsız olup olmadığını sınıyor. Üç tohumda da sıralama aynı: yasak
bildirimi tabanın üstünde, olumlu bildirim tabanın çok altında. İki koşum arasındaki fark
bildirimsiz istemde **0,0167**, olumlu bildirimde **0,0167**, yasak bildiriminde **0,1167**.
Yasak bildiriminin kattığı **+0,2750**, kendi koşum farkının iki katından büyüktür ve ölçülmüş
sayılır. Olumlu bildirimin kattığı **−0,2416**, koşum farkının on dört katıdır ve tartışmasızdır.
Yasak bildiriminin koşum farkının öbür ikisinden yedi kat büyük olması ayrıca bir bulgudur:
yasak, sonucu yalnız kötüleştirmiyor, **daha kararsız** da yapıyor.

Alt bölüm bedeli veriyor. Yasak bildirimi 1680 giriş belirteci ekliyor ve ihlal sayısını 31'den
64'e çıkarıyor; eklenen her belirteç sayıyı yanlış yöne itiyor. Olumlu bildirim 3360 giriş
belirteci ekliyor ve ihlali 31'den 2'ye indiriyor: **önlenen ihlal başına 115,9 giriş belirteci**.
Yasağı olumluya eklemek 5040 belirteç harcayıp yalnız 12 ihlal önlüyor, yani önlenen ihlal başına
**420,0 belirteç** — aynı sonucu üçte bir bedelle veren bir istem varken. İki katı belirteç
harcayan istem burada doğru istemdir, ve bunu ancak ikisini de koşturup sayarak söylemek mümkün.
**Ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir**; bu derste tahmin, sayının
tersi yönde çıktı.

## Özet

- Aynı kural iki ayrı yazımla ölçüldü. Bildirimsiz istemde ihlal oranı **0,2583**, yasak
  bildirimli istemde **0,5333**: yasağı yazmak ihlali iki katından fazlaya çıkardı.
- Artış yasaklanan sözcüklerde toplanıyor: `hemen` taşıyan yanıt sayısı **5'ten 35'e** çıkıyor ve
  hiçbir yasaklı sözcükte düşüş görülmüyor.
- Olumlu bildirim aynı kuralı hiçbir yasaklı sözcüğü anmadan kuruyor ve ihlali **0,0167**'ye
  indiriyor; etiket isabeti de 0,6667'den **0,8333**'e çıkıyor.
- İkisi birlikte yazıldığında ihlal **0,1583** oluyor, yani olumlu bildirimin tek başına verdiğinin
  yaklaşık on katı. Yasak cümlesi olumlu bir istemin içinde de kendi zararını taşıyor.
- Bedel: yasak bildirimi **+1680** giriş belirteciyle 33 ihlal ekliyor, olumlu bildirim **+3360**
  giriş belirteciyle 29 ihlal önlüyor (**önlenen ihlal başına 115,9 belirteç**), ikisi birlikte
  **+5040** belirteçle yalnız 12 ihlal önlüyor.

## Sonraki Adım

Dört derste dört ayrı tasarım kararı ölçüldü ve her biri tek başına, bir defada denendi. Gerçek
bir istem böyle yazılmaz. Bir istem yazılır, ölçülür, bir yeri değiştirilir, yeniden ölçülür ve
bu döngü sayı iyileşmez olana kadar sürer. Sonraki ders bu döngünün kendisini ölçü altına alır:
kaç yinelemede kazanç doyuyor, ve daha rahatsız edici olan soru, yineleme boyunca bakılan kümenin
sayısı ile hiç bakılmayan bir kümenin sayısı **birbirinden ne zaman ayrılmaya başlıyor**. Bu ders
aynı zamanda konunun kapanışıdır ve sekiz dersin toplamını bir soruyla bağlar.
