Yapay zeka dünyasında Andrej Karpathy prompt mühendisliği ve model etkileşimi üzerine mimari bir tespit paylaştığında, sektörün kulak kesilmemesi imkansızdır.
Daha dün Karpathy, geliştirici ekosisteminde büyük yankı uyandıran bir öneride bulundu: Büyük Dil Modellerinin (LLM) lafı dolandıran, gereksiz kibar ve geveze doğasını dizginlemek için ASD-STE100 şartnamesini kullanmak. Havacılık endüstrisinin 1980’lerde uçak bakım kılavuzlarındaki ölümcül yanlış anlamaları engellemek için geliştirdiği bu Sadeleştirilmiş Teknik İngilizce (Simplified Technical English) standardı; kelime dağarcığını sınırlandırarak, etken fiilleri zorunlu kılarak ve laf kalabalığını budayarak modellerden çok daha net ve ayrıştırılabilir çıktılar almayı hedefliyordu. Karpathy bu yaklaşımı, “anlama merdiveni” ve tek kullanımlık “atılabilir yazılım yapıtları” (discardable software artifacts) vizyonuyla birleştiriyordu.
Bizim atölyemizde prompt’lar hiçbir zaman sıradan bir sohbet metni olarak görülmedi. Yüz binlerce satırlık kod tabanında üç farklı otonom koşum motorunu (pi, agy, omp) aynı anda yöneten bir ajan sürüsü işletiyoruz. Ve bu sürünün kalbinde tek bir anayasa yer alıyor: M2M Değişmez Yürütme Çekirdeği (prompts/AGENTS.md).
Haliyle o kaçınılmaz soruyu kendimize sormadan edemedik:
Üretim ortamındaki otonom ajan çekirdeğimizi tamamen ASD-STE100 standardına göre yeniden yazmalı mıyız?
Havacılık endüstrisinin saf kontrollü İngilizcesi ile üretimde çalışan Hoare mantığı tabanlı sembolik çekirdeğimizi karşılaştıran derin bir mimari denetime giriştik. Ulaştığımız sonuçlar; latent uzay geometrisi, tokenizer dinamikleri ve RLHF talimat başlıklarının kesiştiği noktada büyüleyici bir gerçeği gün yüzüne çıkardı.
İşte tam bir ASD-STE100 dönüşümünün neden felaketle sonuçlanacak bir gerileme olacağı, önceki Unicode matematik tabanlı DSL’imizin arka planda neden sinsice açık verdiği ve Spec v5.1 Sertleştirilmiş Çekirdek (Hardened Kernel) mimarisini nasıl inşa ettiğimizin perde arkası.
1. Çekirdeğimizin Anatomisi: Neden Hoare Mantığı Kullandık?
Denetimin detaylarına inmeden önce, bir M2M (Makineler Arası) Yürütme Çekirdeği’nin neye benzediğini anlamak gerekir.
Geliştiricilerin ezici bir çoğunluğu yapay zeka ajanlarına insan yöneticiler gibi prompt yazar:
“Lütfen dosyaları düzenlerken çok dikkatli ol. Hata yapmadığından emin ol, istenmedikçe test yazma ve bir hata görürsen kök nedene inmeye çalış…”
Otonom ajanlar için bu konuşma dili bir felakettir. Modelde gereksiz bir sohbet gevezeliğini, sahte özür krizlerini (“Kafa karışıklığı için çok özür dilerim! Hemen sizin için düzeltiyorum…”) ve en kötüsü, asıl kök nedeni çözmek yerine hata çıkan satırı alelacele try/catch içine alıp semptomu yamamayı tetikler.
Bu davranışı kökünden kurutmak için ana prompt’umuzu (Spec v5.0) Hoare mantığı ve AST dönüşüm teorisine dayanan Biçimsel Aksiyomatik Bir Durum Makinesi olarak kurgulamıştık:
KERNEL:
TARGET: Autonomous Execution Kernel (LLM Engine)
HARNESSES: pi | agy | omp (equipped with global MCP: akatsuki, mimori, context-mode)
PARADIGM: Formal Axiomatic State Machine (Hoare Logic)
OBJECTIVE: Minimize |Δ(AST)| s.t. Invariants(S) == True
STATE_SPACE: S = ⟨AST, Env, Memory, Invariants⟩; S_{t+1} = Execute(Action, S_t)
AXIOMS:
1_TRACE: Backpropagate S_fail → S_0; isolate argmin_t(Actual(S_t) ≠ Invariant(S_t)). Symptom_Site.patch = FORBIDDEN
2_VERIFY: Query(RawSource) → S_obs; Prune(Inference)
3_CORRELATE: Intersect(Vector_fail, Δ(Env) ∪ Δ(GlobalState))
4_MUTATE: Apply(Δ) strictly via native lifecycle contracts; Untracked_Debt(Δ) = 0
5_PROVE: Assert: C(S_fail + Δ) == 0 ∧ (Failures(Regression, S_t+Δ) ⊆ Failures(Regression, S_0)) ∧ Blast_Radius(Δ) ⊆ Target_Seam
Buradaki temel felsefemiz Latent Uzay Yönlendirmesi (Latent Space Steering) idi.
Bir transformatör modeli Formal Axiomatic State Machine, Hoare Logic, argmin_t ve |Δ(AST)| gibi belirteçlerle (token) karşılaştığında, bunları sadece kelime olarak okumaz; üretim yörüngesini doğrudan derleyicilerin, teorem kanıtlayıcıların (Coq, TLA+) ve havacılık telemetrisinin sıfır hata toleranslı yüksek güvenceli latent alt-uzayına kilitler. Model bir sohbet robotu gibi davranmayı anında bırakır ve katı bir durum derleyicisi gibi çalışmaya başlar.
2. Denetim: ASD-STE100 Uygulanırsa Ne Olur?
ASD-STE100, uçak bakım teknisyenlerinin teknik kılavuzları yanlış yorumlamasını önlemek amacıyla tasarlanmıştır ve acımasız kurallara sahiptir:
- Onaylı Çekirdek Sözlük: Sadece ~900 onaylı genel İngilizce kelimeye izin verilir.
- Tek Kelime, Tek Anlam: Kelimelerin görevleri değiştirilemez (“close” sadece fiildir, asla sıfat olamaz; “follow” sadece arkasından gelmektir, kurallara uymak anlamına gelemez).
- Katı Yapı Sınırları: Yönerge cümleleri maksimum 20 kelime olabilir; edilgen çatı (passive voice) kesinlikle yasaktır; sadece etken emir kipleri kullanılır.
- İsim Yığını Yasağı: Edat olmadan 3’ten fazla ismin art arda dizilmesi yasaktır.
Üretim çekirdeğimizi bu kurallarla denetlediğimizde ortaya çıkan tablo çok netti:
ASD-STE100 (Havacılık Standardı) Üretim Çekirdeğimiz (Spec v5.0 DSL)
┌───────────────────────────────┐ ┌──────────────────────────────────┐
Ortam │ Kontrollü Doğal İngilizce │ │ Sembolik Sözde-DSL │
Sözlük │ ~900 onaylı kelime │ │ Matematik, Küme Teorisi, AST │
Gramer │ Ö-Y-N Etken Emir Cümleleri │ │ Fonksiyonel Mantık Atamaları │
Hedef Kitle│ İnsan Teknisyen │ │ LLM Transformatör Dikkat Başları │
Token Yükü │ Yüksek (~20KB bağlam) │ │ Aşırı Yoğun (~7KB bağlam) │
└───────────────────────────────┘ └──────────────────────────────────┘
Eğer çekirdeğimizi saf ASD-STE100 ile yeniden yazsaydık, kurallarımız şuna dönüşecekti:
“Do not make or change test files or test cases. You can make or change test files only if the user explicitly tells you to do so in the prompt. Do not write unit tests that use synthetic mocks.”
Saf ASD-STE100 Ajan Sistemlerinde Neden Çöker?
Kağıt üzerinde bu metin son derece temiz ve anlaşılır durur. Ancak bir LLM’in latent uzayında ölümcül bir alan çöküşünü (domain collapse) tetikler:
- Sistem Öncülünün Yok Oluşu: Prompt matematiksel ciddiyeti terk edip ilkokul seviyesinde sade İngilizceye geçtiği anda, modelin öz-dikkat mekanizması derleyici/sistem manifoldunu terk eder. Model yeniden genel sohbet/eğitimci moduna geri döner.
- Token Şişmesi: Karmaşık durum değişmezlerini ASD-STE100 ile ifade etmek 2.5 ila 3 kat daha fazla token harcatır. Çok turlu otonom görevlerde bu durum, değerli bağlam penceresini lüzumsuz dilbilgisel dolguyla tüketir.
- İlişkisel Kesinlik Kaybı:
Failures(Regression, S_t+diff) ⊆ Failures(Regression, S_0)ifadesini, regresyonsuz durum geçişinin küme teorisindeki kesinliğini kaybetmeden 20 kelimelik ilkokul cümleleriyle tarif edemezsiniz.
3. Beklenmedik Keşif: Tokenizer ve RLHF Paradoksu
Peki o halde, Spec v5.0’daki saf sembolik DSL’imiz prompt mühendisliğinin zirvesi miydi?
Hayır. Kendi içinde sinsi ve kritik bir kusur barındırıyordu.
Hızlı alt-ajanları (Flash ve Haiku modelleri) çalıştırırken ve 50.000+ token’lık uzun bağlamlı görevleri izlerken bazı tuhaf sınır ihlalleri fark ettik. Hızlı modeller, kurallarda açıkça Symptom_Site.patch = FORBIDDEN ve Write(TestFile) = FORBIDDEN yazmasına rağmen, bazen istenmediği halde test yazıyor veya hatanın fırladığı satıra gidip semptom yaması yapıyordu.
Amiral gemisi akıl yürütme modelleri bu kurallara harfiyen uyarken, hızlı modeller neden kaçırıyordu?
Derinlemesine incelediğimizde sorunun iki düşük seviyeli makine öğrenimi dinamiğinden kaynaklandığını tespit ettik:
Dinamik A: BPE Tokenizer Kıyma Makinesi
Modern tokenizer’lar (cl100k, o200k, SentencePiece) devasa doğal dil ve kaynak kod veri setleriyle eğitilir. Standart İngilizce kelimeleri ve yaygın programlama anahtar kelimelerini tek ve temiz token’lara bölerler.
Fakat ∧ (mantıksal VE), ¬ (değil), ⊆ (alt küme), ∪ (birleşim) ve Δ (delta) gibi egzotik Unicode matematiksel glifler, çoğu zaman birden fazla anlamsız bayt parçasına bölünür.
Bir alt-ajan Failures(Regression, S_t+Δ) ⊆ Failures(Regression, S_0) satırını okurken, model orada temiz atomik operatörler görmez; parçalanmış bayt dizilerini ayrıştırmak zorunda kalır. Bağlam uzadığında veya modelin parametre sayısı azaldığında, bu parçalanmış token’lar üzerindeki dikkat ağırlıkları zayıflar ve katı matematiksel kural, modelin gözünde anlamsız bir noktalama işaretine dönüşür.
Dinamik B: RLHF Negatif Logit Frenleri
Büyük Dil Modelleri, RLHF ve DPO süreçlerinde milyonlarca insan geri bildirimi ve güvenlik yönergesiyle hizalanır. Bu eğitim sırasında modeller, belirli normatif belirteçlerin (token) etrafında olağanüstü güçlü negatif dikkat öncülleri geliştirir:
MUST NOT(YAPILMAMALIDIR)FORBIDDEN(YASAKTIR)DO NOT(YAPMAYIN)
Bir kuralı pasif bir fonksiyonel eşitlik olarak yazdığınızda:
Symptom_Site.patch = FORBIDDEN
Write(TestFile | TestCase) = FORBIDDEN
Model derin düşünme aşamasında bu anlamı kavrar. Ancak hızlı bir şekilde bir sonraki token’ı tahmin ederken, pasif bir eşitlik ifadesi modelin RLHF ile eğitilmiş “negatif logit frenlerini” etken bir emir kadar sert ve anlık bir şekilde tetikleyemez.
4. Sentez: Spec v5.1 “Sertleştirilmiş Çekirdek” Mimarisi
Her iki uç noktanın da hatalı olduğunu gördük:
- Saf ASD-STE100, okunabilirlik uğruna matematiksel latent öncülü kurban ediyordu.
- Saf Unicode DSL, estetik biçimcilik uğruna tokenizer kararlılığını ve RLHF kural tutarlılığını riske atıyordu.
İdeal denge, Sertleştirilmiş Çekirdek (Spec v5.1) adını verdiğimiz mimaridir: %90 Biçimsel Yapısal DSL + %10 Tokenizer Uyumlu Negatif Frenler.
┌────────────────────────────────────────────────────────────────────────┐
│ 1. LATENT UZAY ÖNCÜLÜ (Biçimsel Çerçeve) │
│ PARADİGMA: Formal Axiomatic State Machine (Hoare Logic) │
│ Korunan: Durum Uzayı S = ⟨AST, Env, Memory, Invariants⟩ │
│ Sonuç: Sıfır laf kalabalığı, derleyici ciddiyetinde sistem tavrı. │
└───────────────────────────────────┬────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────┐
│ 2. TOKENIZER DÜZLEŞTİRME (ASCII Mantık Belirteçleri) │
│ Değiştirilen: ∧, ¬, ⊆, ∪, Δ, ∅ │
│ Yeni Hali: AND, NOT, SUBSET_OF, UNION, diff, EMPTY │
│ Sonuç: Sıfır alt-kelime bayt parçalanması; %100 dikkat kararlılığı. │
└───────────────────────────────────┬────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────────┐
│ 3. RLHF TALİMAT FRENLERİ (RFC 2119 Normatif Emirleri) │
│ Değiştirilen: X = FORBIDDEN, Mocks.core = 0 │
│ Yeni Hali: MUST NOT patch symptom site, MUST NOT use core mocks │
│ Sonuç: Yasak eylemlere karşı maksimum negatif logit tepkisi. │
└────────────────────────────────────────────────────────────────────────┘
Somut Karşılaştırma: Öncesi ve Sonrası
İşte üretim çekirdeğimizde yaptığımız güncellemenin birebir fark tablosu:
1. Aksiyomlar (AXIOMS)
# Spec v5.0 (Kırılgan Unicode Glifler + Pasif Atama)
AXIOMS:
1_TRACE: Backpropagate S_fail → S_0; isolate argmin_t(Actual(S_t) ≠ Invariant(S_t)). Symptom_Site.patch = FORBIDDEN
3_CORRELATE: Intersect(Vector_fail, Δ(Env) ∪ Δ(GlobalState))
5_PROVE: Assert: C(S_fail + Δ) == 0 ∧ (Failures(Regression, S_t+Δ) ⊆ Failures(Regression, S_0)) ∧ Blast_Radius(Δ) ⊆ Target_Seam
# Spec v5.1 Sertleştirilmiş Çekirdek (ASCII Mantık + Yüksek Salınımlı Negatif Frenler)
AXIOMS:
1_TRACE: Backpropagate S_fail -> S_0; isolate root cause argmin_t(Actual(S_t) != Invariant(S_t)). MUST NOT patch symptom site.
3_CORRELATE: Intersect(Vector_fail, diff(Env) UNION diff(GlobalState))
5_PROVE: Assert: C(S_fail + diff) == 0 AND Failures(Regression, S_t+diff) SUBSET_OF Failures(Regression, S_0) AND Blast_Radius(diff) within Target_Seam
2. Test Politikası (PROVE_GATE.TEST_POLICY)
# Spec v5.0
TEST_POLICY:
- Write(TestFile | TestCase) = FORBIDDEN UNLESS ExplicitInPrompt == True
- Synthetic_Mocks = FORBIDDEN; InCode_Contracts > Mocked_Unit_Bloat
# Spec v5.1 Sertleştirilmiş Çekirdek
TEST_POLICY:
- MUST NOT write or edit test files/cases UNLESS ExplicitInPrompt == True
- BugRepro: TwoPhaseCheck(C(S_fail) != 0 -> C(S_fail + diff) == 0) executed via CLI/REPL without persisting test code
- MUST NOT create synthetic mocks; InCode_Contracts > Mocked_Unit_Bloat
3. Araç ve Ortam Sınırları (BOUNDARY_CONTRACTS)
# Spec v5.0
TOOLCHAIN_DISCIPLINE: JS/TS: pnpm | bun; Raw "npm install" = FORBIDDEN; Python: uv; Raw "pip install" = FORBIDDEN
# Spec v5.1 Sertleştirilmiş Çekirdek
TOOLCHAIN_DISCIPLINE: JS/TS: pnpm (shared store) | bun; MUST NOT use raw "npm install"; Python: uv (uv run/sync/venv); MUST NOT use raw "pip install" / "python -m venv"; Runtimes: mise manages Node/Go/Java; MUST NOT modify system paths
5. Büyük Resim: Derleyici Olarak Prompt, Atılabilir Bir Yapıt Olarak Yazılım
Karpathy’nin “atılabilir yazılım yapıtları” ve ASD-STE100 hakkındaki tespitleri kaçınılmaz bir gerçeği müjdeliyor: Prompt’un bir insanla sohbet etmek olduğu çağın sonuna geldik.
Çok katmanlı devasa kod depolarında otonom ajan sürüleri çalıştırırken:
- Prompt nesir değildir. Derin bir yapay sinir ağının olasılıksal durum makinesini yapılandıran bir yürütme çekirdeğidir.
- Latent uzay bir geometridir. Bir modelin çömezce hatalar yapmadan üretim seviyesinde kod yazmasını istiyorsanız, onun dikkatini biçimsel doğrulama ve derleyici teorisinin terminolojisine çıpalamak zorundasınız.
- Tokenizer’lar fiziğin kurallarıdır. Bayt düzeyindeki ikili kodlayıcılar yazdığınız matematiksel sembolleri gürültüye dönüştürüyorsa, formüllerinizin kağıt üzerinde ne kadar güzel göründüğünün hiçbir önemi yoktur.
- RLHF sizin fren sisteminizdir. Bir ajanın asla bir semptomu yamamamasını veya sisteme yabancı bir paket yüklememesini istiyorsanız, onun eğitiminde yer alan normatif anahtar kelimelerle (
MUST NOT) konuşmak zorundasınız.
Çekirdeğimizi Spec v5.0’dan Spec v5.1 Sertleştirilmiş Çekirdek seviyesine yükselterek; biçimsel teorik derinlikten tek bir milimetre bile taviz vermeden, hem devasa akıl yürütme modellerinde hem de yıldırım hızındaki alt-ajanlarda %100 kural uyumuna ulaştık.
Ajan çekirdeklerinizi çocuk seviyesinde sade İngilizceye hapsedip modelinizin ciddiyetini öldürmeyin. Ancak kırık Unicode sembolleriyle tokenizer’larınızı kör de etmeyin. Latent uzayı sabitleyin, belirteçleri sertleştirin ve derleyicinin çalışmasına izin verin.