Döngü test ortamında kırk kez sorunsuz çalıştı. Kırk birinci çalıştırmada, üretimde, aynı SQL aracını aynı bozuk sorguyla tekrar tekrar çağırdı. Ta ki günlük API bütçesini tüketip bir fatura uyarısı sonunda birini uyandırana kadar. Kimse kötü bir model yazmadı. Kimse promptu değiştirmedi. Ajan sadece işinin bittiğine hiç karar vermedi.
Bu, bir ajanı prototipten 7/24 iş yüküne taşıyan ekiplerle sürekli gördüğüm örüntüdür. AI ajan döngüleri üretimde çoğunlukla modelin birdenbire kötüleşmesi nedeniyle değil, yürütme katmanının sonlandırma disiplininden, doğrulanmış araç sözleşmelerinden, sınırlı bağlamdan ve dayanıklı durumdan yoksun olması nedeniyle çöker. Ajan döngüsü, birbiri ardına tek bir sıralı karar veren stokastik bir sistemdir. Birkaç spesifik koruyucu kural olmadan, nadir hata yeterince uzun çalıştırıldığında kaçınılmaz hale gelir. Yönetilen ajan platformları (Vertex AI Agent Builder, Bedrock Agents, Azure AI Foundry) bu koruyucu kuralların bir kısmını yerleşik olarak sunar. Bu kılavuz, kendi döngüsünü self-host etmeyi ve yönetmeyi tercih edenler içindir.
Riskler o kadar gerçek ki Gartner, agentic AI projelerinin yüzde 40'ından fazlasının 2027 sonuna kadar iptal edileceğini öngörüyor, artan maliyetler ve belirsiz değer gerekçe gösteriliyor. Aşağıda döngülerin üretimde bozulduğu altı spesifik yol, her birinin arkasındaki mekanizma ve bunu düzelten koşum takımı örüntüsü yer alıyor. LangGraph ve n8n ayrıntıları ile bunu gerçekten 7/24 çalıştırmanın gerektirdikleri de dahil.
Kısa Versiyon
- Sonsuz döngüler: Ajan işinin bittiğine asla karar vermiyor. LangGraph'ın sert adım tavanını (
recursion_limit, varsayılan 25) tekrarlanan araç+argüman çağrılarını öldüren ilerleme algılamayla birleştirin. - Bağlam taşması: Döngü, çağrılar kesilene veya başarısız olana kadar birikmiş geçmişle kendi bağlam penceresini dolduruyor. Geçmişi sabit aralıklarla özetleyin, böylece çalışma bağlamı sınırlı kalır.
- Sessiz araç hataları: Bir araç boş dize döndürüyor, model bunu geçerli bir işlemsizlik olarak okuyor ve ajan hiçbir şey yapmadan "başarılı" oluyor. Her araç sonucunu model görmeden önce doğrulayın.
- Akıl yürütme bozulması: Bağlam büyüdükçe, sert sınırın altında bile kalite bozuluyor. Döngü ortasında sıkıştırın, ama bunu yaparken sabitlenmiş güvenlik talimatlarını koruyun.
- Yeniden başlatmada durum kaybı: Çöküş, sıfırdan başlamak anlamına geliyor. Üretim için SQLite değil, Postgres'e (LangGraph
PostgresSaver), checkpoint alın. - Yeniden deneme fırtınaları: Her biri on kez yeniden deneyen on ajan, çökmüş bir servise yüz istek gönderiyor. Jitter'lı üstel geri çekilme ve global bir devre kesici ekleyin.
Bu Kılavuzun Kapsamadıkları
Bu bir koşum takımı kılavuzudur. Döngünün içindeki modele değil, döngünün etrafındaki mühendisliğe odaklanır. Birkaç ilgili konu kasıtlı olarak kapsam dışında bırakılmıştır:
- Çok ajanlı koordinasyon hataları (bayat okumalar, ajanlar arasında sahipsiz durum): ayrı bir yazıyı hak eden farklı bir sorun.
- Ajan güvenliği (prompt enjeksiyonu, araç zehirlenmesi): kendi tehdit modeline sahip ayrı bir hata kategorisi.
- Model seçimi ve ince ayar. Bu kılavuz bir model seçtiğinizi ve onun çevresindeki sistemi hata ayıkladığınızı varsayar.
- Yönetilen ajan servisleri, yukarıda belirtildi; buradaki örüntüler self-hosted yol içindir.
Sonsuz Döngüler: Ajan Asla İşinin Bittiğine Karar Vermediğinde
Ajan hem sert bir adım tavanından hem de ilerleme yapmayı durdurduğunu tespit eden bir mekanizmadan yoksun olduğunda döngü sonsuza kadar sürer. Düzeltme iki parçalıdır: sert bir tavanı maliyet güvencesi olarak tutun ve her araç-artı-argüman çağrısını hash'leyen, aynı çağrının tekrarlandığını gördüğünde döngüyü sonlandıran ilerleme algılaması ekleyin. LangGraph'ta bu tavan recursion_limit, varsayılan 25 adım; geçildiğinde grafik bir GraphRecursionError.
LangGraph'ın belgeleri bu sınırı "bir durdurma koşuluna ulaşmadan önce maksimum adım sayısına ulaşıldığında" olarak tanımlar ve işte anlamaya değer olan tuzak şudur: recursion_limit döngü koruması değildir. Döngünün sonra yirmi beş adımı ve buna eşlik eden API harcamasını zaten heba etmesinden sonra devreye giren bir güvencedir. Ajanın kendi öğrenilmiş sonlandırma mantığı onu çok öncesinde durdurması gerekir ve bu mantık bağımsız olarak başarısız olabilir. Açıklanan bir LangGraph vakası bir metin-SQL ajanının, promptta açık durdurma koşulları olmasına rağmen recursion_limit'e ulaşana kadar döngüde kaldığını göstermektedir. Aynı başarısız SQL'i kullanarak aynı sorgu aracını çağırmaya devam etti ve sorun "planlanmadı" olarak kapatıldı. Bunu açık bir sinyal olarak okuyorum: tavanı durdurma koşulunuz olarak değerlendirmeyin. Emniyet kemerinizdir, freleriniz değil.
Tavanı yükseltmek basittir; grafiği çağırırken config üzerinden geçirirsiniz:
# The hard ceiling -- a backstop, not loop protection
graph.invoke(
{"messages": [("user", "Generate the quarterly report")]},
{"recursion_limit": 50},
)
Gerçekten sıkışmış bir döngüyü durduran şey ilerleme algılamasıdır. Mekanizma basittir: her adımda araç adını ve argümanlarını hash'leyin, son hash'lerin kısa bir penceresini tutun ve bir tekrar gördüğünüzde çıkın.
import hashlib
def step_signature(tool_name: str, tool_args: dict) -> str:
payload = f"{tool_name}:{sorted(tool_args.items())}"
return hashlib.sha256(payload.encode()).hexdigest()
# Inside your loop: terminate if the same tool+args repeats within the window
seen = recent_signatures[-WINDOW:]
sig = step_signature(tool_name, tool_args)
if sig in seen:
raise StopReason("no_progress: repeated tool call detected")
recent_signatures.append(sig)
Bu, teknik olarak "çalışan" (araçları çağıran, token üreten) ama aynı başarısız eylemde döngüye giren ajanı yakalar. Buradaki adlandırılmış hata modu, MAST sınıflandırmasının (IBM Research ve UC Berkeley) Farkında Olmama Durumu Farkında Olmama Durumu (FM-1.5), analizlerinin doğrudan görev başarısızlığıyla ilişkilendirdiği hata modlarından biri.
Adım tavanı kontrolsüz maliyeti durdurur. İlerleme algılaması, teknik olarak "ilerleyen" ama tekrar eden döngüyü durdurur. Üretim her ikisine de ihtiyaç duyar.
Bağlam Penceresi Taşması: Döngü Kendi Bağlamını Çöple Doldurduğunda
Uzun süre çalışan bir döngü, her araç çıktısını, her ara düşünceyi ve ürettiği her mesajı biriktirir. Ardından her turda bunların tamamını bağlam penceresine geri tıkar. Sonunda pencere dolar ve çağrılar ya sessizce kesilir ya da tamamen başarısız olur. Düzeltme, sabit aralıklarla bağlam özetidir: her N adımda, birikmiş geçmişi çalışma bağlamı sınırlı kalacak şekilde yoğunlaştırın.
Bir saattir çalışmakta olan bir araştırma ajanını düşünün. 60. adımda getirdiği her sayfanın tam metnini, her arama sonucunu, her akıl yürütme izini taşıyor. Bu ham geçmişin hiçbiri 61. adımda işe yaramaz; ancak tamamı pencereye karşı sayılır ve model artık ihtiyaç duymadığı token'lar için dikkat bütçesi harcar. Pencere dolduğunda sağlayıcı bir uçtan kesiyor ve ajan başlangıçta verilen talimatı sessizce kaybediyor.
Tetikleyici bir ayarlama kararıdır ve bunun için kullanışlı bir referans noktası vardır. Mem0'ın gerçek bir üretim sistemine ilişkin yazısında Hermes ajanının sıkıştırıcısının "varsayılan olarak modelin bağlam penceresinin yüzde 50'sinde devreye girdiği", bir sonraki tur ile pencerenin şiştiği oturumlar için yüzde 85'te ikincil bir güvenlik ağıyla birlikte belirtilmektedir. Yüzde elli makul bir başlangıç noktasıdır: tek bir büyük araç çıktısının bir sonraki planlı sıkıştırmadan önce sınırı geçemeyeceği kadar erken sıkıştırın.
Not: Taşma ve akıl yürütme bozulması farklı sorunlardır ve bir sonraki bölüm ikincisini ele almaktadır. Taşma sert bir duvar: token bitirdiniz. Bozulma ise yumuşaktır; model duvara çarpmadan önce bozulur. Her ikisini de ele almanız gerekir; yukarıdaki tetikleyici eşiği sert duvara karşı korur.
Sınırlı bağlam bir koşum takımı sorumluluğudur, model özelliği değil. Pencere sessiz bir kesmeye zorlamadan önce aralıklı olarak özetleyin.
Sessiz Araç Çağrısı Hataları: Ajan Hiçbir Şey Yapmadan "Başarılı" Olduğunda
Araç çağrısı boş bir dize ya da yumuşak bir "sonuç bulunamadı" mesajı döndürüyor, model bunu geçerli bir sonuç olarak yorumluyor ve ajan tamamen hiçbir şey yapmadan başarılı olmuş gibi devam ediyor. Düzeltme, her araç dönüşünde bir doğrulama kapısıdır: çıktıyı model görmeden önce şema denetimi veya akıl kontrolüne tabi tutun; döngünün başa çıkmak zorunda kalacağı gerçek bir başarısızlığı yüzeye çıkarın, boş bir başarı değil.
Bu sorun sinsidir çünkü hiçbir şey çökmez. Üretim ajanlarındaki sessiz hata modlarını yazan bir geliştirici üretim ajanlarındaki sessiz hata modları bunu doğrudan ifade etmiştir: modeller genel boş dizeleri geçerli işlemsizlikler olarak yorumlar ve hatanın farkında olmadan yürütmeye devam eder. Bağlantı düştüğü için sıfır satır döndüren veritabanı sorgusu, modele göre meşru olarak hiçbir şey bulmayan sorguyla aynı görünür. Dolayısıyla ajan "eşleşen kayıt yok" raporuyla devam eder ve bir hafta sonra çalıştırmalarının üçte birinin sessizce bozulduğunu fark edersiniz.
Doğrulama kapısı araç ile model arasında yer alır:
def gate_tool_result(tool_name: str, result):
# Reject empties and soft errors before the model can rationalize them
if result is None or (isinstance(result, str) and not result.strip()):
raise ToolFailure(f"{tool_name} returned empty -- treat as failure, not no-op")
if isinstance(result, str) and result.lower().startswith(("error", "exception")):
raise ToolFailure(f"{tool_name} returned a soft error: {result[:120]}")
return result # validated -- safe to hand back to the model
Mesele tam kontroller değil; kendinizinkiler her aracın meşru olarak ne döndürdüğüne bağlıdır. Mesele şu: doğrulanmamış bir dönüş değeri, stokastik bir modele bıraktığınız bir karardır ve modelin varsayılan hareketi devam etmektir.
Doğrulanmamış araç dönüşü, yaşanmayı bekleyen sessiz bir hatadır. Çıktıyı doğrulayın, çağrıya güvenmeyin.
Uzun Bağlamlarda Akıl Yürütme Bozulması: Ajan Daha Uzun Çalıştıkça Kötüleştiğinde
Sert bağlam sınırının altında kalınsanız bile, bağlam büyüdükçe akıl yürütme kalitesi bozulur. Bu, "ortada kaybolma" etkisidir: model uzun bir bağlamın başına ve sonuna güvenilir biçimde dikkat ederken ortayı kaybeder. Düzeltme, sabitlenmiş kısıtlamaları koruyan döngü-ortası sıkıştırmadır: gürültüyü sıkıştırın, yük taşıyan talimatları koruyun.
Mekanizmanın bir adı var. Anthropic'in mühendislik blogu bunu şu şekilde tanımlar: bağlam çürümesi: "bağlam penceresindeki token sayısı arttıkça modelin bu bağlamdaki bilgileri doğru biçimde geri çağırma yeteneği azalır." Çünkü "her token diğer her token'a dikkat eder," n token için n² ikili ilişki elde edersiniz ve bağlam uzadıkça modelin dikkati giderek incelir.
Bu uyarıcı nitelik, yük taşıyan talimatları korumak, asıl meseledir ve bunu neden önemsendiğini gösteren belgelenmiş bir olay vardır. Bir bildirilen vakada, bir OpenClaw ajanı bir kullanıcının gelen kutusunu toplu sildi; bunun nedeni, kendisine verilen güvenlik talimatının ("bana söyleyene kadar harekete geçme") geçmiş sıkıştırıldığında aktif bağlamdan düşürülmüş olmasıydı. En son çıkarılması gereken kısıtlama, sıradan geçmiş olarak değerlendirildi ve özetlenerek silindi.
Dolayısıyla naif bir "N turdan eski her şeyi özetle" yaklaşımı tehlikelidir. Sıkıştırma, asla neyi bırakmaması gerektiğini bilmek zorundadır:
PINNED = {"system_constraints", "safety_instructions", "active_task_spec"}
def compress_history(messages):
pinned = [m for m in messages if m.tag in PINNED] # never summarized
transient = [m for m in messages if m.tag not in PINNED]
summary = summarize(transient) # lossy is fine here
return pinned + [summary] # constraints survive intact
Bu, önceki bölümdeki taşma sorunuyla farklıdır. Taşma yer bitmesi hakkındadır; bozulma ise yer hala varken modelin kötüleşmesi hakkındadır. Pencerenizin yüzde 60'ında olabilir ve zaten kötü akıl yürütüyor olabilirsiniz.
Not: Güvenlik kısıtlamasını düşüren sıkıştırma, bayat bir arama sonucunu kaybeden sıkıştırmadan farklı bir hata sınıfıdır. Kısıtlamaları, görev spesifikasyonunu ve "X yapma" talimatlarını sabitlenmiş olarak etiketleyin ve bunları özetleyiciden tamamen dışlayın.
Güvenlik talimatını düşüren sıkıştırma, sıkıştırma yapmamaktan daha kötüdür. Sıkıştırırken sabitlenmiş kısıtlamaları koruyun.
Yeniden Başlatmada Durum Kaybı: Çöküş Yeniden Başlamak Anlamına Geldiğinde
Uzun süre çalışan bir ajan çöktüğünde, yeniden başlatma, OOM sonlandırması veya düşen bir ağ bağlantısından kaynaklanıyor olsun, varsayılan olarak checkpoint'ten devam etme yoktur. Döngü sıfırdan başlar: zaten bitirdiği işi yeniden yapar ve daha da kötüsü, aynı e-postayı iki kez göndermek veya ücretli bir API çağrısını yeniden çalıştırmak gibi daha önce gerçekleştirdiği eylemleri tekrar edebilir. Düzeltme checkpoint almaktır: döngünün durumunu her adımdan sonra kalıcı hale getirin, böylece yeniden başlatma sıfırdan değil kaldığı yerden rehydrate etsin.
LangGraph'ta checkpoint backend seçimi, geliştirme ile üretim arasındaki seçimdir. LangGraph'ın kalıcılık belgeleri describe SqliteSaver as "ideal for experimentation and local workflows" and PostgresSaver as "ideal for using in production," and the latter is what LangSmith itself runs on. The two are deliberately parallel in code, which makes the contrast easy to see:
# Development -- single file, no server, do not ship this
from langgraph.checkpoint.sqlite import SqliteSaver
# Production -- survives the box it runs on
from langgraph.checkpoint.postgres import PostgresSaver
İki ayrıntı insanları ısırıyor. Birincisi, checkpoint paketleri çekirdek LangGraph'tan ayrı kurulur (langgraph-checkpoint-sqlite ve langgraph-checkpoint-postgres kendi bağımlılıklarıdır), bu nedenle yeni bir ortamda siz ekleyene kadar Postgres saver olmayacaktır. İkincisi, her checkpoint işleminin config'de bir thread_id gereksinimi vardır. Bu ID, belirli bir çalıştırmayı kaydedilen durumuna bağlar ve doğru thread_id olmadan yeniden başlatma hiçbir şeyi rehydrate etmez.
Pro İpucu: LangGraph checkpoint paketleri ayrı kurulur.
langgraph-checkpoint-postgrestemellanggraphpaketi tarafından çekilmez; bu nedenle bir olay sırasında zor yoldan öğrenmeden önce onu üretim gereksinimler dosyanıza ekleyin.
n8n'in de aynı geliştirme-üretim ayrımı var, sadece farklı adlar altında. Yerleşik bellek seçeneği de Basit Bellek (veya Buffer Window Memory) olarak adlandırılır ve üretim yolu, yeniden başlatmayı atlatması gereken durum için Postgres Chat Memory düğümüdür. Yerleşik bellek konuşmayı çalışan süreçte tutar; bu test için iyidir ama 7/24 iş yükü için risk oluşturur. n8n ajanlarını canlı olarak çalıştıran uygulayıcılar, süreç içi bellek büyüyerek örneği çökertene kadar, Postgres destekli bir depoya geçmek zorunda kaldıklarını bildirmektedir. n8n kullanıyorsanız ve ajanınızın yeniden başlatma sonrasında bir şeyleri hatırlaması gerekiyorsa, baştan Postgres Chat Memory'e bağlayın.
SQLite checkpoint, geliştirme kolaylığıdır. Üretimde yeniden başlatmadan kurtulmak Postgres (LangGraph) veya Postgres destekli bir depo (n8n) anlamına gelir.
Yeniden Deneme Fırtınaları: Kendi Ajanlarınız Çökmüş Bir Servise DDoS Attığında
Bir alt servis çöktüğünde, safça yapılan yürütme başına yeniden denemeler, ajan filonuzu kendi kendinize bir hizmet reddi saldırısına dönüştürür. Düzeltmenin iki yarısı vardır: yeniden denemeleri zaman içinde yaymak için her ajanda jitter'lı üstel geri çekilme ve paylaşılan bir başarısızlık eşiğine ulaşıldıktan sonra devreye girerek tüm sürüyü açıkça çökmüş bir servisi dövmekten alıkoyan global bir devre kesici.
Matematik affetmez. Bir yeniden deneme örüntüleri yazısının da belirttiği gibi, her biri on kez yeniden deneyen on paralel ajan, zaten yerde olan bir servise yüz istek gönderir; çünkü her ajanın geri çekilmesi yürütme başınadır, global değil. Ajan başına geri çekilme tek başına bunu çözmez. Her biri kibarca geri çekilen on ajan, hepsi aynı anda başladıysa yine de uyum içinde geri çekilir ve senkronize dalgalar halinde yeniden dener. Jitter, her ajanın bekleme süresini rastgeleleştirerek senkronizasyonu bozar; devre kesici ise tek bir başarısızlık durumunu tüm ajanlarda paylaşarak sürüyü durdurur.
Geri çekilme yarısı Python'da çözülmüş bir problemdir; tenacity kütüphanesi üstel-jitter'lı yapıyı temiz biçimde ele alır:
from tenacity import retry, stop_after_attempt, wait_random_exponential
@retry(wait=wait_random_exponential(multiplier=1, max=60), stop=stop_after_attempt(5))
def call_flaky_service(payload):
return downstream.post(payload)
Devre kesici global: tüm ajanlar arasında paylaşılmalıdır, yürütme başına yeniden örneklenmemeli. Başarısızlıklar bir eşiği aştığında devre açılır, her ajan çağrı yapmak yerine hızla başarısız olur ve bir soğuma süresi sonunda servisi test etmek için tek bir probe geçirilir. Her ajanın kendi sürecinde yaşayan bir devre kesici hiçbir şeyi korumaz, çünkü hiçbir şey paylaşılmaz; çökmüş servis yine de yüz isteğin tamamını alır.
Yürütme başına geri çekilme, on ajanın çökmüş bir servisi hala uyum içinde dövmesine izin verir. Sürüyü durdurmak için devre kesicinin global olması gerekir.
Altı Hataya Tek Bakış
Altyapı kısmından önce, tüm katalog tek bir yerde: hata, onu yaratan mekanizma, koşum takımı düzeltmesi ve ilgili parametrenin her framework'teki yeri.
| Hata modu | Mekanizma | Koşum takımı düzeltmesi | Framework parametresi |
|---|---|---|---|
| Sonsuz döngü | Adım tavanı veya ilerleme kontrolü yok | Sert tavan + ilerleme algılaması | LangGraph recursion_limit (25) / n8n Max Iterations |
| Bağlam taşması | Geçmiş pencere dolana kadar büyüyor | Aralık tabanlı özetleme | Uygulama katmanı (pencerenin yaklaşık yüzde 50'sinde sıkıştır) |
| Sessiz araç hatası | Boş/yumuşak dönüşler geçerli işlemsizlikler olarak okunuyor | Her araç sonucunda doğrulama kapısı | Uygulama katmanı araç sarmalayıcısı |
| Akıl yürütme bozulması | Bağlam büyüdükçe dikkat bozuluyor ("bağlam çürümesi") | Sabitlenmiş kısıtlamaları koruyan döngü-ortası sıkıştırma | Uygulama katmanı, kısıtlama farkındalıklı |
| Yeniden başlatmada durum kaybı | Checkpoint yok; döngü sıfırdan başlıyor | Kalıcı checkpoint alma | LangGraph PostgresSaver / n8n Postgres Chat Memory |
| Yeniden deneme fırtınası | Yürütme başına yeniden denemeler çökmüş bir serviste kademeleniyor | Geri çekilme + jitter + global devre kesici | tenacity + paylaşılan devre kesici durumu |
CrewAI, AutoGen, Dify veya el yapımı bir Python döngüsü kullananlar için not: framework parametreleri değişir, ama altı örüntü değişmez. Tekilleştirme, aralık özetleme, şema doğrulama, kısıtlama farkındalıklı sıkıştırma, checkpoint ve global devre kesici, framework'ten bağımsız kavramlardır. Buradaki LangGraph ve n8n özelliklerini somut tutamaklar olarak düşünün, bu örüntülerin geçerli olduğu sınır olarak değil.
Üretim Ajan Dağıtımını Boyutlandırma
Yukarıdaki her örüntü, süreç yöneticisini, veritabanını ve yeniden başlatma davranışını kontrol ettiğinizi varsayar. Çökmüş bir döngü hiç geri gelmiyorsa checkpoint almanın hiçbir faydası yoktur ve global devre kesicinin paylaşılan durumunu tutacak bir yere ihtiyacı vardır. Bu kontrol tam olarak self-hosting'in size verdiği ve yönetilen kara kutunun vermediği şeydir. Dolayısıyla son karar, bunu 7/24 çalıştıran kutuyu boyutlandırmaktır.
Çoğu tek ajan dağıtımı için (bir ajan, harici API'ye giden LLM çağrıları, temel Postgres checkpoint) küçük bir örnek yeterlidir: yaklaşık 2 GB RAM, 1 vCPU, and 60 GB of NVMe storage. Ağır hesaplama model sağlayıcısı tarafında yaşar; sizin kutunuz çıkarım değil, orkestrasyon, checkpoint ve durum tutma işi yapar. Ajan durumlu ve çok adımlı, Postgres checkpoint artı oturum rehydration için Redis kullanıyorsa ya da aynı konağı paylaşan eşzamanlı iş akışları çalıştırıyorsanız yaklaşık 4 GB RAM, 2 vCPU, and 120 GB NVMe 'a geçin.
Bunun kısıtlı bir platform yerine self-managed VPS istedirmesinin nedeni, düzeltmelerin çalışmasının nedeniyle aynıdır: root gerektirir. Checkpoint için kendi Postgres'iniz, oturum durumu için kendi Redis'iniz ve gerçek bir süreç yöneticisi (örneğin systemd or pm2) gerekir; böylece bir döngü öldüğünde supervisor onu yeniden başlatır ve işi baştan başlatmak yerine son checkpoint'inden rehydrate eder. Tüm bu kurtarma senaryosu, süreç yaşam döngüsüne sahip olmaya bağlıdır.
Kendi marketplace'imizde n8n'i tek tıklama uygulaması olarak çalıştırdığımız için kurulumun bu kısmı kendi tarafımızda en kısa yoldur: Cloudzy VPS'te n8n'i dağıtabilirsiniz üretim yolunun ihtiyaç duyduğu Postgres destekli yapılandırmayla birlikte; kendi Redis ve süreç denetlemenizi eklemek için root erişiminizin olduğu bir örnekte. Bu, yukarıda açıklanan self-hosted ayak iziyle aynıdır; veritabanına ve yeniden başlatma davranışına sahip olursunuz ki bu checkpoint ve otomatik kurtarmayı gerçekten işlevsel kılan şeydir.
Koşum takımı örüntüleri yalnızca üzerinde çalıştıkları kutu kadar güvenilirdir. Süreç hiç yeniden başlamıyorsa checkpoint almanın faydası yoktur.
Sıkça Sorulan Sorular
LangGraph Ajanımın Sonsuza Kadar Döngüde Kalmasını Nasıl Önlerim?
İki mekanizmayı birlikte kullanın. Set recursion_limit 'yı sert bir adım tavanı olarak ayarlayın (varsayılan 25 adımdır), böylece kontrolden çıkmış bir döngü sınırsız bütçe harcayamaz. Ardından, her araç-artı-argüman çağrısını hash'leyen ve yakın bir pencerede aynı çağrı tekrarlandığında döngüyü sonlandıran ilerleme algılaması ekleyin. Tek başına tavan, yalnızca harcama gerçekleştikten sonra devreye giren bir güvencedir, gerçek döngü koruması değildir. Sıkışmış bir döngüyü gerçekten durduran şey ilerleme algılamasıdır.
Üretimde LangGraph için Doğru recursion_limit Nedir?
Evrensel bir sayı yoktur. Ajanınızın makul olarak ihtiyaç duyabileceği maksimum adım sayısına ve bir marj ekleyerek boyutlandırın; bunu kesinlikle bir maliyet güvencesi olarak ele alın. Sınırı yükseltmek, döngüdeki bir ajanın yakınsamasını sağlamaz. Ajanınız yüksek bir sınıra ulaşıyorsa, çözüm daha yüksek bir tavan değil ilerleme algılamasıdır.
n8n AI Ajanım Neden Sürekli Max Iterations'a Çarpıyor?
Max Iterations sınırına çarpmak, ajanın yakınsamadığı anlamına gelir: bir durdurma noktasına ulaşmadan sınırın izin verdiğinden fazla adım atıyor. Görev meşru olarak daha fazla adım gerektiriyorsa sınırı yükseltin; aksi takdirde bunu ajanın sıkıştığının sinyali olarak değerlendirin. Belirli bir tuzağa dikkat edin: GitHub issue #22771 "Hata Durumunda: Devam Et" ayarıyla iterasyon sınırına ulaşıldığında yürütmenin Hata çıkışı yerine Başarı çıkışına yönelebileceğini bildirmektedir; bu nedenle sınıra ulaşmış, başarısız bir çalıştırma iş akışınızda başarı gibi görünebilir.
Ajan Durumunu Yeniden Başlatmalar Arasında Nasıl Kalıcı Hale Getiririm?
LangGraph'ta yerel geliştirme için tasarlanmış PostgresSaver checkpoint yerine SqliteSaver, kullanın. n8n'de süreç içi yerleşik bellek yerine Postgres Chat Memory düğümünü kullanın. Her ikisi de kalıcı bir veritabanı gerektirir ve LangGraph'ta her checkpoint işleminin belirli bir çalıştırmayı kaydedilen durumuna bağlayan bir thread_id ihtiyacı vardır.
Uzun Ajan Çalıştırmalarında Akıl Yürütme Bozulmasına Ne Yol Açar?
Sert token sınırına ulaşmadan önce bile bağlam büyüdükçe akıl yürütme kalitesi düşer. Bu, "ortada kaybolma" etkisidir: model uzun bir bağlamın başına ve sonuna dikkat ederken ortayı kaybeder. Anthropic'in mühendislik blogu, temel mekanizmayı "bağlam çürümesi" olarak adlandırır: her token diğer her token'a dikkat ettiğinden n token için n² ikili ilişki elde edersiniz ve bağlam uzadıkça modelin dikkati giderek incelir. Düzeltme, bayat geçmişi özetlerken sabitlenmiş kısıtlamaları ve güvenlik talimatlarını sağlam tutarak döngü-ortası sıkıştırmadır.
Etiketlendi