---
title: 'Sınırlar ve Riskler'
source: 'https://academia.sh/tr/kurslar/model-apileri/sinirlar-ve-riskler'
course: "Model API'leri ile Uygulama Geliştirme"
language: tr
updated: '2026-08-17T18:06:37+00:00'
license: 'CC BY-SA 4.0'
---

# Sınırlar ve Riskler

Yapay zekâ destekli geliştirmenin üç riskinin sayılması: yirmi dört istek paketindeki 456 bağlam satırının 168'i sır sınıfına giriyor, alan adına bakan süzgeç hepsini çıkarıyor ama serbest metinde kalan 12 ize erişemediği için kapsaması 0,9333'te kalıyor; üretilen kodun dokuzu var olmayan bir bağımlılık adı taşıyor; ve kabul edilen on dokuz önerinin onu kusurlu, yani kabul edilenlerdeki yanlış payı 0,5263 ile taban payı 0,4583'ün üzerinde.

Önceki iki ders üretilen çıktının kalitesini ölçtü: yamanın doğruluğu, sınamanın ayırt etme
gücü, belgenin denetlenebilirliği. Üçü de kusurun **kod tabanında** olduğunu varsayar ve
kusuru çıktı elde edildikten sonra arar. Devrin iki ucunda ise sayılmamış birer şey durur.
Girdi ucunda modele **ne gönderildiği**, çıktı ucunda ise **kabul kararının kendisi**.

Bu ders üç riski tek tek sayar: bağlama giren metinde kaç alan sır sınıfına giriyor ve bir
süzgeç kaçını çıkarıyor, üretilen kodda kaç bağımlılık adı var olmayan bir şeye işaret ediyor,
ve kabul edilen önerilerin ne kadarı yanlış. Sır yönetiminin yordamı Uygulama Güvenliği ve
DevSecOps müfredatında, bağımlılık politikası ve bileşen analizi de aynı müfredatta ölçüldü;
ikisi de burada tekrarlanmaz. Eklenen tek şey **bu üç riskin sayısıdır**.

- **YG48.** Kod tabanı **kurgudur** ve beş modül, **53 satırdır**. Abone kayıtları, çalışma
  ayarları ve destek talepleri de kurgudur. Tohum **20260218**.
- **YG49.** Bu bir saldırı dersi değildir. **Koşan kod her zaman savunma tarafındadır**: sayım,
  sınıflandırma, süzgeç, varlık denetimi. Hiçbir sömürü kodu, yük, atlatma ya da yayımlama
  yordamı yazılmaz.
- **YG50. İstek paketi** bir göreve gönderilen bağlamın tamamıdır: görev satırı, dosya listesi,
  bir ila üç abone kaydı, çalışma ayarları ve bir destek talebi.
- **YG51.** Beş alan adı dört **sır sınıfına** eşlenir: kimlik, iletişim, konum ve erişim.
  Değerler kurgudur ve hiçbiri gerçek bir veri değildir.
- **YG52. Süzgeç alan adına bakar**: satırın anahtarı sır sınıfı tablosunda geçiyorsa satır
  çıkarılır. Yordam bundan ibarettir; anahtar yönetimi, maskeleme ve saklama ele alınmaz.
- **YG53. İz sözcüğü**, sır sınıfı alan adlarının ilk parçasıdır. Serbest metinde geçen iz,
  süzgecin göremediği sızıntıdır ve ayrı sayılır.
- **YG54. Uydurma bağımlılık**, `import` satırındaki adın kod tabanının modülleri arasında ya
  da izinli standart kitaplık adları arasında bulunmamasıdır. Uydurma adlar kurgudur ve hiçbir
  gerçek paket, depo ya da yayımlama yolu anılmaz.
- **YG55. Kusurlu öneri**, kod tabanının davranışını değiştiren bir öneridir. Kusur, tek bir
  karşılaştırma sınırının ya da tek bir sabitin değişmesidir.
- **YG56. Kabul**, geliştiricinin öneriyi olduğu gibi alma kararıdır. Karar bağlam örtüşmesine,
  görev sınıfına ve zorluğa bağlıdır; öneride kusur olup olmadığına **bakmaz**, çünkü bu kusurlar
  tek damgalık değişimlerdir. Bu varsayımın doğruluğu ölçümde ayrıca sınanır.
- **YG57.** Sayılar iki tohumda basılır; ikinci koşum tohumu **20260219**.

