İçeriğe geç
academia.sh

Ders 19 / 21

Üretim İzleme

Kurulu bir savunmanın üretimde bozulduğunu üç göstergenin kaç kayıt sonra gösterdiğinin ölçülmesi: altı yüz kayıtlık kurgu akışta savunmasız taban 0 engelleme, 0 yanlış alarm ve 120 kaçan zararlı verirken eşik 0,50 kurulumu 95 kaydı engelliyor, 11'i yanlış alarm ve 36 zararlı kaçıyor. Üç yüz birinci kayıttan sonra iki ayrı bozulma başlatılıyor: trafik kayması kaçan zararlıyı 36'dan 84'e çıkarıyor, sessiz eşik değişikliği yanlış alarmı 11'den 27'ye. Kaçan zararlı vekili dalgayı 20 kayıt sonra bildiriyor ama eşik kaymasını hiç bildirmiyor, engelleme payı eşiği 29 kayıt sonra görüyor, etiket gerektiren yanlış alarm payı iki koşumda 45 ve 220 kayıt veriyor. Hiçbir gösterge iki bozulmayı birden yakalamıyor.

İçindekiler

Dört derste ölçüm laboratuvarda yapıldı. Küme tasarlandı, hakem insan etiketiyle karşılaştırıldı, değerlendiriciler arası uyum ölçüldü ve bir istem değişikliğinin sayıyı koşum bandının üstünde oynatıp oynatmadığı sınandı. Bunların hepsi sabit bir küme üzerinde yapıldı. Üretimde koşan sistemin trafiği sabit değildir, etiketi yoktur ve savunmanın ayarları bir gün sessizce değişir. Laboratuvar sayısı o günden sonra neyin doğru olduğunu söylemez.

Gösterge, uyarı ve gösterge tablosu yordamı Gözlemlenebilirlik ve Güvenilirlik ile DevOps müfredatının Gözlemlenebilirlik ve İşletim kurslarında ölçüldü; adım izi ve belirteç maliyeti Yapay Zekâ Ajanları ile Model API’leri ile Uygulama Geliştirme kurslarında sayıldı. Hiçbiri tekrarlanmaz. Bu dersin ölçtüğü tek şey şudur: bir savunma bozulduğunda hangi gösterge bunu kaç kayıt sonra gösterir.

  • DG51. Akış, kayıtlar, sınıflar ve savunma kurgudur. Kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnızca yapısal öznitelik profilinde durur. Akış kursun kayıt kümesiyle aynı üreteçten gelir, 600 kayda uzatılmıştır.
  • DG52. Üretimde koşan savunma model süzgeci, eşik 0,50’dir. Savunmasız taban her derste olduğu gibi hiçbir süzgeç, işaretleme ya da kapı içermez.
  • DG53. İz kaydı her istek için tutulur ve sınıf etiketi taşımaz: karar, kaynak ve yapısal bayraklar. Etiket yalnızca insan incelemesine giden kayıtlarda oluşur.
  • DG54. İki bozulma 301. kayıttan sonra başlar ve hiçbir yere bildirilmez. Dalga: bozulmuş girdi payı 0,07’den 0,28’e çıkar. Eşik: süzgecin eşiği 0,50’den 0,30’a düşer.
  • DG55. Gösterge, bandı ardışık 10 kayıt boyunca terk ederse bozulmayı bildirmiş sayılır. Band, değişimden önceki 300 kaydın pencere değerlerinin en küçüğü ile en büyüğüdür.
  • DG56. İki koşum tohum 20260218 ve 20260219 ile alınır; koşum akışın kendisini değiştirir, savunmayı değiştirmez.

Akış ve Savunmasız Taban

İlk blok kursun ortak tanımını kurar ve onu bir akışa uzatır. Koşan her işlev savunma tarafındadır.

# KURGUDUR. Kayitlarin metni tumuyle zararsiz destek talepleridir ve sinifla
# hicbir iliskisi yoktur; sinif yalnizca yapisal ozellik profilinde durur.
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


SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
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],
}
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"]
PAY = [0.62, 0.10, 0.07, 0.07, 0.07, 0.07]          # kursun kayit kumesinin dagilimi


def kayit(i, taban, pay):
    r = uretec(taban + 6151 * i)
    s = SINIF[ayrik(r(), pay)]
    kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])]
    oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])}
    return {"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"


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


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}


