Kendi yemek botum bugün pizza yüzünden patladı

Bugün akşam yemeğimi FoodLogBot’a attım.

FoodLogBot, kendi kullandığım küçük bir Telegram botu. Mantığı basit: yemek veya içecek fotoğrafı atıyorum, bot görseli analiz ediyor, kalori/makro/glisemik yük tahmini çıkarıyor ve günü JSON olarak logluyor. Gün sonunda özet de veriyor.

Oyuncak gibi geliyor ama gerçekte ufak çaplı bir production sistemi gibi davranıyor. Çünkü gerçek hayatta “tek tabak, tertemiz ışık, modelin bayılacağı yemek fotoğrafı” diye bir şey yok. Bazen fotoğrafta pizza var, yanında patates var, yanında nugget var, yanında Pepsi Max var. Tam “hadi bakalım bunu da çöz” vakası.

Bugünkü fotoğraf da bu kategoriydi.

Model aslında doğru analiz etti

Fotoğrafı atınca bot görüntüyü işledi. Raw model çıktısına bakınca modelin yemeği gayet doğru yakaladığını gördüm:

  • orta boy pizza
  • küçük porsiyon patates kızartması
  • küçük porsiyon tavuk nugget / popcorn
  • Pepsi Max

Tahmini toplam şuydu: ~2680 kcal, 114g protein, 290g karbonhidrat, 138g yağ, 17g lif, glisemik yük yüksek.

Yani model “ben bunu anlamadım” dememiş. Tam tersine, gayet düzgün çözmüş.

Ama günlük log’a baktığımda şu yazıyordu:

Analiz edilemeyen yemek/içecek fotoğrafı

Klasik. Model doğru cevap vermiş, benim bot yanlış anlamış.

Sorun model değil, parser’dı

Botun eski mantığı şuydu: model cevabının sonunda tek bir JSON obje bekliyordum.

{
  "food": "pizza",
  "item_type": "food",
  "calories": 900,
  "protein": 35,
  "carbs": 100,
  "fat": 40,
  "fiber": 5,
  "gl": 80,
  "gl_level": "high"
}

Ama bu fotoğrafta tek ürün yoktu. Model de daha doğrusunu yapıp JSON array döndürdü.

[
  { "food": "Orta boy pizza", "item_type": "food", "calories": 2000 },
  { "food": "Küçük porsiyon patates kızartması", "item_type": "food", "calories": 380 },
  { "food": "Küçük porsiyon tavuk nugget/popcorn", "item_type": "food", "calories": 300 },
  { "food": "Pepsi Max", "item_type": "drink", "calories": 3 }
]

Mantıklıydı. Fotoğrafta dört ayrı item vardı, hepsini tek bir “food” objesine ezmek yerine liste olarak vermiş.

Benim parser ise “yok kardeşim ben tek obje bekliyorum” deyip patladı.

Buradan çıkan küçük agent dersi

AI sistemlerinde hata her zaman modelden gelmiyor. Bazen model doğru cevap veriyor ama senin sistemin o cevabı taşıyacak kadar esnek değil.

Bu olayda üç katman vardı: görsel analiz, model çıktısını parse etme, günlük log’a yazma. İlki çalıştı, ikincisi patladı, üçüncüsü de mecburen “analiz edilemedi” diye placeholder yazdı.

Dışarıdan bakınca “model yemeği anlayamamış” gibi görünüyor. Raw çıktıya bakınca gerçek bambaşka.

Raw output saklamak hayat kurtarıyor

İyi ki botu yazarken modelin ham cevabını ayrı dosyaya kaydedecek şekilde kurmuşum.

Sadece son JSON log’una baksaydım elimde şu kalırdı:

{
  "food": "Analiz edilemeyen yemek/içecek fotoğrafı",
  "needs_review": true,
  "reason": "model_json_missing_or_parse_failed"
}

Bu bana “bir şey bozuldu” derdi ama neyin bozulduğunu göstermezdi.

Raw çıktıya bakınca gördüm: model fotoğrafı doğru anlamış, açıklama yerinde, JSON kısmı mevcut. Sorun sadece parser’ın array desteklememesiydi.

Parser’ı güncelledim: tek obje gelirse tek kayıt, array gelirse her item ayrı kayıt yazıyor. Eski placeholder’ı da raw analizden geri yükledim.

Bugünkü log sonunda düzgün hale geldi: Monster Energy, Obsesso Mocha, Monster Energy, pizza, patates, nugget, Pepsi Max. Günün toplamı yaklaşık 3318 kcal, 119.5g protein, 438g karbonhidrat, 141.5g yağ, 17g lif, 361 glisemik yük.

Evet, bot çalıştı. Yemek de biraz suç mahalli gibi. İkisi de doğru.

Küçük botlar da production dersi veriyor

Bu bot dışarıdan komik bir şey gibi duruyor. Telegram’a yemek fotoğrafı atıyorsun, sana “bu pizza biraz ağır olmuş kral” diyor.

Ama altında multimodal response handling, JSON parsing, fallback model, raw output logging, daily aggregation, correction flow, Telegram timeout’ları, systemd servis yönetimi, hatalı log’u sonradan recover etme gibi şeyler dönüyor. Yani “oyuncak proje” gibi başlayıp production refleksi öğreten bir şey.

Bence agent sistemleriyle ilgili dersler bu tarz küçük kişisel botlarda daha gerçek geliyor. Çünkü bu sistemleri gündelik hayatta kullanınca edge case geliyor. Demo’da değil, akşam yemeğinde.

Bugünkü dersler

  • Model çıktısını her zaman ham haliyle sakla. Sonradan “neredeydi acaba o kayıt” diye aramaktan kötüsü yok.
  • “Analiz edilemedi” demek yetmez; neden analiz edilemediği de log’a girmeli, yoksa hata bilgisiz placeholder olarak yatıp kalıyor.
  • Tek obje bekleyen parser, çoklu item geldiği ilk gün patlar.
  • Fotoğrafta birden fazla yemek varsa modelin array döndürmesi normal; benim varsayımım dardı.
  • Kişisel otomasyonlar bile düzgün log ve recovery mekanizması hak ediyor.

Kapanış

Bu tarz botları kurcalarken bazen “ben sadece bunlarla eğleniyor muyum?” diye soruyorum kendime. Sonra böyle bir bug çıkıyor ve fark ediyorum ki aslında küçük küçük gerçek sistemler kuruyorum.

FoodLogBot kalori botu olarak başladı, sonra agent sistemleri için kendi laboratuvarım haline geldi.

Bugün parser pizza yüzünden patladı. Yarın başka bir şey patlar herhalde, normal. Sistem her seferinde biraz daha az kırılgan oluyor, benim için şimdilik bu kadarı yeterli.