## Bağlama Giren Sır Sınıfı Alanlar

Bir kod yardımcısına görev verirken gönderilen şey görev cümlesi değildir. Yanında dosya
listesi, örnek kayıtlar, çalışma ayarları ve çoğu zaman sorunun kaynağı olan bir kullanıcı metni
gider. Bu paket bir ağ üzerinden çıkar ve içinde ne olduğu **sayılmadıkça** bilinmez.

```python
# KURGU: olcum aginin bes modullu, 53 satirlik yardimci kod tabani ile abone
# kayitlari, calisma ayarlari ve destek talepleri. Hicbiri gercek degildir.
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 izno(m):
    h = 2166136261
    for c in m:
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


SINIF = ("tamamlama", "aciklama", "donusturme")
DOSYA = ("okuma.py", "tarife.py", "denetim.py", "ozet.py", "bicim.py")
GEREKEN = {0: ("okuma.py",), 1: ("tarife.py",), 2: ("denetim.py", "okuma.py"),
           3: ("ozet.py", "denetim.py"), 4: ("bicim.py", "ozet.py"),
           5: ("tarife.py", "okuma.py"), 6: ("ozet.py", "okuma.py", "tarife.py"),
           7: ("denetim.py", "bicim.py")}
GOREV = [{"ad": s + "-" + str(i + 1), "sinif": s, "gereken": GEREKEN[i],
          "zorluk": 0.05 * (i % 4)} for s in SINIF for i in range(8)]

SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum",
            "erisim_dizgesi": "erisim", "oturum_anahtari": "erisim"}
IZ_SOZCUK = tuple(sorted({a.split("_")[0] for a in SIR_ALAN}))
ABONE = [{"abone_kimlik": "A0417", "iletisim": "hat-3", "adres": "dogu-12",
          "bolge": "dogu", "donem": "2026-01", "endeks": "41250"},
         {"abone_kimlik": "A0912", "adres": "bati-4",
          "bolge": "bati", "donem": "2026-01", "endeks": "38104"},
         {"abone_kimlik": "A1330", "iletisim": "hat-1",
          "bolge": "kuzey", "donem": "2026-01", "endeks": "50077"}]
AYAR = {"olcum_agi": "dogu", "zaman_asimi": "20", "kayit_yolu": "veri/olcum",
        "erisim_dizgesi": "ORNEK", "oturum_anahtari": "ORNEK"}
TALEP = ["adresim degisti yeni doneme kayit yapilsin",
         "iletisim bilgim sistemde yanlis gorunuyor",
         "sayac endeksi eksik girilmis duzeltilsin",
         "tarife basamagim yanlis hesaplanmis",
         "abone kaydim iki kere acilmis birlestirin",
         "kesinti sonrasi endeks okunmadi"]


def baglam(gorev, i):
    s = ["gorev: " + gorev["ad"], "dosya: " + ",".join(gorev["gereken"])]
    for k in ABONE[:1 + i % 3]:
        s += [a + ": " + d for a, d in k.items()]
    s += [a + ": " + d for a, d in AYAR.items()]
    s.append("talep: " + TALEP[i % len(TALEP)])
    return s


def sir_say(satirlar):
    say = {}
    for s in satirlar:
        sinif = SIR_ALAN.get(s.split(":")[0])
        if sinif:
            say[sinif] = say.get(sinif, 0) + 1
    return say


def suz(satirlar):
    return [s for s in satirlar if s.split(":")[0] not in SIR_ALAN]


def serbest_iz(satirlar):
    return sum(1 for s in satirlar if s.startswith("talep:")
               for w in IZ_SOZCUK if w in s)


toplam = {"satir": 0, "sir": 0, "kalan": 0, "iz": 0}
sinif_say = {}
for i, g in enumerate(GOREV):
    b = baglam(g, i)
    k = suz(b)
    toplam["satir"] += len(b)
    toplam["sir"] += len(b) - len(k)
    toplam["kalan"] += len(k)
    toplam["iz"] += serbest_iz(k)
    for s, n in sir_say(b).items():
        sinif_say[s] = sinif_say.get(s, 0) + n
print("iz sozcukleri:", IZ_SOZCUK)
print("baglam satiri:", toplam["satir"], "| suzuldukten sonra:", toplam["kalan"])
print("sir sinifi alan:", dict(sorted(sinif_say.items())), "toplam", toplam["sir"])
gecen = toplam["sir"] + toplam["iz"]
print("suzgecin cikardigi:", toplam["sir"], "| serbest metinde kalan iz:", toplam["iz"],
      "| kapsama: %.4f" % (toplam["sir"] / gecen))
print("ornek baglam (gorev 1), suzulmus:")
for s in suz(baglam(GOREV[0], 0)):
    print("  " + s)
```