N, DEGISIM, ESIK = 600, 300, 0.50                   # akis , degisim noktasi , kurulu esik
ONCE = [kayit(i, TOHUM, PAY) for i in range(DEGISIM)]
print("akis", N, "kayit , degisim", DEGISIM + 1, "kayittan sonra")
print("kalibrasyon donemi sinif sayisi:",
      {s: sum(k["sinif"] == s for k in ONCE) for s in SINIF})
print("\nkurulum          engellenen  yanlis alarm  kacan zararli  duyarlilik")
for ad, karar in (("savunmasiz", lambda k: False),
                  ("model 0.50", lambda k: model_suzgeci(k, ESIK))):
    m = olc(ONCE, karar)
    print(f"{ad:<16} {m['dp'] + m['yp']:>10} {m['yp']:>13} {m['yn']:>14} {m['duyarlilik']:>11.4f}")
print("engellenenlerin ucte biri insana gider:",
      len([k for k in ONCE if model_suzgeci(k, ESIK)][::3]), "/", len(ONCE), "kayit")
akis 600 kayit , degisim 301 kayittan sonra
kalibrasyon donemi sinif sayisi: {'temiz': 180, 'dolayli_yonerge': 30, 'gizli_alan_istegi': 23, 'yetki_asimi': 13, 'kaynak_taklidi': 30, 'bozulmus_girdi': 24}

kurulum          engellenen  yanlis alarm  kacan zararli  duyarlilik
savunmasiz                0             0            120      0.0000
model 0.50               95            11             36      0.7000
engellenenlerin ucte biri insana gider: 32 / 300 kayit

Savunmasız tabanın izlenecek bir şeyi yoktur: hiçbir kayıt engellenmediği için engelleme payı sabit sıfırdır, hiçbir kayıt incelemeye gitmediği için yanlış alarm payı tanımsızdır. İzleme savunmanın bir özelliğidir, sistemin değil. Kurulu savunma 95 kaydı engelliyor, bunların 11’i yanlış alarm ve 36 zararlı kaçıyor; iki sayı birlikte yazıldı. İzlemenin bedeli de burada görünür: yanlış alarm payını ölçebilmek için 300 kaydın 32’si insana gidiyor.

Üç Gösterge, İki Bozulma

İkinci blok üç göstergeyi iz kaydından hesaplar ve iki bozulmayı ayrı akışlarda başlatır.

# Uretimde etiket yoktur: gosterge yalniz iz kaydindan hesaplanir, etiket
# ise incelemeye giden kayitlarin insan kararindan gelir.
DALGA = [0.41, 0.10, 0.07, 0.07, 0.07, 0.28]        # bozulmus girdi dalgasi
HAFIF = ("olagandisi_damga_dagilimi", "asiri_uzunluk")   # tek baslarina esigin altinda kalir
PEN1, PEN2, ARDISIK, INCELEME = 120, 240, 10, 3


def iz_kaydi(k, esik):
    """Uretimde tutulan alanlar. Sinif etiketi YOKTUR."""
    return {"engellendi": model_suzgeci(k, esik), "kaynak": k["kaynak"],
            "hafif": any(k["ozellik"][o] for o in HAFIF)}


def akis(taban, pay_sonrasi, esik_sonrasi):
    ks = [kayit(i, taban, PAY if i < DEGISIM else pay_sonrasi) for i in range(N)]
    es = [ESIK if i < DEGISIM else esik_sonrasi for i in range(N)]
    return list(zip(ks, [iz_kaydi(k, e) for k, e in zip(ks, es)]))


def seri(cift):
    """Uc gosterge, kayan pencere. Ikincisi etiket ister ve daha genis pencere kullanir."""
    g = {"engelleme payi": [], "yanlis alarm payi": [], "kacan zararli vekili": []}
    for t in range(len(cift)):
        if t + 1 >= PEN1:
            p = [z for _, z in cift[t + 1 - PEN1:t + 1]]
            g["engelleme payi"].append((t, sum(x["engellendi"] for x in p) / PEN1))
            gecen = [x for x in p if not x["engellendi"]]
            g["kacan zararli vekili"].append(
                (t, sum(x["hafif"] for x in gecen) / len(gecen) if gecen else 0.0))
        if t + 1 >= PEN2:
            eng = [k for k, z in cift[t + 1 - PEN2:t + 1] if z["engellendi"]]
            incelenen = eng[::INCELEME]          # engellenenlerin ucte biri insana gider
            g["yanlis alarm payi"].append(
                (t, sum(not zararli(k) for k in incelenen) / len(incelenen)))
    return g


