Sertaç Yıldırım saha notları

Ana sayfa → Teknik

Prompt ve Model Sürümü: Metin Değil, Kod

“Prompt’u küçük bir düzelttim” dedi arkadaşım, Perşembe 15:40. Admin ekranındaki kutuya yazdı, kaydetti; canlı o saniye değişti. Ertesi gün cevaplar tuhaflaşınca sorduk: ne değişmişti? Kimse bilmiyordu. Ne eski metin duruyordu, ne kimin değiştirdiği, ne de saati. Prompt bir metin kutusundaydı; oysa yaptığı iş deploy’du.

Özet
  • Prompt metin gibi görünür, davranış belirler: koddur. Repo’da durur; sürüm geçmişi, inceleme, geri alma ve eval bedavaya gelir.
  • Prompt değişikliği bir deploy’dur. Admin kutusundan yapılan düzeltme, kaydı olmayan bir deploy’dur; en tehlikelisi de budur.
  • Model sürümü sabitlenir. “En yenisi”, kimsenin onaylamadığı bir değişikliğin bir sabah canlıya girmesidir.
  • Davranışı üç şey birlikte üretir: prompt, model ve tool şeması. Üçünün sürümü tek bir “agent sürümü” altında kayıtlıdır ve her koşuda ize yazılır.
  • Gölge koşu en ucuz güvencedir. Yeni sürüm gerçek trafikle çalışır, cevabı kullanıcıya gitmez; iki sürüm yan yana karşılaştırılır.
  • Geri alma eşiği önceden yazılır. Üç sayı: eval puanı, olumsuz geri bildirim oranı, koşu başına token. Eşik aşıldığında tartışma değil, işlem olur.

Prompt neden kod?

Bir fonksiyonun gövdesini değiştirmek deploy gerektiriyor; aynı davranışı değiştiren bir cümleyi değiştirmek gerektirmiyorsa, ikisi arasındaki fark teknik değil, sadece alışkanlık. Eval yazısındaki olay bunun kanıtıydı: tek kelime, dört bozuk soru.

Repo’da promptAdmin ekranında prompt
Kim değiştirdigit blameBelki bir log satırı
Ne değiştigit diffEski metin yoksa hiçbir şey
İncelemePRYok
EvalCI’da zorunluHatırlanırsa
Geri almarevert, 2 dkEski metni hatırlayana kadar
HızPipeline kadar (bizde 6 dk)Anında

Son satır, admin ekranını savunanların tek gerçek argümanı: hız. Biz şöyle uzlaştık: prompt repo’da, ama canlıya alma pipeline’ı 6 dakika. Acil bir düzeltme gerektiğinde 6 dakika beklenebiliyor; bekleyemeyecek kadar acil bir şey varsa çözüm prompt değil, akıştaki bir bayrak: o adımı kapat, sonra düzgün düzelt.

Prompt’u metin kutusundan değiştirmek, canlı sunucuda dosya düzenlemektir. Bir kere işe yarar, sonra kimse ne olduğunu bilmez.

Neyi sürümlüyoruz?

Agent’ın davranışını tek başına prompt belirlemiyor. Üç şey birlikte çalışıyor ve üçü de sürümlü:

agent-surum.yaml
agent_surum: 14
  prompt:
    system: prompts/system_v9.md       # sha 3f21a7
    ozet:   prompts/ozet_v4.md         # sha 88c1de
  model:
    ad: qwen3:4b
    etiket: q4_K_M                     # "latest" YOK
    sha: 9b7e2c...
  tool_semasi: tools/v6.json           # 9 tool
  akis: flows/mutabakat_v3.py
  esikler:
    eval_tool_secimi_min: 60           # 60/60, dusmesi yasak
    geri_bildirim_oran_max: 0.08
    kosu_basi_token_max: 42000

Bu dosyanın tek bir işlevi var: “dün ile bugün arasında ne değişti” sorusunu tek dosyada cevaplamak. Her koşunun izine agent_surum: 14 yazılıyor; bir şikâyet geldiğinde önce bu numaraya bakılıyor.

Model sürümü: “latest” yasak

Model etiketini sabitlemek, bağımlılık sürümünü sabitlemekle aynı sebepten: kimsenin onaylamadığı bir değişiklik bir sabah canlıya girmesin diye. Bizde bir kez oldu: yerel model dosyası güncellendi, etiket aynı kaldı, davranış değişti ve iki gün “prompt’ta ne yaptık” diye aradık. Artık dosyanın hash’i de sürüm dosyasında; farklıysa agent açılışta uyarıyor.

Yeni sürüm nasıl çıkar?

Dört adım, sırayla. Hiçbiri atlanmıyor:

AdımNe yapılırGeçme şartı
1. EvalTam set, CI’daTool seçimi ve argüman puanı düşmeyecek
2. GölgeGerçek trafik, cevap kullanıcıya gitmez48 saat; iki sürümün farkı incelenmiş olacak
3. KısmiTrafiğin %20’si (iç kullanıcılar)3 gün; geri bildirim oranı eşiğin altında
4. Tam%100, eski sürüm bir hafta ayaktaGeri alma bir konfigürasyon satırı

Gölge koşu neden en değerli adım?

Eval seti 60 maddedir; gerçek trafik günde 200 sorudur ve içinde setin hiç düşünmediği cümleler vardır. Gölge modda yeni sürüm aynı soruları alır, cevabı bir yere yazılır, kullanıcıya gitmez. Sonra iki cevap karşılaştırılır. Bizim ilk gölge koşumuzun 48 saatlik özeti:

SonuçAdetNot
Aynı tool, aynı sayı371Sorun yok
Aynı tool, farklı metin29Elle bakıldı: 26’sı daha iyi
Farklı tool75’i yeni sürüm lehine, 2’si aleyhine
Hata / zaman aşımı3Model sunucusu yeniden başladı