```
iz sozcukleri: ('abone', 'adres', 'erisim', 'iletisim', 'oturum')
baglam satiri: 456 | suzuldukten sonra: 288
sir sinifi alan: {'erisim': 48, 'iletisim': 32, 'kimlik': 48, 'konum': 40} toplam 168
suzgecin cikardigi: 168 | serbest metinde kalan iz: 12 | kapsama: 0.9333
ornek baglam (gorev 1), suzulmus:
  gorev: tamamlama-1
  dosya: okuma.py
  bolge: dogu
  donem: 2026-01
  endeks: 41250
  olcum_agi: dogu
  zaman_asimi: 20
  kayit_yolu: veri/olcum
  talep: adresim degisti yeni doneme kayit yapilsin
```

Yirmi dört istek paketinde **456 bağlam satırı** var ve bunların **168'i** dört sır sınıfından
birine giriyor: kimlik 48, erişim 48, konum 40, iletişim 32. Yani gönderilen her üç satırdan
biraz fazlası, göreve hiçbir katkısı olmayan ama dışarı çıkan bir alandır. Bu oran **0,3684**
ve hiçbir yerde yazılı değildir; sayılmadan bilinmez.

Süzgeç yapısal alanların **hepsini** çıkarıyor: 168'in 168'i. Bu, kendi ölçütüne göre kusursuz
bir sonuçtur. Ama ölçüt yanlıştır. Süzgecin baktığı şey alan adıdır ve sır sınıfı bilgisi
yalnız alan adında durmaz. Serbest metinde kalan **12 iz** bunun kanıtıdır; süzgecin gerçek
kapsaması **0,9333**'tür. Örnek pakette bu apaçık görünüyor: `abone_kimlik`, `iletisim` ve
`adres` satırları temizlendikten sonra, en alttaki talep satırı hâlâ abonenin adresinden söz
ediyor. Yapısal alanı silmek, aynı bilgiyi taşıyan cümleyi silmez.

Süzgecin bedeli de aynı çıktıda okunuyor. Kalan kayıtta bölge, dönem ve endeks var, **abone
alanı yok**. Ayrıştırıcının dört sütunundan birincisi budur ve görev okuma modülünü
ilgilendiriyor. Sır sınıfı alanları çıkarmak, göreve gereken örneğin bir sütununu da götürür.

## Uydurma Bağımlılık ve Kabul Kararı

İkinci ve üçüncü riskler çıktı tarafındadır. Üretilen kod bir bağımlılık adı taşıyabilir ve o
ad hiçbir şeye karşılık gelmeyebilir. Bunu görmenin yolu adı **denemek** değil, adın var olup
olmadığına bakmaktır: kod tabanının modülleri ve izinli standart kitaplık adları bilinen bir
kümedir, dışındaki her ad şüphelidir. Üçüncü risk ise ölçmesi en zor olanıdır, çünkü ölçülen
şey modelin çıktısı değil **insanın kararıdır**.