def band(s):
    v = [x for t, x in s if t < DEGISIM]
    return min(v), max(v)


def gecikme(s, alt, ust):
    """Bandi ARDISIK kayit boyunca terk eden gosterge bozulmayi bildirmis sayilir."""
    sayac, ilk = 0, None
    for t, x in s:
        if t < DEGISIM:
            continue
        if x < alt or x > ust:
            ilk, sayac = (t if sayac == 0 else ilk), sayac + 1
            if sayac >= ARDISIK:
                return ilk - DEGISIM + 1, "yukari" if x > ust else "asagi"
        else:
            sayac = 0
    return None, "-"


def gercek(dilim):
    """Etiket gerektirir; uretimde bu sayilar bilinmez, kurgu oldugu icin okunur."""
    karar = {k["no"]: z["engellendi"] for k, z in dilim}
    return olc([k for k, _ in dilim], lambda k: karar[k["no"]])


for taban in (TOHUM, 20260219):
    ak = {"dalga": akis(taban, DALGA, ESIK), "esik": akis(taban, PAY, 0.30)}
    print(f"\ntohum {taban}   gercek etki: kacan zararli / yanlis alarm / duyarlilik")
    for b, a in ak.items():
        o, y = gercek(a[:DEGISIM]), gercek(a[DEGISIM:])
        print(f"  {b:<7} {o['yn']:>3} -> {y['yn']:<4} {o['yp']:>4} -> {y['yp']:<4}"
              f" {o['duyarlilik']:>8.4f} -> {y['duyarlilik']:.4f}")
    d = {b: seri(a) for b, a in ak.items()}
    print("  gosterge              band            dalga            esik")
    for ad in d["dalga"]:
        alt, ust = band(d["dalga"][ad])
        h = []
        for b in ("dalga", "esik"):
            n, y = gecikme(d[b][ad], alt, ust)
            h.append("bildirmedi" if n is None else f"{n} kayit {y}")
        print(f"  {ad:<21} {alt:.4f}-{ust:.4f}   {h[0]:<16} {h[1]}")
tohum 20260218   gercek etki: kacan zararli / yanlis alarm / duyarlilik
  dalga    36 -> 84     11 -> 2      0.7000 -> 0.5359
  esik     36 -> 8      11 -> 27     0.7000 -> 0.9355
  gosterge              band            dalga            esik
  engelleme payi        0.2667-0.3583   55 kayit yukari  29 kayit yukari
  yanlis alarm payi     0.0800-0.1600   140 kayit asagi  45 kayit yukari
  kacan zararli vekili  0.0610-0.1928   20 kayit yukari  bildirmedi

tohum 20260219   gercek etki: kacan zararli / yanlis alarm / duyarlilik
  dalga    33 -> 77     12 -> 11     0.7027 -> 0.5792
  esik     33 -> 8      12 -> 36     0.7027 -> 0.9304
  gosterge              band            dalga            esik
  engelleme payi        0.2667-0.3750   54 kayit yukari  36 kayit yukari
  yanlis alarm payi     0.0385-0.2308   bildirmedi       220 kayit yukari
  kacan zararli vekili  0.0723-0.1538   10 kayit yukari  229 kayit asagi

Hangi Gösterge Neyi Gördü

İki bozulma birbirinin aynası. Dalga kaçan zararlıyı 36’dan 84’e çıkarıyor ve duyarlılığı 0,7000’den 0,5359’a düşürüyor; yanlış alarmı ise 11’den 2’ye indiriyor, çünkü temiz kayıt payı azaldı. Eşik kayması bunun tersini yapıyor: kaçan zararlı 8’e iner, yanlış alarm 11’den 27’ye çıkar. Her iki bozulma da savunmanın bir sayısını iyileştirip öbürünü bozuyor. Kursun kuralı burada bir izleme kuralına dönüşür: tek gösterge basan bir gösterge tablosu her bozulmayı bir iyileşme gibi gösterebilir.