Aleyhte olan 2 soru sete girdi, prompt düzeltildi, gölge tekrar koştu. Eval’in yakalayamadığı şeyi gölge yakaladı; gölgenin yakalayamayacağı şeyi de kısmi çıkış yakalar. Katmanlar birbirinin yedeği.

Gölge koşu, kullanıcıya hiç dokunmadan gerçek trafikte test etmektir. En ucuz güvence, en az kullanılan adım.

Geri alma: eşiği önceden yaz

Geri alma kararının en kötü anı, kararın verildiği andır: herkes yorgun, herkesin bir hikâyesi var. Bu yüzden eşikler sürüm dosyasında, önceden yazılı:

  • Eval tool seçimi puanı bir puan bile düşerse sürüm çıkmaz (çıkış öncesi kapı).
  • Olumsuz geri bildirim oranı iki katına çıkarsa geri alınır (canlıda).
  • Koşu başına ortalama token %30’dan fazla artarsa geri alınır — sebebi incelenir, sonra tekrar denenir.

Geri alma agent_surum: 13 yazıp servisi yeniden yüklemek: 2 dakika. Eski sürüm zaten ayakta olduğu için model yeniden indirilmiyor, prompt yeniden derlenmiyor. Çökme modları yazısındaki kural burada da geçerli: geri dönüş yolu, gidiş yolundan daha iyi test edilmiş olmalı.

Sahadan: üç sürüm, üç ders

SürümDeğişiklikSonuç
v9System prompt’ta tek kelimeEval’de tool seçimi 58/60 → çıkmadı, düzeltildi
v11Özet prompt’una “rakamları tabloya koy”Gölgede 29 metin farkı, 26’sı iyi → çıktı
v12Model dosyası güncellendi (etiket aynı)Fark edilmedi, 2 gün prompt arandı → artık hash kontrolü var
v13Tool şeması: 23 tool → 9Eval 71% → 94%; kısmi çıkışta 3 gün, sorun yok
v14Akışa fren eklendiToken %18 düştü, geri bildirim değişmedi

v12 en öğretici olanı: değişikliği biz yapmadık, ama davranış değişti. “Bir şey değiştirmedik” cümlesi, sürümler yazılı değilse hiçbir şey ifade etmiyor.

Yapılacaklar
  • Prompt’u repo’da tut, PR ile değiştir.
  • Model etiketini ve dosya hash’ini sabitle.
  • Prompt + model + tool şemasını tek sürüm numarasına bağla.
  • Sürüm numarasını her koşunun izine yaz.
  • Gölge koşuyu 48 saat çalıştır, farkları elle oku.
  • Geri alma eşiklerini önceden yaz, eski sürümü ayakta tut.
Yapılmayacaklar
  • Prompt’u admin kutusundan “küçük bir düzeltme” ile değiştirmek.
  • Model etiketini “latest” bırakmak.
  • Prompt ile tool şemasını aynı anda değiştirip tek sonuca bakmak.
  • Gölge adımını “eval yeşil” diye atlamak.
  • Geri alma kararını olay anında tartışmak.

Ne izlemeli?

  • Sürüm başına eval skoru. Tool seçimi, argüman, sayı ayrı ayrı.
  • Gölge fark oranı. Farklı tool seçilen soru yüzdesi; %2’nin üstü dikkat ister.
  • Sürüm yaşı. Canlıdaki sürüm kaç günlük? Çok eskiyse değişiklikler birikiyordur.
  • Geri alma sayısı ve süresi. Sayı sıfırsa ya çok iyisin ya da eşikler gevşek.
  • Sürümsüz değişiklik sayısı. İzde agent_surum boş görünen koşu var mı? Olmamalı.
  • Pipeline süresi. 10 dakikayı aşarsa insanlar admin kutusu aramaya başlar.

Kontrol listesi

Prompt’u canlıya almadan önce
  • Prompt nerede duruyor: repo mu, veritabanı mı?
  • Kim değiştirdi, ne değişti, ne zaman — üçü de kayıtlı mı?
  • Model etiketi sabit mi? Dosya hash’i kontrol ediliyor mu?
  • Prompt, model ve tool şeması tek sürüm numarasına bağlı mı?
  • Sürüm numarası koşu izine yazılıyor mu?
  • Eval CI’da kapı mı, uyarı mı?
  • Gölge koşu var mı? Kaç saat, farkları kim okuyor?
  • Kısmi çıkış hangi kullanıcılarla başlıyor?
  • Geri alma eşikleri yazılı mı? Kaç sayı?
  • Geri alma kaç dakika sürüyor? Denediniz mi?
  • Eski sürüm ne kadar süre ayakta kalıyor?

Sonuç

O perşembe yapılan “küçük düzeltme” bir deploy’du; kaydı olmayan, incelemesi olmayan, geri alınamayan bir deploy. Ertesi gün cevapları tartışırken elimizde tek bir bilgi yoktu: ne değiştiğini bilmiyorduk. Yazılımda bu kabul edilmez bir durum; prompt söz konusu olduğunda nedense normal karşılanıyor.

Şimdi prompt repo’da, model etiketi sabit, üçü tek sürüm numarasına bağlı ve her koşunun izinde o numara var. Yeni sürüm dört kapıdan geçiyor: eval, gölge, kısmi, tam. Geri alma iki dakika. Bunların hiçbiri yeni bir fikir değil; hepsi servislerde yıllardır yaptığımız şeyler.

Akılda kalacak cümle: davranışı değiştiren her şey sürümlüdür. Prompt davranışı değiştiriyorsa prompt da sürümlüdür; metin olması onu masum yapmıyor.