Ders 01 / 14
Yapay Zekâ Mühendisi Kimdir
Model eğitmeden ürün kurmanın ölçü biriminin kurulması: bir dil modeli benzeticisi yazılıyor ve verilmiş bir bileşenin yüzeyi beş sayıyla okunuyor. Aynı 120 kurgu destek talebinde düzeneksiz çağrı 0,6000 etiket isabeti ve 0,3833 etiketsiz yanıt payı veriyor, etiket kümesi ve biçim kısıtı eklenmiş küçük bir düzenek 0,7750 ile 0,0000 veriyor. Bedel yan yana yazılıyor: giriş belirteci 2300'den 5422'ye çıkıyor, çıkış belirteci 1353'ten 197'ye iniyor, çağrı sayısı 120'den 123'e çıkıyor ve doğru etiket başına belirteç 50,7'den 60,4'e yükseliyor.
İçindekiler
Önceki müfredat yüz yirmi bir derste bir modeli kurdu, ölçtü, açıkladı ve kime ne yaptığını saydı. Kapanışında bir eksik yazılıydı: bunların hepsi tek bir koşumda, tek bir makinede, bir defterin içinde oldu. Modelin bir sisteme dönüşmesi — sürüm alması, başkalarının çağırdığı bir yüz kazanması, bozulduğunda geri alınması ve maliyetinin sayılması — hiç ele alınmadı.
Bu müfredat oradan açılır ve bir şey daha ekler: model artık senin eğittiğin şey de değildir. Verilmiş, ağırlığını göremediğin, ayarını değiştiremediğin ve içine bakamadığın bir bileşendir. Elinde kalan tek şey onun çevresidir: ne söylediğin, yanına ne koyduğun, çıktısını nasıl okuduğun, ne zaman vazgeçtiğin. Bu müfredatın ölçtüğü şey model değil, o çevredir; adı düzenek olacak. Bu ders ölçünün birimini kurar ve yedi kurs boyunca kullanılacak dil modeli benzeticisini yazar.
- YA1. Bu müfredatın hiçbir dersinde gerçek bir model uç noktası çağrılmaz. Kod, standart kitaplıkla yazılmış bir benzeticiyi çağırır. Benzetici bir ürünü taklit etmez; bir uç noktanın ölçülebilir yüzeyini taşır.
- YA2. Benzeticinin belirteçleyicisi kurgudur: sözcükler boşlukta ayrılır ve beş damgadan uzun parçalar bölünür. Belirteçlemenin kendisi M27’nin doğal dil işleme kursunda ölçüldü ve burada tekrarlanmaz; burada belirteç yalnız bir bedel birimidir.
- YA3. Yüzey beş ölçüdür: giriş belirteci, çıkış belirteci, bağlam penceresi (240 belirteç), en büyük çıktı uzunluğu (24 belirteç) ve durum.
- YA4. Benzetici tohumla belirlenir (20260218). Aynı istem aynı tohumda aynı yanıtı verir; sayılar koşumdan koşuma oynamaz. Belirsizlik tohum değiştirilerek ölçülür.
- YA5. İki başarısızlık kurulur: hız sınırı çağrı sayısına bağlıdır (her otuz yedinci çağrı), zaman aşımı istem uzunluğuna bağlıdır. İkisi de başarısızlık payına girer.
- YA6. Destek talepleri kurgudur: 120 kayıt, beş konu, ve kayıtların bir bölümüne eklenen yanıltıcı bir cümle. M26 ve M27’nin bölgesel ölçüm ağı burada bir destek yardımcısına dönüşür.
- YA7. Benzeticinin iç işaret tablosunda birkaç yanıltıcı bağ vardır. Bir modelin sistematik olarak karıştırdığı kavram çiftlerinin kurgu karşılığıdır ve dışarıdan giderilemez.
- YA8. Ölçüt etiket isabetidir. Yanıttan bir etiket okunamazsa kayıt yanlış sayılır ve etiketsiz yanıt payında ayrıca gösterilir.
Modelin Ölçülebilir Yüzeyi
Verilmiş bir bileşen içinden ölçülemez. Ağırlığı görünmez, eğitim verisi bilinmez, kararının gerekçesi okunmaz. Geriye tek bir ölçüm yeri kalır: bileşenin dışarıya verdiği yüzey. Kaç belirteç girdi, kaç belirteç çıktı, sınır neredeydi, aynı girdi iki koşumda ne verdi, çağrı hangi durumla döndü. Kursun kuralı budur: verilmiş bir bileşen yüzeyinden ölçülür.
İlk blok bu yüzeyi kurar. Çağrılan şey bir dil modeli benzeticisidir; gerçek bir uç noktaya hiçbir istek gitmez.
# BENZETICI. Bu kod gercek bir model uc noktasi cagirmaz; standart kitaplikla yazilmis # bir dil modeli benzeticisidir. Destek talepleri de KURGU'dur. import math TOHUM, M32 = 20260218, 0xFFFFFFFF PENCERE, EN_UZUN = 240, 24 # baglam penceresi ve en buyuk cikti, belirtec 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): # istemin icerigine bagli, kosumdan bagimsiz iz 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"} # yaniltici baglar SERBEST = ["talebiniz {k} konusuyla ilgili gorunuyor", "bu kayit {k} basligina girer , ilgili ekibe yonlendirildi", "kaydiniz alindi , konuyu inceleyip donus yapacagiz"] SAYAC = [0] def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN): SAYAC[0] += 1 bel = belirtecle(istem) if len(bel) > PENCERE: return {"durum": "baglam_asimi", "giris": len(bel), "cikis": 0, "yanit": ""} if SAYAC[0] % 37 == 0: return {"durum": "hiz_siniri", "giris": len(bel), "cikis": 0, "yanit": ""} r = uretec(tohum ^ izno(istem)) if len(bel) > 90 and r() < 0.04: return {"durum": "zaman_asimi", "giris": len(bel), "cikis": 0, "yanit": ""} aday = [k for k in KAVRAM if k[:5] in bel] # istemde adi gecen kavramlar 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 if sicaklik <= 0.0: k = max(sorted(p), key=lambda a: p[a]) # en olasi secim else: e = [math.exp(p[a] / sicaklik) for a in sorted(p)] k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])] y = k if "tek" in bel else SERBEST[ayrik(r(), [0.42, 0.26, 0.32])].format(k=k) cb = belirtecle(y) if len(cb) > en_uzun: # durdurma kosulu cb = cb[:en_uzun] y = " ".join(cb) return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y} def oku(y): # yanittan etiket cikarma for s in y.lower().split(): if s in KONU: return s return None t = TALEP[0] b = belirtecle(t["metin"]) print(f"KURGU talep kumesi: {len(TALEP)} kayit, {len(KONU)} konu") print(f"ornek talep {t['no']}: {t['metin']}") print(f"belirtec sayisi {len(b)}, ilk alti parca {b[:6]}") s = cagir("Su destek talebini yanitla: " + t["metin"]) print(f"\ndurum {s['durum']}, giris {s['giris']} belirtec, cikis {s['cikis']} belirtec") print(f"yanit: {s['yanit']}") i1 = "Su destek talebini yanitla: " + TALEP[3]["metin"] for th in (TOHUM, TOHUM + 1): print(f"tohum {th}: {cagir(i1, tohum=th)['yanit']}") u = cagir("Su destek talebini yanitla: " + t["metin"], en_uzun=4) print(f"\nen buyuk cikti 4 belirtec: {u['yanit']}") uz = cagir(" ".join(x["metin"] for x in TALEP[:20])) print(f"pencereyi asan istem: durum {uz['durum']}, giris {uz['giris']} (sinir {PENCERE})")
KURGU talep kumesi: 120 kayit, 5 konu ornek talep 4001: planli kesinti duyurusu nereden takip edilir belirtec sayisi 11, ilk alti parca ['planl', 'i', 'kesin', 'ti', 'duyur', 'usu'] durum tamam, giris 18 belirtec, cikis 14 belirtec yanit: bu kayit kesinti basligina girer , ilgili ekibe yonlendirildi tohum 20260218: kaydiniz alindi , konuyu inceleyip donus yapacagiz tohum 20260219: bu kayit ariza basligina girer , ilgili ekibe yonlendirildi en buyuk cikti 4 belirtec: bu kayit kesin ti pencereyi asan istem: durum baglam_asimi, giris 266 (sinir 240)
Beş satırın her biri bir sınırı gösteriyor. Altı sözcüklük bir talep on bir belirteç ediyor; “duyurusu” tek başına iki parçaya bölünüyor. Eklemeli bir dilde sözcük sayısı ile belirteç sayısı aynı şey değildir ve bedel ikincisinden okunur.
Dördüncü ve beşinci satır bu müfredatın en rahatsız edici özelliğidir. Aynı istem, iki tohumda
iki ayrı yanıt verdi: birincisinde yanıt hiçbir etiket taşımıyor, ikincisinde ariza diyor.
Talebin gerçek konusu da ariza. Yani doğru yanıt bir kez çıktı, bir kez çıkmadı ve arada istem
hiç değişmedi. Bir bileşenin aynı girdiye iki ayrı yanıt vermesi, çevresine kurulacak her şeyin
gerekçesidir.
Son iki satır iki sert sınırdır. En büyük çıktı uzunluğu dörde indirildiğinde yanıt bu kayit kesin ti oluyor: durdurma koşulu etiketin ortasından kesti ve çıktı okunamaz hâle geldi.
Yirmi talep birleştirilip gönderildiğinde 266 belirteç bağlam penceresini aşıyor ve çağrı hiç
yanıt üretmeden dönüyor. İkisi de modelin “yanlış düşünmesi” değil, yüzeyin verdiği bir sayıdır.
Çıplak Çağrı ve Düzeneğin Farkı
Görev sabittir: 120 kurgu destek talebinin her biri beş konudan birine atanacak. İki yol yan yana konur. Çıplak çağrı en yalın kullanımdır — talebi olduğu gibi gönderip yanıtı okumak. Düzenek üç küçük parçadır: istemde etiket kümesini saymak, biçimi dayatmak ve okunamayan yanıtta bir kez yeniden denemek.
YONERGE = ("Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , " "kesinti . Yanit olarak tek etiket yaz . Talep: ") def olc(duzenek): SAYAC[0] = 0 g = c = d = bos = yd = hata = 0 for x in TALEP: istem = (YONERGE if duzenek else "Su destek talebini yanitla: ") + x["metin"] s = cagir(istem) g, c = g + s["giris"], c + s["cikis"] hata += s["durum"] != "tamam" e = oku(s["yanit"]) if e is None and duzenek: # bicim okunamadi: bir kez yeniden dene yd += 1 s = cagir(istem, tohum=TOHUM + 1) g, c = g + s["giris"], c + s["cikis"] hata += s["durum"] != "tamam" e = oku(s["yanit"]) bos += e is None d += e == x["konu"] return {"isabet": d / len(TALEP), "bos": bos / len(TALEP), "cagri": SAYAC[0], "giris": g, "cikis": c, "yeniden": yd, "hata": hata / SAYAC[0]} A, B = olc(False), olc(True) print(f"{'olcu':<22} {'ciplak cagri':>13} {'duzenekle':>11} {'fark':>9}") for ad, k, bic in (("etiket isabeti", "isabet", "{:.4f}"), ("etiketsiz yanit payi", "bos", "{:.4f}"), ("cagri sayisi", "cagri", "{:d}"), ("giris belirteci", "giris", "{:d}"), ("cikis belirteci", "cikis", "{:d}"), ("basarisizlik payi", "hata", "{:.4f}")): f = B[k] - A[k] print(f"{ad:<22} {bic.format(A[k]):>13} {bic.format(B[k]):>11} " f"{('{:+.4f}' if '.' in bic else '{:+d}').format(f):>9}") tA, tB = A["giris"] + A["cikis"], B["giris"] + B["cikis"] print(f"\ntoplam belirtec {tA} -> {tB} ({tB / tA:.2f} kat), yeniden deneme {B['yeniden']}") print(f"dogru etiket basina bedel: {tA / A['isabet'] / len(TALEP):.1f} -> " f"{tB / B['isabet'] / len(TALEP):.1f} belirtec")
olcu ciplak cagri duzenekle fark etiket isabeti 0.6000 0.7750 +0.1750 etiketsiz yanit payi 0.3833 0.0000 -0.3833 cagri sayisi 120 123 +3 giris belirteci 2300 5422 +3122 cikis belirteci 1353 197 -1156 basarisizlik payi 0.0250 0.0244 -0.0006 toplam belirtec 3653 -> 5619 (1.54 kat), yeniden deneme 3 dogru etiket basina bedel: 50.7 -> 60.4 belirtec
İlk satır düzeneğin kazancıdır: 0,6000’den 0,7750’ye, artış 0,1750. İkinci satır kazancın nereden geldiğini söylüyor. Çıplak çağrıda yanıtların 0,3833 payından hiçbir etiket okunamıyordu; ya yanıt beş etiketin dışında bir sözcükle kapanıyordu ya da “kaydınız alındı” biçiminde hiçbir konu adı taşımıyordu. Etiket kümesi isteme yazıldığında bu pay sıfıra iniyor. Kazanç modelin daha iyi düşünmesinden değil, cevabın okunabilir hâle gelmesinden geliyor.
Bedeli Yazılmayan Düzenek Ölçülmemiş Sayılır
Aynı tablonun alt yarısı bedeldir ve bu müfredatta üst yarısı kadar bağlayıcıdır. Giriş belirteci 2300’den 5422’ye çıktı: yönergeyi her talebin başına eklemek, istemin uzunluğunu iki katından fazla artırdı. Çıkış belirteci ters yöne gitti, 1353’ten 197’ye; tek sözcüklük yanıt üretmek, cümle üretmekten yedi kat ucuzdur. Çağrı sayısı 120’den 123’e çıktı; üç fazla çağrının hepsi hız sınırına takılıp yeniden denenen isteklerdir. Başarısızlık payı iki yolda da yaklaşık aynı kaldı, çünkü hız sınırı düzeneğin değil yüzeyin bir özelliğidir.
Son satır bu dersin asıl sayısıdır. Toplam belirteç 1,54 kat arttı. İsabet arttığı için doğru yanıt başına bedel bunun altında kalıyor, ama yine de 50,7 belirteçten 60,4 belirtece çıkıyor. Yani düzenek işe yaradı ve aynı anda pahalılaştı. İki sayıdan yalnız birini yazan bir rapor, ölçüm değil savunmadır. Müfredatın kuralı budur: bir yapay zekâ sisteminin sayısı, modelin sayısı değil düzeneğin sayısıdır; bedeli yazılmayan düzenek ölçülmemiş sayılır.
Yapay zekâ mühendisinin işi bu tabloda görünür. Model verilmiştir ve bu tabloda hiç değişmedi: aynı benzetici, aynı tohum, aynı ağırlık. Değişen tek şey çevresidir — isteme yazılan etiket kümesi, dayatılan biçim, okunamayan yanıtta verilen yeniden deneme kararı, ve gecikme sınıfının tek çağrıda tutulması. Yüz yirmi bir derste öğrenilen ayarlar burada elde değildir; onların yerine başka ayarlar vardır ve hepsi modelin dışında durur. Bir sonraki ders bu iki ayar kümesini yan yana koyup sayar.
Özet
- Verilmiş bir bileşen içinden ölçülemez, yüzeyinden ölçülür: giriş belirteci, çıkış belirteci, bağlam penceresi, durdurma koşulu ve durum. Bu müfredatın kodu bir benzetici çağırır.
- Model belirsiz bir bileşendir. Aynı istem iki tohumda iki ayrı yanıt verdi; birinde doğru etiket çıktı, öbüründe yanıt hiçbir etiket taşımadı.
- Aynı 120 kurgu talepte çıplak çağrı 0,6000 etiket isabeti veriyor ve yanıtların 0,3833 payından hiçbir etiket okunamıyor. Etiket kümesi, biçim kısıtı ve tek yeniden denemeden oluşan düzenek 0,7750 ve 0,0000 veriyor.
- Bedel yan yana yazılır: giriş belirteci 2300’den 5422’ye, çağrı 120’den 123’e çıkıyor, çıkış belirteci 1353’ten 197’ye iniyor, toplam belirteç 1,54 kat artıyor.
- Doğru etiket başına bedel 50,7’den 60,4 belirtece yükseliyor: düzenek hem işe yaradı hem pahalılaştı. Bedeli yazılmayan düzenek ölçülmemiş sayılır.
Sonraki Adım
Bu derste model hiç değişmedi ve bütün kazanç onun dışından geldi. Bu, önceki müfredatın tam tersidir: orada kazanç modelin içinden gelirdi ve dışarısı sabit tutulurdu. İki yaklaşım aynı problemi çözebilir, ama ellerinde tuttukları şey aynı değildir. Sonraki ders bunu sayar: aynı destek talebi probleminde eğiten yaklaşımın kaç ayarı vardır, kullanan yaklaşımın kaç ayarı vardır, bu ayarların kaçı sayıyı gerçekten oynatır, ve iki yaklaşımda hangi kararın kimde olduğu nerede ayrılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.