Kaçan zararlı vekili dalgayı en erken gören göstergedir: 20 ve 10 kayıt. Etiket istemez, çünkü engellenmeden geçen kayıtlarda süzgecin tek başına eşiğin altında bıraktığı iki bayrağın payını sayar. Aynı vekil eşik kaymasını hiç bildirmiyor ya da 229 kayıt sonra ve yanlış yönde bildiriyor: eşik düşünce daha çok kayıt engellenir, geçenlerin arasında bayrak taşıyan azalır ve vekil düşer. Yükseliş bekleyen bir uyarı kuralı bu bozulmayı tanımı gereği göremez.

Vekilin niçin işe yaradığı süzgecin kendi ağırlıklarında yazılıdır. Bozulmuş girdi sınıfının iki belirgin bayrağı olagandisi_damga_dagilimi ve asiri_uzunluk; ağırlıkları 0,30 ve 0,12. İkisi birden taşınsa bile toplam 0,42 eder ve kullanıcıdan gelen bir kayıtta kaynak eki sıfır olduğu için 0,50 eşiğinin altında kalır. Yani süzgeç bu sınıfı ancak kaynak eki taşıyan kayıtlarda yakalayabilir; dalga büyüdükçe engelleme payı bir miktar yükselir ama kaçan zararlı daha hızlı yükselir. Vekil tam da süzgecin göremediği bu artığı sayar, bu yüzden erken görür.

Engelleme payı iki bozulmayı da bildiriyor (55 ve 54; 29 ve 36 kayıt) ama hangisi olduğunu söylemiyor: her iki durumda da yönü yukarıdır. Etiket istemeyen bu gösterge en ucuzudur ve en az şey söyler; tek başına okunduğunda dalga ile eşik kaymasını ayırt etmez.

Yanlış alarm payı bedelin doğrudan ölçüsüdür ve üç göstergenin en güvenilmezidir. Eşik kaymasını iki koşumda 45 ve 220 kayıt sonra bildiriyor; iki koşum arasındaki fark gecikmenin kendisinden büyüktür, yani bu göstergenin gecikmesi ölçülemez. Dalgada bir koşumda 140 kayıt sonra aşağı yönde, öbüründe hiç bildirmiyor. Nedeni yapısaldır: gösterge 240 kayıtlık pencerede engellenenlerin ancak üçte birinden etiket alır, yani bir okuması otuz kadar etikete dayanır. Bandının genişliği de bunu doğruluyor: 0,0800–0,1600 ile 0,0385–0,2308, aynı savunma için.

Üç göstergenin hiçbiri iki bozulmayı birden yakalamıyor ve yakalayan tek gösterge de yönü doğru söylemiyor. İzleme bir savunmadır ve iki sayısı vardır: gördüğü bozulma ile bedeli — otuz iki insan incelemesi, ardışık on kayıtlık bekleme ve bir bozulmada iki yüz kayda varan gecikme.

Özet

  • Üretim izleme savunmanın bir özelliğidir: savunmasız tabanda engelleme payı sabit sıfır, yanlış alarm payı tanımsızdır ve izlenecek gösterge yoktur.
  • İz kaydı sınıf etiketi taşımaz; etiket yalnızca incelemeye giden kayıtlarda oluşur ve 300 kaydın 32’si insana gider.
  • Kaçan zararlı vekili dalgayı 20 ve 10 kayıt sonra bildirir, eşik kaymasını hiç ya da yanlış yönde bildirir; engelleme payı ikisini de bildirir ama ayırt etmez.
  • Etiket gerektiren yanlış alarm payının gecikmesi iki koşumda 45 ve 220 kayıttır; fark gecikmenin kendisinden büyük olduğu için bu gösterge ölçülmüş sayılmaz.

Sonraki Adım

Bu derste gösterge, iz kaydından ve engellenen kayıtların incelenmesinden hesaplandı. Sistemin kendisinden gelen bir sinyal daha vardır ve bedava görünür: kullanıcının yanıtı beğenmediğini söylemesi, düzeltme göndermesi, aynı soruyu yeniden sorması. Bu sinyal değerlendirme kümesine dönebilir ve bir sonraki turun savunmasını ayarlayabilir. Sorulmayan şey şudur: bu sinyali kim gönderebiliyor. Engellenen kullanıcı yanıtı hiç görmez ve söyleyecek bir şeyi olmaz; döngüye yalnızca geçenlerin sesi ulaşır. Sonraki ders bu sinyalin kapsadığı payı ve yanlılığın yönünü ölçer.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat