Ders 05 / 14
Belirteçler
Metnin modele giriş biriminin bir bedel birimi olarak ölçülmesi: 300 kurgu destek talebi 4.674 sözcük ve 8.334 belirteç ediyor, sözcük başına 1,7831; ek parçaları düşülünce 6.176 belirteç kalıyor ve eklerin payı 0,2589 çıkıyor. Altı kök yalın hâlde 6 belirteç, çoğul ve iyelik ekleri bindikçe 30 belirteç oluyor. Çıplak çağrı talep başına 27,78 belirteç ve 0,9722 alan isabeti verirken sık parçaları atan düzenek 0,50 eşiğinde 11,68 belirteçle aynı isabeti koruyor, 0,30 eşiğinde 6,23 belirtece iniyor ama isabet 0,8611'e düşüyor.
İçindekiler
Alan ve Roller konusu dört derste modele dışarıdan baktı: kimin neyi kurduğu, eğiten ile kullanan yaklaşımın elinde kaç ayar olduğu, aynı girdinin iki koşumda ne verdiği ve hangi iddianın bir sınamaya bağlanabildiği. Dördünde de model bir kutuydu ve kutunun kapağı hiç açılmadı. İçeride ne olduğu, hangi birimle çalıştığı ve sınırının nereden geldiği hiç sorulmadı.
Bu konu o soruyla açılır ve en alttan başlar. Bir dil modeline metin göndermek, aslında metni göndermek değildir: metin önce parçalara bölünür, her parça bir numaraya çevrilir ve model yalnız o numara dizisini görür. Bu parçaya belirteç (token) denir. Belirteç bir teknik ayrıntı değil, bu müfredatın bedel birimidir: pencere belirteçle ölçülür, ücret belirteçle sayılır, gecikme üretilen belirteç sayısıyla büyür. Kursun kuralı burada ilk kez işler — verilmiş bir bileşen yüzeyinden ölçülür ve bu dersin ölçtüğü yüzey belirteç sayısıdır.
- DL1. Destek talepleri kurgudur: ders içinde üretilir, tohum 20260218, hiçbir kaynak sistemden gelmez. Küme 300 kısa Türkçe taleptir.
- DL2. Model bir benzeticidir: ders içinde standart kitaplıkla yazılır, gerçek bir model uç noktası çağrılmaz. Taşıdığı yüzey belirteçleme, belirteç sayımı, bağlam penceresi, durdurma koşulu, en büyük çıktı uzunluğu ve tohuma bağlı belirsizliktir.
- DL3. Belirteçleyici de kurgudur: 177 parçalık bir sözlük ve soldan en uzun eşleşme. Belirteçleme yordamı, sözlük ve sözlük dışı kavramları M27’nin doğal dil işleme kursunda ölçüldü; yordam burada tekrarlanmaz, yalnız bedel birimi olarak okunur.
- DL4. Sözlükte karşılığı olmayan dizi tek karakterlere iner. Bu benzeticide sözlük dışı yoktur; bilinmeyenin bedeli belirteç sayısı olarak ödenir.
- DL5. Her talebin bir alan üçlüsü vardır: nesne, durum, istek. Üçlü kurgunun kendisinden bilinir; okuyucu yordam belirteç dizisinde ilk eşleşen kökü alır.
- DL6. Ölçüt her satırda aynıdır: talep başına belirteç (küçük iyi) ve alan isabeti (büyük iyi).
- DL7. Çıplak çağrı bu derste talebin olduğu gibi gönderilmesidir; düzenek, gönderilmeden önce metne uygulanan her işlemdir.
- DL8. Giriş belirteci koşumdan bağımsızdır: aynı metin her koşumda aynı sayıyı verir. Çıkış uzunluğu bağımsız değildir.
Metnin Modele Giriş Birimi
Benzeticinin belirteçleyicisi küçük bir parça sözlüğü taşır: alanın sık kökleri, sık ekler ve tek karakterler. Bir sözcük soldan taranır, her adımda sözlükte bulunan en uzun parça alınır, hiçbiri bulunmazsa tek karakter alınır. Noktalama kendi başına bir belirteçtir.
# BENZETICI — bu kursta model, ders icinde standart kitaplikla yazilmis bir # benzeticidir; gercek bir model uc noktasi cagrilmaz. Destek talepleri KURGUDUR # ve ders icinde uretilir, tohum 20260218. TOHUM, M32, TALEP = 20260218, 0xFFFFFFFF, 300 KOK = """sayac kapak muhur vana abone adres fatura tarife odeme borc ariza kod okuma olcum servis ekip ziyaret kayit talep destek hat bakim birim gun ay yil saat numara bilgi islem sistem hata sonuc deger endeks sozlesme kampanya indirim gecikme faiz itiraz basvuru sikayet cevap bekle gonder geri ac kapa oku yaz bul bak gel ver yap don calis bozuk kirik eksik normal yuksek dusuk yeni eski acik kapali lutfen merhaba tesekkur iyi rica eder mumkun tekrar hala durum konu ile icin ve bir bu ne var yok ama kadar sonra once ben biz siz""".split() EK = """lari leri lar ler nin nun den dan de da te ta iniz unuz imiz umuz in un im um si su li lu di du ti tu miz niz yor mis dir tir cek cak ki ya ye yi yu ma me ni nu la le i u e a""".split() PARCA = set(KOK) | set(EK) | set("abcdefghijklmnopqrstuvwxyz0123456789") NOKTA = ".,:;?-/" 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 parcala(s): p, i = [], 0 while i < len(s): for j in range(min(len(s), i + 9), i, -1): if s[i:j] in PARCA: p.append(s[i:j]) i = j break else: p.append(s[i]) i += 1 return p def belirtecle(metin): b, g = [], "" for c in metin.lower(): if c.isalnum(): g += c else: if g: b += parcala(g) g = "" if c in NOKTA: b.append(c) return b + (parcala(g) if g else []) NESNE = {"fatura": ("faturamizin", ["yuksek", "yuksek", "eksik"]), "tarife": ("tarifemizin", ["yuksek", "eski", "yuksek"]), "endeks": ("endeksimizin", ["yuksek", "dusuk", "eksik"]), "sayac": ("sayacimizin", ["bozuk", "kirik", "eski"]), "kapak": ("kapaginin", ["kirik", "eksik", "acik"]), "vana": ("vananin", ["kapali", "bozuk", "acik"]), "hat": ("hattimizin", ["kapali", "bozuk", "eski"]), "odeme": ("odememizin", ["eksik", "gecikmeli", "yuksek"])} NESNE_AGIRLIK = [0.20, 0.14, 0.12, 0.14, 0.10, 0.09, 0.11, 0.10] ISTEK = {"gonder": "ekip gonderin", "ac": "kayit acin", "ver": "bilgi verin", "don": "geri donun"} KALIP = ["{a} {n} durumu {d} ve bu konuda hala bir cevap yok. {i} lutfen. {k}.", "{a} {n} durumu {d} ve tekrar yazdim ama sonuc yok. {i} lutfen. {k}.", "{a} {n} durumu {d} ve bu ay ikinci basvurum. {i} lutfen. {k}."] ACILIS = ["Merhaba,", "Iyi gunler,", "Merhaba,", "Iyi gunler,"] KAPANIS = ["Tesekkur ederim", "Rica ederim", "Tesekkur ederim", "Iyi gunler"] NESNE_AD, ISTEK_KOK = list(NESNE), list(ISTEK) VERI = [] for i in range(TALEP): r = uretec(TOHUM + i) n = NESNE_AD[ayrik(r(), NESNE_AGIRLIK)] uzun_ad, durumlar = NESNE[n] d = durumlar[int(r() * 3)] k = ISTEK_KOK[int(r() * 4)] metin = KALIP[int(r() * 3)].format(a=ACILIS[int(r() * 4)], n=uzun_ad, d=d, i=ISTEK[k], k=KAPANIS[int(r() * 4)]) VERI.append({"metin": metin, "alan": (n, belirtecle(d)[0], k)}) print(f"{TALEP} kurgu destek talebi, benzeticinin sozlugu {len(PARCA)} parca") for i in (0, 2, 7): b = belirtecle(VERI[i]["metin"]) print(f"\n{VERI[i]['metin']}") print(f" {len(VERI[i]['metin'].split())} sozcuk, {len(b)} belirtec") print(" " + " ".join(b[:12]) + " ...")
300 kurgu destek talebi, benzeticinin sozlugu 177 parca Iyi gunler, odememizin durumu gecikmeli ve tekrar yazdim ama sonuc yok. geri donun lutfen. Iyi gunler. 16 sozcuk, 29 belirtec iyi gun ler , odeme miz in durum u gecikme li ve ... Merhaba, tarifemizin durumu yuksek ve bu konuda hala bir cevap yok. kayit acin lutfen. Iyi gunler. 16 sozcuk, 26 belirtec merhaba , tarife miz in durum u yuksek ve bu konu da ... Iyi gunler, vananin durumu bozuk ve bu konuda hala bir cevap yok. ekip gonderin lutfen. Tesekkur ederim. 17 sozcuk, 27 belirtec iyi gun ler , vana nin durum u bozuk ve bu konu ...
On altı sözcüklük bir talep 29 belirteç ediyor. Fark tek yerden gelmiyor: noktalama ayrı sayılıyor,
odememizin üç parçaya bölünüyor, gecikmeli ikiye. Bir metnin uzunluğunu sözcükle tahmin etmek,
bu birimde sistematik olarak eksik saymaktır.
Eklemeli Yapının Bedeli
Türkçe eklemeli bir dildir: bir köke ardışık ekler binerek tek sözcükte bir cümle kurulabilir. Bu, okuyan için kısalık, belirteç sayan için bedeldir. Altı kök altı çekim basamağında ölçülür.
BICIM = { "sayac": "sayac sayaclar sayacimiz sayacimizin sayaclarimizin sayaclarimizdaki", "kapak": "kapak kapaklar kapagimiz kapaginin kapaklarimizin kapaklarimizdaki", "fatura": "fatura faturalar faturamiz faturamizin faturalarimizin faturalarimizdaki", "odeme": "odeme odemeler odememiz odememizin odemelerimizin odemelerimizdeki", "tarife": "tarife tarifeler tarifemiz tarifemizin tarifelerimizin tarifelerimizdeki", "abone": "abone aboneler abonemiz abonemizin abonelerimizin abonelerimizdeki", } BASLIK = ("yalin", "cogul", "iyel", "iyel+", "cog+", "cog++") print(f"{'kok':<8} " + " ".join(f"{b:>5}" for b in BASLIK)) top = [0] * 6 for k, s in BICIM.items(): n = [len(belirtecle(b)) for b in s.split()] top = [a + b for a, b in zip(top, n)] print(f"{k:<8} " + " ".join(f"{x:>5}" for x in n)) print(f"{'toplam':<8} " + " ".join(f"{x:>5}" for x in top)) sozcuk = sum(len(x["metin"].split()) for x in VERI) bel = sum(len(belirtecle(x["metin"])) for x in VERI) kok_bel = sum(len([b for b in belirtecle(x["metin"]) if b not in EK]) for x in VERI) print(f"\n{TALEP} talep: {sozcuk} sozcuk, {bel} belirtec, oran {bel / sozcuk:.4f}") print(f"ek parcalari dusulunce {kok_bel} belirtec, oran {kok_bel / sozcuk:.4f}") print(f"eklerin payi {(bel - kok_bel) / bel:.4f}")
kok yalin cogul iyel iyel+ cog+ cog++ sayac 1 2 2 3 4 5 kapak 1 2 3 4 4 5 fatura 1 2 2 3 4 5 odeme 1 2 2 3 4 5 tarife 1 2 2 3 4 5 abone 1 2 2 3 4 5 toplam 6 12 13 19 24 30 300 talep: 4674 sozcuk, 8334 belirtec, oran 1.7831 ek parcalari dusulunce 6176 belirtec, oran 1.3214 eklerin payi 0.2589
Altı kök yalın hâlde 6 belirteç, tam çekimli hâlde 30 belirteç: aynı altı kavram beş katına
çıkıyor. Sözcük sayısı hiç değişmedi, değişen tek şey eklerdir. kapak satırı bir ayrıntıyı da
gösteriyor: kapagimiz biçiminde ünsüz yumuşadığı için kök artık sözlükteki kapak parçasıyla
eşleşmiyor ve bir belirteç fazla ödeniyor.
Küme düzeyinde oran 1,7831’dir: her sözcük ortalama 1,78 belirteç ediyor. Ek parçaları dizinden düşüldüğünde 8.334 belirteç 6.176’ya iniyor; eklerin payı 0,2589. Aynı bilgiyi eklemeli olmayan bir dilde yazmak bu payı büyük ölçüde silerdi. Bu, dil hakkında bir yargı değil, bir bütçe bilgisidir: aynı pencere Türkçe metnin daha azını alır.
Aynı Bilgi Kısaltıldığında
Talebin taşıdığı bilgi üç alandır: nesne, durum, istek. Nezaket kalıpları, bağlaçlar ve tekrar cümleleri bu üçünü değiştirmez ama belirteç öder. Bir düzenek kurulabilir: belge sıklığı bir eşiği aşan parçaları at. Sık geçen parça ayırt etmez, seyrek geçen eder.
BELGE = [belirtecle(x["metin"]) for x in VERI] df = {} for b in BELGE: for t in set(b): df[t] = df.get(t, 0) + 1 / TALEP DURUM_KOK = {belirtecle(d)[0] for _, ds in NESNE.values() for d in ds} def alan_oku(b): def ilk(kume): return next((t for t in b if t in kume), None) return (ilk(set(NESNE_AD)), ilk(DURUM_KOK), ilk(set(ISTEK_KOK))) def kisalt(b, esik): return [t for t in b if df[t] < esik] def cagir(belirtec, tohum, en_buyuk=40): """Benzetici adim adim uretir; durdurma kosuluna ya da en buyuk cikti uzunluguna varinca durur. Cikis uzunlugu tohuma baglidir.""" r, taban, y = uretec(tohum + len(belirtec)), 6 + len(belirtec) // 3, 0 while y < en_buyuk and (y < taban or r() >= 0.32): y += 1 return {"giris": len(belirtec), "cikis": y, "durdurma": "sinir" if y == en_buyuk else "kosul"} def olc(ad, bl): dogru = sum(sum(a == b for a, b in zip(alan_oku(b), VERI[i]["alan"])) for i, b in enumerate(bl)) g = sum(len(b) for b in bl) print(f"{ad:<26} {g:>6} {g / TALEP:>8.2f} {dogru / (3 * TALEP):>8.4f}") print(f"{'duzenek':<26} {'belirtec':>6} {'talep':>8} {'alan':>8}") olc("ciplak cagri", BELGE) olc("sik parcayi at (0,50)", [kisalt(b, 0.50) for b in BELGE]) olc("sik parcayi at (0,30)", [kisalt(b, 0.30) for b in BELGE]) k = kisalt(BELGE[2], 0.50) print("\n" + " ".join(BELGE[2])) print(" ".join(k)) for t in (TOHUM, TOHUM + 1): y = cagir(k, t) print(f"tohum {t} giris {y['giris']} belirtec cikis {y['cikis']} belirtec" f" durdurma {y['durdurma']}")
duzenek belirtec talep alan ciplak cagri 8334 27.78 0.9722 sik parcayi at (0,50) 3505 11.68 0.9722 sik parcayi at (0,30) 1868 6.23 0.8611 merhaba , tarife miz in durum u yuksek ve bu konu da hala bir cevap yok . kayit ac in lutfen . iyi gun ler . merhaba tarife yuksek konu da hala bir cevap kayit ac tohum 20260218 giris 10 belirtec cikis 11 belirtec durdurma kosul tohum 20260219 giris 10 belirtec cikis 10 belirtec durdurma kosul
Üçlü buradan okunur. Çıplak çağrı talep başına 27,78 belirteç harcar ve alan isabeti 0,9722’dir. Düzenek 0,50 eşiğinde talep başına 11,68 belirtece iner — kazanç 0,5794 — ve isabeti hiç düşürmez: atılan on altı parçanın tamamı nezaket kalıbı, bağlaç ya da çekim ekidir. Bedel bir ön işleme adımı, bir sıklık tablosu ve okunabilirliğin kaybıdır; sayı düşmediği için bu düzenek işe yarar.
Eşik 0,30’a çekildiğinde tablo döner. Belirteç 6,23’e iner, kazanç 0,7759 olur, ama isabet
0,8611’e düşer: yuksek durumunun belge sıklığı 0,3333’tür ve eşiğin üstünde kaldığı için atılır.
En sık durum aynı zamanda en çok sorulan durumdur. Düzenek eklemek her zaman iyileştirmez, ve
iyileştirip iyileştirmediği ancak bedeliyle birlikte yazıldığında görülür.
Çıplak çağrının 0,9722’de kalması da bir bulgudur. Kaçırılan 25 alanın tamamı kapak nesnesidir:
kapaginin biçiminde kök yumuşadığı için belirteç dizisinde kapak parçası hiç görünmez. Eklemeli
yapı yalnız sayıyı büyütmez, kökü belirteç akışından silebilir de.
Son iki satır belirsizliği ayırır. Aynı istem iki ayrı tohumla çağrıldığında giriş belirteci ikisinde de 10’dur — belirteçleme bir yordamdır, koşumdan bağımsızdır. Çıkış 11 ve 10’dur ve ikisi de durdurma koşuluyla bitmiştir. Modelin yüzeyinde sayılabilen iki büyüklükten biri koşumdan bağımsızdır, öteki değildir; bütçe hesabı bu ayrımın üstüne kurulur.
Özet
- Belirteç metnin modele giriş birimidir ve bu müfredatın bedel birimidir. Benzetici 177 parçalık bir sözlükle soldan en uzun eşleşmeyi uygular; talepler kurgudur, tohum 20260218.
- Aynı 300 talep 4.674 sözcük ve 8.334 belirteç eder: sözcük başına 1,7831. Sözcük sayısıyla yapılan tahmin bu birimde sistematik olarak eksik sayar.
- Eklemeli yapı ölçülebilir bir bedeldir: altı kök yalın hâlde 6, tam çekimli hâlde 30 belirteç eder ve küme düzeyinde eklerin payı 0,2589’dur.
- Çıplak çağrı talep başına 27,78 belirteç ve 0,9722 alan isabeti verir. Sık parçaları 0,50 eşiğiyle atan düzenek 11,68 belirtece iner ve isabeti korur; 0,30 eşiği 6,23 belirtece iner ama isabeti 0,8611’e düşürür.
- Giriş belirteci koşumdan bağımsızdır, çıkış uzunluğu değildir: aynı istem iki tohumda 10 giriş, 11 ve 10 çıkış belirteci verir.
Sonraki Adım
Metin belirteçlere bölündü ve her belirtecin bir bedeli olduğu sayıldı. Ortada hâlâ yalnız bir dizi var: modelin bu diziyle ne yaptığı, bir belirtecin yüz belirteç öncesindeki bir başkasıyla nasıl ilişkilendirildiği sorulmadı. Sonraki ders dikkat mekanizmasının niçin uzak bağlamı kullanabildiğini kavramsal düzeyde ele alır ve bunun bedelini sayar: bağlam uzadıkça karşılaştırma sayısı nasıl büyüyor, ve sabit bir pencereyle yetinen ucuz bir yordam hangi uzaklıkta çöküyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.