```python
UYDURMA = ("olcum_araclari", "tarife_yardim", "bolge_ozet", "sayac_kit")
ORUNTU = ("eval(", "except:", "== None", "open(")
STANDART = ("math", "json")
TABAN = {"tamamlama": 0.34, "aciklama": 0.72, "donusturme": 0.18}


def uret_kod(gorev, tohum=TOHUM):
    r = uretec(tohum ^ izno(gorev["ad"]))
    u = [r() for _ in range(6)]
    return {"kusurlu": u[0] < 0.46,
            "ithal": UYDURMA[int(u[3] * 4)] if u[2] < 0.30 else "math",
            "oru": ORUNTU[int(u[5] * 4)] if u[4] < 0.34 else None}


def varlik_denetimi(ad):
    return ad + ".py" not in DOSYA and ad not in STANDART


def yardimci(gorev, secim, tohum=TOHUM):
    r = uretec(tohum ^ izno(gorev["ad"] + "|" + ",".join(sorted(secim))))
    ortu = sum(1 for d in gorev["gereken"] if d in secim) / len(gorev["gereken"])
    ilgisiz = sum(1 for d in secim if d not in gorev["gereken"]) / len(DOSYA)
    puan = TABAN[gorev["sinif"]] + 0.55 * ortu - 0.30 * ilgisiz - gorev["zorluk"]
    puan = min(max(puan, 0.0), 1.0)
    return {"kabul": r() < puan, "puan": puan,
            "belirtec": 40 + 26 * len(secim) + (18 if gorev["sinif"] == "donusturme" else 0)}


def olc(tohum=TOHUM):
    d = {"uydurma": 0, "ayri": set(), "oruntu": 0, "kusurlu": 0, "kabul": 0,
         "kabul_yanlis": 0, "ret_dogru": 0, "temiz_kabul": 0, "belirtec": 0}
    for g in GOREV:
        k = uret_kod(g, tohum)
        y = yardimci(g, g["gereken"], tohum)
        if varlik_denetimi(k["ithal"]):
            d["uydurma"] += 1
            d["ayri"].add(k["ithal"])
        d["oruntu"] += k["oru"] is not None
        d["kusurlu"] += k["kusurlu"]
        d["kabul"] += y["kabul"]
        d["belirtec"] += y["belirtec"]
        d["kabul_yanlis"] += y["kabul"] and k["kusurlu"]
        d["ret_dogru"] += (not y["kabul"]) and (not k["kusurlu"])
        d["temiz_kabul"] += y["kabul"] and not k["kusurlu"]
    return d


print("tohum     | uydurma ayri oruntu | kusurlu kabul kabul-yanlis"
      " | taban pay kabul pay | ret-dogru")
for tohum in (TOHUM, TOHUM + 1):
    d = olc(tohum)
    print("%d  | %7d %4d %6d | %7d %5d %12d | %9.4f %9.4f | %9d"
          % (tohum, d["uydurma"], len(d["ayri"]), d["oruntu"], d["kusurlu"],
             d["kabul"], d["kabul_yanlis"], d["kusurlu"] / 24,
             d["kabul_yanlis"] / d["kabul"], d["ret_dogru"]))
print("kabul orani | kusurlu oneride | temiz oneride")
for tohum in (TOHUM, TOHUM + 1):
    d = olc(tohum)
    ku, te = d["kusurlu"], 24 - d["kusurlu"]
    print("%d    | %-15s | %s"
          % (tohum, "%d/%d = %.4f" % (d["kabul_yanlis"], ku, d["kabul_yanlis"] / ku),
             "%d/%d = %.4f" % (d["temiz_kabul"], te, d["temiz_kabul"] / te)))
d = olc(TOHUM)
print("uydurma adlar:", sorted(d["ayri"]))
print("istek basina baglam belirteci:", d["belirtec"] // 24)
```

```
tohum     | uydurma ayri oruntu | kusurlu kabul kabul-yanlis | taban pay kabul pay | ret-dogru
20260218  |       9    4      8 |      11    19           10 |    0.4583    0.5263 |         4
20260219  |      12    4      9 |       6    19            5 |    0.2500    0.2632 |         4
kabul orani | kusurlu oneride | temiz oneride
20260218    | 10/11 = 0.9091  | 9/13 = 0.6923
20260219    | 5/6 = 0.8333    | 14/18 = 0.7778
uydurma adlar: ['bolge_ozet', 'olcum_araclari', 'sayac_kit', 'tarife_yardim']
istek basina baglam belirteci: 94
```

İkinci riskin sayısı ilk sütunlardadır. Yirmi dört üretilen parçanın **dokuzu** var olmayan bir
ada başvuruyor ve bunlar yalnız **dört ayrı ada** dağılıyor. İkinci koşumda sayı **12'ye**
çıkıyor, ayrı ad sayısı yine dört. Uydurma bağımlılık dağınık bir gürültü değildir: aynı küçük
ad kümesi tekrar tekrar üretilir, çünkü ad kod tabanının kendi adlandırma alışkanlığından
türetilir ve makul görünür. Varlık denetiminin ucuz olmasının nedeni de budur — karşılaştırılan
küme bellidir ve denetim bir dizge sınamasından ibarettir.

## Aşırı Güvenin Sayısı

Üçüncü risk son sütunlarda okunur ve bu dersin en rahatsız edici sayısıdır. İlk koşumda yirmi
dört öneriden **11'i** kusurludur; taban pay **0,4583**. Geliştirici bu önerilerin **19'unu**
kabul eder. Kabul edilenlerin **10'u kusurludur**, yani kabul edilenlerdeki yanlış payı
**0,5263**. Kabul kararı, yanlış payını taban paya göre **düşürmemiştir**; hatta bu koşumda
biraz yükseltmiştir.

