- LLM tabanlı sistemler geliştiren ekiplerin çoğu herkes gibi önce ajan (Agent) yapmaya çalışıyor, ancak bunların büyük bölümü karmaşıklık, kontrol edememe ve hata ayıklama zorluğu nedeniyle kolayca çöküyor
- Bellek, RAG, araç kullanımı ve iş akışı kontrolünün hepsinin gerektiği gerçek ajan deseni pratikte nadir; sorunların çoğu basit iş akışlarıyla (zincirleme, paralelleştirme, yönlendirme vb.) daha etkili biçimde çözülebiliyor
- Önce gerçek dünyada faydalı 5 LLM iş akışı desenini uygulamanız öneriliyor; ajanlar ise yalnızca gerçekten gerektiğinde dikkatle kullanılmalı
- Prompt chaining, paralelleştirme, yönlendirme, orchestrator-worker, evaluator-optimizer
- Ajanın gerekli olduğu durumlarda bile asıl kritik olan şey insan katılımı, net kontrol ve gözlemlenebilirlik (Observability)
AI ajanları, gerçekten gerekli mi?
- Netflix, Meta, ABD Hava Kuvvetleri gibi farklı mühendis ve ekiplere LLM sistemi kurma konusunda danışmanlık ve eğitim veren Hugo Bowne-Anderson’ın içgörüleri
Yanlış başlangıç: Neden herkes ajanlara takıntılı?
- Birçok ekip LLM projesine başlarken ajanlar, bellek, yönlendirme, araç kullanımı, karakter özellikleri gibi karmaşık yapıları önce devreye alıyor
- Gerçekte kurulduğunda ise ajanlar arası iş birliği, araç seçimi, uzun süreli bellek gibi birçok alanda sürekli anormal davranışlar ve hatalar sıkça ortaya çıkıyor
- Örnek olarak CrewAI tabanlı bir araştırma ajanı projesinde her rolün (araştırmacı, özetleyici, koordinatör) beklendiği kadar iş birliği yapamayıp tamamen çöktüğü deneyimlenmiş
Ajan nedir?
- LLM sistemlerinin 4 özelliği: bellek, bilgi erişimi (RAG), araç kullanımı ve iş akışı kontrolü
- Sonuncusu olan iş akışı kontrolü (LLM’in bir sonraki adımı veya araç kullanımını doğrudan belirlemesi) ajanik özellik olarak adlandırılıyor
- Gerçekte çoğu işte basit iş akışları (zincirleme, yönlendirme vb.) daha yüksek kararlılık gösteriyor
Ajanlar yerine kullanmanız gereken, pratikte faydalı LLM iş akışı desenleri
1. Prompt Chaining
- Açıklama: Birden fazla görevi bir dizi adıma (zincire) bölüp, her adımın LLM tarafından sırasıyla işlenmesini sağlamak
- Örnek: LinkedIn profilinden isim, unvan ve şirket bilgisi çıkarma → o şirket hakkında ek bilgiler (misyon, işe alım vb.) ekleme → profil + şirket bilgisine dayanarak kişiselleştirilmiş e-posta yazma
- Avantaj: Her adım net biçimde ayrıldığı için hata olduğunda nedenini kolayca izlemek ve düzeltmek mümkün; hata ayıklama ve bakım açısından avantajlı
- Kılavuz:
- Sıralı biçimde birbirine bağlanan görevler için uygun
- Tek bir adım başarısız olsa bile tüm zincir çökebilir
- İşleri küçük parçalara bölmek daha öngörülebilir sonuçlar ve daha kolay hata ayıklama sağlar
2. Paralelleştirme
- Açıklama: Birden çok bağımsız görevi aynı anda çalıştırarak tüm süreci hızlandırmak
- Örnek: Birden fazla kişinin profilinden eğitim, deneyim, beceri gibi farklı alanları paralel çıkararak toplam işlem süresini kısaltmak
- Avantaj: Bağımsız veri çıkarma/işleme işlerinde büyük ölçekli veride verimli; dağıtık işleme ortamlarıyla iyi uyum sağlar
- Kılavuz:
- Her görev birbirinden bağımsızsa ve eşzamanlı çalıştırma toplam hızı ciddi biçimde artırıyorsa uygundur
- Paralel yürütme sırasında race condition, timeout gibi istisnai durumlara dikkat etmek gerekir
- Büyük veri işleme ve birden fazla kaynağı aynı anda analiz etme için uygundur
3. Yönlendirme (Routing)
- Açıklama: Girdi verisini LLM’in sınıflandırıp her biri için uygun iş akışına otomatik olarak yönlendirmesi
- Örnek: Bir müşteri destek aracında girilen içeriği ürün sorusu, ödeme sorunu veya iade talebi olarak sınıflandırıp ilgili iş akışına göndermek; tür belirsizse varsayılan işleyiciye aktarmak
- Avantaj: Girdi türüne göre uzmanlaşmış işleme mantığını uygulayarak farklı vakaları temiz biçimde ayırır
- Kılavuz:
- Farklı girdi türleri/durumları için ayrı işlem gerektiğinde kullanılır
- Sınır vakalarda veya istisnai durumlarda yönlendirme başarısız olabilir ya da bazı vakalar atlanabilir
- Sınıflandırılamayan/istisnai durumlar için mutlaka bir catch-all handler tasarlanmalı
4. Orchestrator-Worker
- Açıklama: Orchestrator rolündeki LLM’in işi parçalara ayırıp değerlendirmesi ve worker’lara (yürütücü LLM’lere) detay görevleri devretmesi; genel akışı ve sırayı doğrudan kontrol etmesi
- Örnek: Hedef profili tech/non-tech olarak sınıflandırma → tech ise uzman worker’a e-posta üretimini devretme, non-tech ise başka bir worker’a devretme
- Avantaj: Karar verme (sınıflandırma/değerlendirme) ile yürütmenin (tekil işleme) ayrılması; dinamik akış kontrolü ve genişleme açısından avantaj sağlar
- Kılavuz:
- Her görev için uzmanlaşmış işleme gerektiğinde, karmaşık dallanmalar ve aşamalı koordinasyon için uygundur
- Orchestrator görevleri yanlış parçalara ayırır veya yanlış devrederse tüm akış hata verir
- Mantığı açık ve basit tutmak, devretme/sıra/bitiş koşullarını net tasarlamak gerekir
5. Evaluator-Optimizer
- Açıklama: LLM’in çıktıyı değerlendirdiği (puan/geri bildirim) ve eşik altında kalırsa tekrar tekrar düzelttiği/geliştirdiği yapı
- Örnek: E-posta taslağı oluşturma → değerlendiricinin kalite puanı/geri bildirimi → belirli bir eşiği karşılıyorsa veya azami yineleme sayısı aşılmışsa durdurma, değilse yeniden düzeltme
- Avantaj: Nihai çıktının kalitesini hedef seviyeye gelene kadar yinelemeli biçimde artırabilir; nicel kriterler için uygundur
- Kılavuz:
- Hızdan çok kalitenin önemli olduğu ve yinelemeli optimizasyon gereken iş akışları için uygundur
- Bitiş koşulu yoksa sonsuz döngüye girilebilir
- Net kalite kriterleri ve yineleme sınırı mutlaka tanımlanmalı
Ajanların gerçekten gerekli olduğu durumlar
- İnsanın gerçek zamanlı müdahalesinin (Human-in-the-loop) garanti edildiği ortamlarda ajanlar gerçek değerini gösterir
- Örnek1: Veri bilimi asistanı - SQL sorguları, görselleştirme, veri analizi önerileri gibi işlerde LLM yaratıcı denemeler yapar, insan da sonucu değerlendirip düzeltir
- Örnek2: Yaratıcı partner - metin fikri, başlık önerisi, metin yapısı önerisi gibi işlerde insanın yön düzeltmesi ve kalite denetimi kritik olur
- Örnek3: Kod refactoring yardımcısı - tasarım deseni önerileri, edge case tespiti, kod optimizasyonu gibi işlerde geliştirici onaylar ve tamamlar
- Özellik: Ajanın “her şeyi kendi kendine” yapması değil, insanın gerçek zamanlı olarak hatayı ve yönü düzelttiği ortamda en etkili olması
Ajanların uygun olmadığı durumlar
- Kurumsal ve mission-critical sistemler (finans, sağlık, hukuk vb.):
- Otomasyonun güvenilirliği ve deterministik davranış önemli olduğu için, LLM ajanının karar verdiği yapı risklidir
- Orchestrator, yönlendirme gibi net kontrol desenleri kullanılmalı
- Kararlılık ve öngörülebilirliğin kritik olduğu tüm durumlar
- Tipik sorunlar: ajanın bağlam/bellek olmadan araç seçimini tekrar tekrar yanlış yapması veya iş bölümü/koordinasyonun başarısız olup tüm akışın çökmesi
- Pratikte sık görülen ajan sistem başarısızlığı nedenleri
- Açık bir bellek sistemi tasarlanmadığı için bağlam kaybı
- Araç seçimi kısıtlarının yetersizliği (gereksiz/yanlış araç kullanımı)
- Yalnızca serbest devretme yapısına dayanıldığı için iş birliği ve koordinasyonun bozulması
Pratik sistem tasarımında çıkarılacak dersler
- Ajan kullanılsa bile “olgun bir yazılım sistemi” seviyesinde tasarım, gözlemlenebilirlik ve kontrol mekanizmaları mutlaka gerekir
- Karmaşık ajan framework’leri yerine gözlemlenebilirlik (Observability), net değerlendirme döngüleri ve doğrudan kontrol edilebilir yapılarla tasarlamak daha hızlı ve daha güvenlidir
Sonuç (TL;DR)
- Ajanlar çoğu zaman olduğundan fazla değerlendirilip aşırı kullanılıyor
- Pratikteki görevlerin çoğu için basit iş akışı desenleri daha uygun
- Ajanlar, “insanın doğrudan dahil olduğu” ortamlarda gerçek değerini gösteriyor
- Kararlı sistemlerde ise tersine bir risk unsuru olabiliyor
- Tasarımı gözlemlenebilirlik, açık kontrol ve yinelemeli değerlendirme yapısı üzerine kurun
- Karmaşık ajan framework’leri yerine, gözlemlenebilirlik, net değerlendirme döngüleri ve doğrudan kontrol edilebilir yapılarla tasarım yapmak, gerçekte daha hızlı ve daha güvenli LLM tabanlı hizmet geliştirmenin anahtarıdır
6 yorum
Bir ay önce, hem CURSOR kullanarak AI coding’in ne olduğunu öğrenmek hem de geliştirme framework’ü geliştirmeye başlamak için işe koyuldum.
Yaklaşık 3 hafta boyunca, başarıyla ilerlerken AI Agent tarafından doğrulanmış kaynak kodun tekrar tekrar bozulduğunu gördüm; AI Agent’ı kontrol etmek için her türlü yöntemi denedim ama başarısız oldum.
Sonra, geliştirme framework’ünü geliştirmeden önce önceliğin AI Agent’ı kontrol eden kaynak kodu geliştirmek olduğunu fark ettim.
Sonuç olarak, ilk AI’nin ne olduğunu anlamak için başlamamın üzerinden tam 1 ay geçtikten sonra, AI Agent’ı tamamen kontrol edebilen (daha doğrusu harici LLM ya da AI Agent’a ihtiyaç duymayan), yapay zeka tarafından %100 geliştirilebilen ve %100 işletilebilen bir yazılımı tamamlamayı başardım.
Şu anda 14. gündeyim; ek iyileştirmeler için bu META AI’yi yeniden eğitip operasyon kuralları oluşturarak bunlara uymasını sağlama sürecini yürütüyorum. Aynı zamanda, daha önce insanlar tarafından eksik şekilde yapılmış 3 MES sistemini eşzamanlı olarak migrate edip iyileştiriyor ve standardize ediyorum; çalışma artık son aşamaya girmiş durumda.
Ve şimdi bir başka evrime daha hazırlanıyorum.
Ama prompt chaining'de tek tek prompt'ları çalıştıran LLM'e, yürütücü worker'a, orkestratör worker'a, değerlendirici LLM'e vb. ayrı ayrı ajan demek de makul değil mi?
Ah, demek ki "nihai iş akışı kontrolü (LLM’nin bir sonraki adımı veya araç kullanıp kullanmayacağını doğrudan belirlemesi, ajansal özellik olarak adlandırılır)" diye bir şey varmış. Anladım. Otonom agent’ı hedefleyerek yazılmış bir yazıymış. Ben agent’lar konusunda hâlâ çok bilgili olmadığım için...
Hacker News yorumları
https://github.com/astronomer/airflow-ai-sdk
Ben de şu anda UseDesktop
https://youtu.be/aBkbsvMxP_A?si=uaugxKQEu4ZEz7jq
usedesktop.com
adlı bir Computer-use Agent geliştiriyorum ve büyük ölçüde katılıyorum.
Bu yazı pratik ipuçlarından ziyade genel bir overview ele alıyor; ben de LLM tabanlı agentic/agent geliştirirken birkaç ipucu daha eklemek isterim: Sonuçta LLM transformer tabanlıdır (yani probabilistic based akıl yürütme; mevcut token/state’e dayanarak bir sonraki token’ı bağlamı/semantiği gerçekten anlayıp üretmekten ziyade olasılıksal olarak output verir). Bu yüzden sys prompt ne kadar iyi yazılırsa yazılsın, çoğu zaman istenen yanıtı vermediği durumlar olur (örneğin JSON output istenir ama bazen
}karakterini unutabilir). Bu nedenle regex tabanlı birden fazla fallback fn eklemek her zaman şarttır.Ayrıca structured output veren bir sys prompt yazıyorsanız genelde non-reasoning model kullanırsınız; context uzadıkça hallucination daha sık ortaya çıktığı için, tek bir uzun sys prompt yerine birkaç sys prompt hazırlayıp chaining yapmak daha iyidir.
Bir servis geliştirirken çeşitli hatalar oluşabileceğinden, servis mimarisini modüler ve fault tolerant şekilde tasarlamak kritik önemdedir (örneğin supervisor agent’ı async, diğer agent’ları sync yapmak). Özellikle unexpected output’un sık görüldüğü agentic ve agent sistemlerinde bu daha da önemlidir. Bu yüzden en baştan kod yazarken mümkün olduğunca SRP’ye uymak ve declarative bir yaklaşım benimsemek iyi olur; yani fonksiyonel bir yaklaşımın daha iyi olduğunu söylemek isterim (= side effect yoktur ve flow sezgiseldir).
Ayrıca LLM’i API üzerinden mi kullanacağınız yoksa modeli doğrudan kendiniz mi serve edeceğiniz duruma göre değişir; ancak SLM ya da LLM’i doğrudan serve edecekseniz backend’i host ettiğiniz sunucuda model serving yapmayın. IO bound task’lerle CPU bound task’leri (yani GPU gerektiren, mat mult gibi işlemler isteyen task’ler) ayrı sunuculara koymak fault tolerance açısından daha iyidir (örneğin CPU bound task’leri Runpod’da host etmek).
Bunun dışında daha birçok geliştirme ipucu var ama çok uzamasın diye burada bırakayım.
Birilerine faydalı olmasını umuyorum.
Değerli deneyimlerinizi ve görüşlerinizi paylaştığınız için gerçekten çok teşekkür ederim. Sahada olan birinin görüşleri bize gerçekten çok yardımcı oluyor.