Ders 20 / 26
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.
İçindekiler
Ö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,
importsatı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.
# 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.
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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.