İkinci koşum aynı yapıyı daha düşük bir taban payla tekrarlıyor: kusurlu **6**, taban pay
**0,2500**, kabul yine **19**, kabul edilenlerdeki yanlış payı **0,2632**. İki koşumda da kabul
payı tabanın üzerinde ve iki sayı birbirine yakın. Buradan okunacak şey şudur: **kabul kararı
kusur hakkında bilgi taşımıyor.** Kabul edilenlerdeki yanlış oranı, öneri havuzundaki yanlış
oranıyla aynı yere düşüyor.

Son tablo bunu doğrudan sınıyor. Kusurlu önerilerde kabul oranı ilk koşumda **0,9091**, temiz
önerilerde **0,6923**; ikinci koşumda **0,8333** ve **0,7778**. Dört sayı da birbirine yakındır
ve kusurlu taraf hiçbir koşumda daha düşük değildir. Varsayım YG56 böylece sınanmış olur:
tek damgalık bir değişim hızlı bir okumada görülmüyor. Reddedilen beş öneriden **dördü** ise
temizdir; ret kararı da bilgi taşımaz, yalnız iş üretir.

Bedel üç yerde toplanır. Bağlam tarafında istek başına **94 belirteç** gider ve bunun bir payı
sır sınıfı alanlarıdır. Bağımlılık tarafında yirmi dört parçanın dokuzu incelemeye düşer.
Kabul tarafında ise bedel doğrudan kod tabanına yazılır: ilk koşumda **10 kusur** kabul edilmiş,
yani incelemeye giren yamaların içine geliştiricinin kendi kararıyla girmiştir. Önceki derste
kurulan üç denetim bu yüzden bir süs değildir; kabul kararının **arkasındaki** ikinci hattır.

## Özet

- Yirmi dört istek paketinde 456 bağlam satırının 168'i dört sır sınıfına girer: kimlik 48,
  erişim 48, konum 40, iletişim 32.
- Alan adına bakan süzgeç yapısal alanların hepsini çıkarır ama serbest metindeki 12 ize
  erişemez; gerçek kapsama 0,9333'tür.
- Süzgecin bedeli görünürdür: abone alanı çıkarıldığında ayrıştırıcının dört sütunundan biri
  örnekten düşer.
- Üretilen yirmi dört parçanın dokuzu var olmayan bir bağımlılık adı taşır ve bunlar yalnız dört
  ayrı ada dağılır; ikinci koşumda sayı 12 olur, ayrı ad sayısı değişmez.
- Kabul edilen on dokuz önerinin onu kusurludur; kabul edilenlerdeki yanlış payı 0,5263, taban
  pay 0,4583, ikinci koşumda 0,2632 ve 0,2500.
- Kusurlu ve temiz önerilerde kabul oranları birbirine yakındır ve kusurlu taraf hiçbir koşumda
  daha düşük değildir: kabul kararı kusur hakkında bilgi taşımaz.

## Sonraki Adım

Altı derste yardımcının kendisi ölçüldü: hangi görev sınıfında kabul edildiği, bağlamın neyi
kattığı ve nerede düşürdüğü, denetim noktasının hatayı nerede durdurduğu, üç denetimin neyi
yakaladığı, üretilen sınamanın neyi ayırt ettiği ve kabul kararının hiçbir şey ayırt etmediği.
Bu konu burada kapanır.

Kursun yirmi dersi boyunca sabit kalan bir şey vardı ve hiç sorgulanmadı: model her zaman
**uzakta** duran bir uç noktaydı. Çağrı ağa çıktı, sıraya girdi, hız sınırına takıldı, yarıda
kesildi, önbelleğe düştü ve belirteçle ödendi. Bağlam paketi de aynı yoldan çıktı ve içindeki
alanların sayılması gerekti. Uç noktayı **kendi donanımına** almak bütün bu sayıları başka bir
düzleme taşır: ağ gecikmesi ve hız sınırı gider, yerine bellek bütçesi, eşzamanlı istek sayısı
ve donanımın kendisi gelir. Sonraki konu bu takası ölçer ve ilk soruyu şöyle sorar: bir modeli
kendi barındırdığında bellekte tam olarak ne tutulur, ve o bütçe kaç eşzamanlı isteğe yeter.
