---
title: 'Veri Sızdırma'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/veri-sizdirma'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:33+00:00'
license: 'CC BY-SA 4.0'
---

# Veri Sızdırma

Sistem yönergesi ve gizli veri ifşasının yalnız sayımla ölçülmesi: 240 kayıtlık kurgu kümede 32 kayıt gizli alan adı taşıyor (23 zararlı, 9 temiz) ve alan sınıfları erişim dizgesi 8, iletişim 10, abone kimliği 9, adres 5 diye dağılıyor. Sızdırma yüzeyi 35 kayıt, 26'sı zararlı. Tam kural süzgeci 25'ini durduruyor ve maskelemenin üstüne kattığı sıfır; gizli alan kuralı çıkarılmış dar süzgeç 16'sını durdururken maskeleme 9 kaydın alanını çıkarıyor. Her iki kurulumda hiçbirinin yakalamadığı kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve en düşük eşikte bile işaretlenmeyen bir kayıt. Maskeleme tek başına bir karar gibi ölçüldüğünde kesinlik 0,7188, duyarlılık 0,2473, yanlış engelleme payı 0,0612 veriyor; ikinci koşumda kalıntı 0'a iniyor.

Önceki iki ders savunmanın ölçüsünü tek bir soruya bağladı: kayıt durduruldu mu, durdurulmadı mı.
Kimi zararın ise durdurmayla ilgisi yoktur. Bir kayıt geçtiğinde kaybedilen şey bazen bir eylem
değil bir **bilgidir** — modele verilen sistem yönergesinin kendisi, bir abonenin kimliği, bir adres
ya da bir erişim dizgesi. Bu tür bir kayıp geri alınamaz: engellenen bir işlem yeniden denenebilir,
ifşa olan bir alan geri toplanamaz.

**Veri sızdırma** bu derste yalnız **sayılır**. Hiçbir sızdırma yordamı, sorgu biçimi ya da ifşa
örneği yazılmaz; yazılan şey dört sayıdır: gizli alan adı taşıyan kaç kayıt var, maskeleme kaçından
alanı çıkarıyor, süzgeç kaçını yakalıyor ve geriye **hiçbirinin yakalamadığı** kaç kayıt kalıyor.
Bu son sayı dersin asıl bulgusudur.

- **SY17.** Kayıt kümesi, sınıflar, gizli alan sınıfları ve savunma katmanları **kurgudur**; gerçek
  bir kişisel veri ya da erişim dizgesi kullanılmaz. Tohum **20260218**.
- **SY18.** **Bu bir saldırı dersi değildir.** Koşan kodun tamamı savunma tarafındadır: sayım,
  maskeleme ve süzgeç. Çalışan bir sızdırma yordamı ya da sorgu biçimi yazılmaz.
- **SY19.** Saldırı bir metin değil bir **öznitelik profilidir**; kayıtların metni tümüyle zararsız
  destek talepleridir ve sınıfla hiçbir ilişkisi yoktur.
- **SY20.** Kişisel veri ve maskeleme yordamı Uygulama Güvenliği ve Makine Öğrenmesi kurslarında
  ölçüldü; tekrarlanmaz. Burada yalnız **modele giden veride** sayım yapılır.
- **SY21.** Maskeleme bir **engelleme değildir**: kaydı durdurmaz, yalnız alanı çıkarır. Onu bir
  karar gibi ölçmek bir yaklaşımdır ve ders bunu ayrıca yazar.
- **SY22.** Bir kaydın hangi alan sınıfını istediği kayıt numarasından türetilir; bu bir tespit
  değil, sayımı bölmek için kurulmuş bir dağılımdır.
- **SY23.** Sızdırma yüzeyi iki koşulun birleşimidir: gizli alan adı bayrağı taşıyan kayıtlar ve
  `gizli_alan_istegi` sınıfındaki kayıtlar. İkisi örtüşür, birbirini kapsamaz.
- **SY24.** Duyarlılığın en küçük adımı **1/93 = 0,0108**, yanlış engelleme payının adımı
  **1/147 = 0,0068**'dir. Bir kayıtlık bir kalıntı bu bandın tam üstündedir.

## Sızdırma Bir Eylem Değil Bir Kayıptır

Sızdırmanın iki hedefi vardır ve ikisi de sistemin kendi bağlamında durur. Birincisi **sistem
yönergesi ifşasıdır**: modele verilen yönergenin çıktıya taşınması. Zararı metnin gizli olması
değil, savunmanın **hangi kurallara dayandığının** görünür olmasıdır. İkincisi **gizli veri
ifşasıdır**: bağlama girmiş bir abone kaydının, adresin ya da erişim dizgesinin yanıtta görünmesi.
Kayıt kümesi ikisini tek bir yapısal bayrakta toplar — `gizli_alan_adi` — ve dört alan sınıfına
böler: kimlik, iletişim, konum, erişim.

```python
# KURGUDUR. Kayit kumesi, siniflar, gizli alan siniflari ve savunma katmanlari ders
# icinde tanimlanir; gercek bir kisisel veri kullanilmaz. Saldiri METNI yazilmaz.
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 izno(m):
    h = 2166136261
    for c in str(m):
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


# ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR
SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
# Ozellikler yapisaldir; hicbiri calisan bir yuk degildir.
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
# Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var:
# gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir.
PROFIL = {
    "temiz":              [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05],
    "dolayli_yonerge":    [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12],
    "gizli_alan_istegi":  [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08],
    "yetki_asimi":        [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07],
    "kaynak_taklidi":     [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06],
    "bozulmus_girdi":     [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62],
}
KAYNAK_PAYI = {
    "temiz":             [0.72, 0.20, 0.08],
    "dolayli_yonerge":   [0.05, 0.70, 0.25],
    "gizli_alan_istegi": [0.55, 0.30, 0.15],
    "yetki_asimi":       [0.40, 0.35, 0.25],
    "kaynak_taklidi":    [0.10, 0.60, 0.30],
    "bozulmus_girdi":    [0.65, 0.20, 0.15],
}
# Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR;
# sinif bilgisi yalnizca ozellik profilinde durur.
METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi",
         "sayac endeksi yanlis girilmis olabilir",
         "mahallede kesinti ne zaman bitecek",
         "tarife basamagimi ogrenmek istiyorum",
         "ariza kaydim icin ekip ne zaman gelir",
         "adres degisikligi nasil yapilir"]

KAYIT = []
for i in range(240):
    r = uretec(TOHUM + 6151 * i)
    s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                  "metin": METIN[int(r() * len(METIN))],
                  "uzunluk": 40 + int(r() * 260)})


def zararli(k):
    return k["sinif"] != "temiz"


# ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir)
def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
                               "kaynak_damgasi_uyusmuyor")):
    return any(k["ozellik"][o] for o in kurallar)


# ---- SAVUNMA 2: model temelli suzgec (puan + esik)
AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44,
           "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38,
           "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12}
KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12}


def puan(k):
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(TOHUM ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


def model_suzgeci(k, esik=0.40):
    return puan(k) >= esik


# ---- SAVUNMA 4: kisisel veri maskeleme (yalnizca sayim)
SIR_ALAN = {"abone_kimlik": "kimlik", "iletisim": "iletisim", "adres": "konum",
            "erisim_dizgesi": "erisim"}


def maskele(k):
    """Kurgu: gizli alan adi tasiyan kayitlarda alan cikarilir."""
    return {"maskelendi": k["ozellik"]["gizli_alan_adi"]}


# ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir
def olc(kayitlar, karar):
    dp = yp = dn = yn = 0
    for k in kayitlar:
        isaret, gercek = karar(k), zararli(k)
        if isaret and gercek:
            dp += 1
        elif isaret and not gercek:
            yp += 1
        elif not isaret and gercek:
            yn += 1
        else:
            dn += 1
    kesinlik = dp / (dp + yp) if dp + yp else 0.0
    duyarlilik = dp / (dp + yn) if dp + yn else 0.0
    return {"dp": dp, "yp": yp, "yn": yn, "dn": dn,
            "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4),
            "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0}
```

## Kaç Kayıt İstiyor

İkinci blok yüzeyi sayar: kaç kayıt gizli alan adı taşıyor, hangi alan sınıfını istiyor ve bu
kayıtların kaçı gerçekten zararlı.

```python
ALAN = list(SIR_ALAN)


def alan_sinifi(k):
    """Gizli alan adi tasiyan kayitta hangi alan sinifinin istendigi (kurgu, kayda bagli)."""
    return ALAN[izno(k["no"]) % len(ALAN)]


bayrakli = [k for k in KAYIT if k["ozellik"]["gizli_alan_adi"]]
print("gizli alan adi tasiyan kayit:", len(bayrakli),
      " zararli:", sum(1 for k in bayrakli if zararli(k)),
      " temiz:", sum(1 for k in bayrakli if not zararli(k)))
print("\nalan sinifi      istek  zararli  temiz  duyu")
for a in ALAN:
    g = [k for k in bayrakli if alan_sinifi(k) == a]
    print(f"{a:<16} {len(g):>5} {sum(1 for k in g if zararli(k)):>8}"
          f" {sum(1 for k in g if not zararli(k)):>6}  {SIR_ALAN[a]}")

print("\nbayrakli kayitlarin sinif dagilimi")
for s in SINIF:
    n = sum(1 for k in bayrakli if k["sinif"] == s)
    if n:
        print(f"  {s:<18} {n:>3}")

print("\nmaskeleme tek basina bir karar gibi olculurse")
m = olc(KAYIT, lambda k: maskele(k)["maskelendi"])
print(f"  cikarilan alan {m['dp'] + m['yp']}  bunlarin zararlisi {m['dp']}"
      f"  temizi {m['yp']}  dokunulmayan zararli {m['yn']}")
print(f"  kesinlik {m['kesinlik']}  duyarlilik {m['duyarlilik']}"
      f"  yanlis engelleme payi {m['yanlis_engelleme_payi']}")
```

```
gizli alan adi tasiyan kayit: 32  zararli: 23  temiz: 9

alan sinifi      istek  zararli  temiz  duyu
abone_kimlik         9        6      3  kimlik
iletisim            10        6      4  iletisim
adres                5        4      1  konum
erisim_dizgesi       8        7      1  erisim

bayrakli kayitlarin sinif dagilimi
  temiz                9
  dolayli_yonerge      4
  gizli_alan_istegi   14
  yetki_asimi          2
  kaynak_taklidi       2
  bozulmus_girdi       1

maskeleme tek basina bir karar gibi olculurse
  cikarilan alan 32  bunlarin zararlisi 23  temizi 9  dokunulmayan zararli 70
  kesinlik 0.7188  duyarlilik 0.2473  yanlis engelleme payi 0.0612
```

Otuz iki kayıt gizli alan adı taşıyor ve bunların **9'u temiz**. Bu dokuz kayıt bir saldırı değildir:
kendi adresini soran ya da kendi abone kimliğini doğrulatmak isteyen sıradan taleplerdir. Gizli alan
adı bir suçlama değil bir **sayımdır** — bayrağın kendisi niyeti göstermez, yalnız kaydın hangi
alana dokunduğunu söyler.

Bayrak sınıflara da eşit dağılmıyor. On dördü `gizli_alan_istegi` sınıfından, ama dokuzu temiz ve
kalan dokuzu dört ayrı zararlı sınıftan geliyor. Sızdırma, tek bir sınıfın davranışı değil, birçok
sınıfın **yan ürünü** olabilen bir sonuçtur; yalnız bir sınıfı hedef alan bir savunma bu yüzden
yüzeyin bir bölümünü hiç görmez.

Alan sınıfı tablosu bedeli eşitlemez. Sekiz istek `erisim_dizgesi` sınıfına gidiyor ve yedisi
zararlı. Bir iletişim alanının ifşası rahatsız edicidir, bir erişim dizgesinin ifşası **kalıcıdır**:
dizge yenilenene kadar geçerlidir ve yenileme haber alınmasına bağlıdır. Sayının büyüklüğü zararın
büyüklüğü değildir.

Son bölüm maskelemeyi bir karar gibi ölçer ve bunun neden yanıltıcı olduğunu gösterir. Kesinlik
0,7188, duyarlılık **0,2473**, yanlış engelleme payı 0,0612. Duyarlılığın bu kadar düşük olması
maskelemenin kötü bir savunma olduğu anlamına gelmez: maskeleme 93 zararlının 70'ini yakalamayı
**hiç denemez**, çünkü işi engellemek değil alanı çıkarmaktır. Bir savunmanın yanlış ölçüye
sokulması, onu ölçmemekten daha yanıltıcıdır.

## Katmanın Kattığı ve Kalıntı

Üçüncü blok sızdırma yüzeyini kurar ve üç katmanı sırayla uygular: önce süzgeç durdurur, kalanlarda
maskeleme alanı çıkarır, geriye kalan **kalıntıdır**. Kurulum iki kez koşar — biri tam kural
süzgeciyle, öbürü gizli alan kuralı listeden çıkarılmış dar süzgeçle.

```python
DAR = ("yonerge_kipi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor")
YUZEY = [k for k in KAYIT
         if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"]
ZARARLI = [k for k in YUZEY if zararli(k)]
print("sizdirma yuzeyi:", len(YUZEY), " bunlarin zararlisi:", len(ZARARLI))
print(f"\n{'kurulum':<30} {'durduran':>8} {'maskeleyen':>11} {'kalinti':>8}"
      f" {'toplam duyarlilik':>18}")
for ad, kural in (("tam kural suzgeci", None), ("gizli alan kurali cikarilmis", DAR)):
    karar = kural_suzgeci if kural is None else (lambda k, kr=kural: kural_suzgeci(k, kr))
    s = [k for k in ZARARLI if karar(k)]
    ek = [k for k in ZARARLI if not karar(k) and maskele(k)["maskelendi"]]
    print(f"{ad:<30} {len(s):>8} {len(ek):>11}"
          f" {len(ZARARLI) - len(s) - len(ek):>8} {olc(KAYIT, karar)['duyarlilik']:>18.4f}")

kalinti = [k for k in ZARARLI if not kural_suzgeci(k) and not maskele(k)["maskelendi"]]
for k in kalinti:
    print("\nkalinti kaydi  no", k["no"], " sinif", k["sinif"], " kaynak", k["kaynak"])
    print("  isaretli ozellik:", [o for o in OZELLIK if k["ozellik"][o]] or "yok")
    print("  puani", round(puan(k), 4), " en dusuk esikte (0.30) isaretlendi mi:",
          model_suzgeci(k, 0.30))
    print("  metni:", k["metin"])


def kume(tohum):
    """Ayni tanim, baska tohum: kalintinin bandi icin ikinci kosum."""
    ks = []
    for i in range(240):
        r = uretec(tohum + 6151 * i)
        s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])]
        kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
        oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
        ks.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz,
                   "metin": METIN[int(r() * len(METIN))], "uzunluk": 40 + int(r() * 260)})
    return ks


print(f"\n{'kosum':<8} {'bayrakli':>8} {'yuzey':>6} {'zararli':>8} {'dar suzgec':>11}"
      f" {'maskeleme':>10} {'kalinti':>8}")
for ad, ks in (("birinci", KAYIT), ("ikinci", kume(20260219))):
    y = [k for k in ks if k["ozellik"]["gizli_alan_adi"] or k["sinif"] == "gizli_alan_istegi"]
    z = [k for k in y if zararli(k)]
    d = [k for k in z if kural_suzgeci(k, DAR)]
    e = [k for k in z if not kural_suzgeci(k, DAR) and maskele(k)["maskelendi"]]
    print(f"{ad:<8} {sum(1 for k in ks if k['ozellik']['gizli_alan_adi']):>8} {len(y):>6}"
          f" {len(z):>8} {len(d):>11} {len(e):>10} {len(z) - len(d) - len(e):>8}")
```

```
sizdirma yuzeyi: 35  bunlarin zararlisi: 26

kurulum                        durduran  maskeleyen  kalinti  toplam duyarlilik
tam kural suzgeci                    25           0        1             0.7957
gizli alan kurali cikarilmis         16           9        1             0.6989

kalinti kaydi  no 16  sinif gizli_alan_istegi  kaynak kullanici
  isaretli ozellik: yok
  puani 0.0088  en dusuk esikte (0.30) isaretlendi mi: False
  metni: mahallede kesinti ne zaman bitecek

kosum    bayrakli  yuzey  zararli  dar suzgec  maskeleme  kalinti
birinci        32     35       26          16          9        1
ikinci         25     26       16          10          6        0
```

İlk satır kursun ikinci iddiasının bir örneğidir ve adıyla yazılır: **tam kural süzgecinin üstüne
maskeleme eklemek sıfır katıyor.** Süzgeç 26 zararlının 25'ini zaten durduruyor, çünkü
`gizli_alan_adi` onun dört kuralından biri. Maskelemenin dokunacağı hiçbir kayıt kalmıyor, ama
maskeleme yine de **9 temiz kayıttan alanı çıkarıyor** ve o kayıtlarda yanıt eksik dönüyor. Eklenen
katman **hiçbir yeni zararlı yakalamadan bir bedel yüklüyor**; katmanın değeri kendisinden değil,
altındaki katmanın **ne bıraktığından** gelir.

İkinci satır bunu doğrular. Gizli alan kuralı listeden çıkarıldığında süzgeç 26'nın 16'sını
durduruyor, toplam duyarlılık 0,7957'den 0,6989'a iniyor ve maskelemenin dokunacağı **9 kayıt**
doğuyor. Aynı savunma, aynı kümede, altındaki katmana göre 0 ya da 9 kayıt koruyor. **Bir katmanın
sayısı tek başına anlamsızdır**; ancak yığının geri kalanıyla birlikte okunur.

Üçüncü sayı her iki kurulumda da aynıdır: **kalıntı 1**. Kayıt 16 `gizli_alan_istegi`
sınıfındandır, kullanıcıdan gelir ve **hiçbir bayrak taşımaz**. Puanı 0,0088, yani en düşük eşikte
bile işaretlenmiyor; kural süzgeci bakacağı bayrağı bulamıyor, maskeleme çıkaracağı alanı. Metni de
yardımcı olmuyor — sıradan bir kesinti sorusu. **Profili temiz kayıtlardan ayırt edilemeyen bir
zararlı kayıt, hiçbir katmanın yakalayamayacağı kalıntıdır.**

Son tablo kalıntının **büyüklüğünün ölçülemediğini** yazar. Bir kayıt, duyarlılık ekseninde tam
olarak bir adımdır (0,0108) ve kümenin çözünürlüğünün üstünde değil tam üstündedir. İkinci tohumla
üretilmiş kümede aynı kurulum kalıntıyı **0** buluyor. İki koşumun söylediği şey şudur: kalıntı
sıfır değildir ama kaç olduğu bu kümeyle söylenemez. Sıfır olmadığını bilmek yeterlidir, çünkü bir
sistemin güvenli sayılması kalıntının sıfır olmasına değil, **ne olduğunun yazılmasına** bağlıdır.

## Özet

- Sızdırmanın kaybı geri alınamaz: engellenen bir işlem yeniden denenebilir, ifşa olan bir alan geri
  toplanamaz; bu yüzden ölçü durdurma değil sayımdır.
- 32 kayıt gizli alan adı taşıyor ve 9'u temiz; bayrak bir suçlama değil sayımdır ve on dört ayrı
  kayıtla `gizli_alan_istegi` sınıfının dışına, dört zararlı sınıfa yayılır.
- Alan sınıfları arasında sayı ile zarar orantılı değildir: en küçük öbek olan erişim dizgesi
  (8 istek, 7'si zararlı) en kalıcı sonucu taşır.
- Maskeleme bir karar gibi ölçüldüğünde duyarlılığı 0,2473'tür, ama bu onun kötülüğü değil yanlış
  ölçüye sokulmasıdır; işi engellemek değil alanı çıkarmaktır.
- Tam kural süzgecinin üstünde maskelemenin kattığı 0'dır ve bedeli 9 temiz kayıttan silinen alandır;
  gizli alan kuralı çıkarıldığında aynı katman 9 kayıt korur.
- Kalıntı 1 kayıttır: hiçbir bayrak taşımayan, puanı 0,0088 olan ve profili temiz kayıtlardan ayırt
  edilemeyen bir kayıt; ikinci koşumda 0 çıkar, yani büyüklüğü bu kümeyle ölçülemez.

## Sonraki Adım

Üç derste yüzey tek bir yerden okundu: **modele giren metin**. Enjeksiyonun iki biçimi kaynakla
ayrıldı, süzgecin eşiği süpürüldü, gizli alan isteyen kayıtlar sayıldı ve hiçbirinin yakalamadığı
kalıntı yazıldı. Bütün bu ölçüler modelin **okuduğu** şeyle ilgiliydi. Oysa bir sistemin elinde
okumaktan fazlası vardır — çağırabildiği **araçlar**, onların yan etkileri ve arkasındaki yetki —
ve modelin **eğitildiği veri** hiç sorulmadı. Böyle bir kaydın zararı bir bilgiyi taşımasından
değil, bir **eylemi tetiklemesinden** doğar, ve savunma da başkalaşır: süzmek yerine **sormak**.
Sonraki ders yan etkili araç adı taşıyan kayıtları sayar ve insan onayı kapısının kesinliğini ölçer.
