Sonsuz Döngüleri Tespit Etme ve Kırma
Maksimum yineleme korumaları, yinelenen eylem tespiti ve döngü devre kesicileri.
Sonsuz Döngüleri Tespit Etme ve Kırma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Sonsuz Döngü Tehdidi
Sonsuz döngüye giren bir aracı belirteçleri tüketir, kaynakları engeller ve yararlı bir çıktı üretmez. Üretimde bunun doğrudan karşılığı boşa harcanan para ve kullanıcıların yaşadığı hayal kırıklığıdır.
Sonsuz döngüleri önlemek için üç mekanizma birlikte çalışır: azami yineleme sınırları, yinelenen eylem saptama ve zaman aşımları.
Koruma 1: Azami Yineleme Sınırı
En basit ve en önemli koruma, kesin bir adım sınırıdır. Her aracı döngüsünün bir sınırı olmalıdır. Sınıra ulaşıldığında aracı ya o ana kadarki en iyi yanıtını ya da açık bir başarısızlık iletisini döndürür.
MAX_ITERATIONS = 20
def run_agent(query: str) -> dict:
history = []
for step in range(1, MAX_ITERATIONS + 1):
action = decide_action(query, history)
if action['type'] == 'final_answer':
return {'status': 'ok', 'answer': action['answer'], 'steps': step}
result = execute_tool(action['tool'], action['args'])
history.append({'step': step, 'tool': action['tool'], 'result': result})
# Hard stop — max iterations reached
return {
'status': 'max_iterations_reached',
'answer': None,
'steps': MAX_ITERATIONS
}Koruma 2: Yinelenen Eylemleri Saptama
Yinelenen eylemler sonsuz döngünün tipik belirtisidir. Araç adı ve bağımsız değişken çiftlerinden oluşan bir geçmişi izleyin. Aynı çift N'den fazla kez görünürse aracı takılmış demektir — döngüyü kırın ve bir hata iletisi ekleyin.
import hashlib
import json
def action_hash(tool_name: str, args: dict) -> str:
payload = json.dumps({'tool': tool_name, 'args': args}, sort_keys=True)
return hashlib.md5(payload.encode()).hexdigest()
def run_agent_with_repeat_detection(query: str) -> dict:
history = []
action_counts = {}
for step in range(1, 21):
action = decide_action(query, history)
if action['type'] == 'final_answer':
return {'status': 'ok', 'answer': action['answer']}
key = action_hash(action['tool'], action['args'])
action_counts[key] = action_counts.get(key, 0) + 1
if action_counts[key] > 2: # seen this exact action more than twice
history.append({
'role': 'system',
'content': f'You have called {action["tool"]} with the same arguments {action_counts[key]} times. '
f'This approach is not working. Try a completely different strategy or state what you know so far.'
})
continue
result = execute_tool(action['tool'], action['args'])
history.append({'tool': action['tool'], 'result': result})
return {'status': 'loop_detected', 'answer': None}Yinelenen Eylemleri Bir Pencerede İzleme
Tüm zamanlardaki sayımları izlemek yerine, son N adımın kayan penceresinde yinelemeyi saptayın. Bu yöntem, küçük farklılıklar gösteren ancak kısa bir süre içinde döngü oluşturan döngüleri yakalar.
from collections import deque
def is_cycling(recent_actions: deque, window: int = 6) -> bool:
if len(recent_actions) < window:
return False
# Check if the last window/2 actions repeat the first window/2
half = window // 2
first_half = list(recent_actions)[:half]
second_half = list(recent_actions)[half:window]
return first_half == second_half
# In the agent loop:
# recent_actions = deque(maxlen=6)
# recent_actions.append(action_hash(tool, args))
# if is_cycling(recent_actions):
# print('Cycling detected — breaking loop')
# break
recent = deque(['a', 'b', 'a', 'b'], maxlen=6)
print(is_cycling(recent, window=4)) # True — cycling detectedsignal.alarm ile Gerçek Zaman Zaman Aşımı
Unix sistemlerinde signal.alarm(), belirtilen saniye sayısından sonra bir SIGALRM oluşturur. Bu, aracı döngüsü yavaş bir araç çağrısında engellense bile kesin bir zaman aşımı sağlar.
import signal
class AgentTimeout(Exception):
pass
def timeout_handler(signum, frame):
raise AgentTimeout('Agent exceeded time limit')
def run_agent_with_signal_timeout(query: str, timeout_seconds: int = 60) -> dict:
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(timeout_seconds) # set the alarm
try:
result = run_core_agent_loop(query)
signal.alarm(0) # cancel the alarm on success
return result
except AgentTimeout:
signal.alarm(0)
return {'status': 'timeout', 'answer': None}
except Exception as e:
signal.alarm(0)
raise
# Note: signal.alarm is Unix-only (Linux/Mac)threading.Timer ile Zaman Aşımı (Platformlar Arası)
threading.Timer, Windows da dahil olmak üzere tüm platformlarda çalışır. Zaman aşımı süresi dolduktan sonra bir işaret ayarlayın — aracı döngüsü bu işareti kontrol eder ve ayarlanmışsa çıkar.
import threading
def run_agent_with_timer_timeout(query: str, timeout_seconds: int = 60) -> dict:
timed_out = threading.Event()
def set_timeout():
timed_out.set()
timer = threading.Timer(timeout_seconds, set_timeout)
timer.start()
history = []
try:
for step in range(1, 21):
if timed_out.is_set():
return {'status': 'timeout', 'answer': None, 'steps': step}
action = decide_action(query, history)
if action['type'] == 'final_answer':
return {'status': 'ok', 'answer': action['answer']}
result = execute_tool(action['tool'], action['args'])
history.append({'tool': action['tool'], 'result': result})
finally:
timer.cancel() # always cancel if done before timeout
return {'status': 'max_steps', 'answer': None}asyncio.wait_for ile Asenkron Zaman Aşımı
Asenkron aracı mimarilerinde asyncio.wait_for(coroutine, timeout=N) kullanın. Eş yordam belirtilen saniyeler içinde tamamlanmazsa asyncio.TimeoutError oluşturur.
import asyncio
async def run_async_agent(query: str) -> dict:
history = []
for step in range(1, 21):
action = await async_decide_action(query, history)
if action['type'] == 'final_answer':
return {'status': 'ok', 'answer': action['answer']}
result = await async_execute_tool(action['tool'], action['args'])
history.append({'tool': action['tool'], 'result': result})
return {'status': 'max_steps', 'answer': None}
async def run_with_timeout(query: str, timeout: float = 60.0) -> dict:
try:
return await asyncio.wait_for(run_async_agent(query), timeout=timeout)
except asyncio.TimeoutError:
return {'status': 'timeout', 'answer': None}
# asyncio.run(run_with_timeout('What is Python?', timeout=30.0))Geçmişe Döngüden Çıkış Talimatları Ekleme
Bir döngü saptandığında yalnızca sessizce kırmayın. Konuşma geçmişine ne olduğunu açıklayan ve aracının sonuca varmasını isteyen bir sistem iletisi ekleyin. Bu, kesilmeden önce LLM'nin nihai bir yanıt üretmesini sağlar.
def inject_loop_escape(history: list, step: int, reason: str):
message = (
f'[SYSTEM] You have been running for {step} steps. Reason: {reason}. '
f'You MUST now provide a FINAL_ANSWER based on what you have found so far, '
f'even if the information is incomplete. Do not call any more tools.'
)
history.append({'role': 'system', 'content': message})
# In the agent loop, when approaching the limit:
# if step >= MAX_ITERATIONS - 2:
# inject_loop_escape(history, step, 'approaching max iteration limit')
# Or when a repeat is detected:
# if action_counts[key] > 2:
# inject_loop_escape(history, step, 'repeated action detected')
if __name__ == '__main__':
demo_history = []
inject_loop_escape(demo_history, step=18, reason='approaching max iteration limit')
print(demo_history[-1]['content'])
Döngü Kırıldığında Günlüğe Kaydetme
Bir döngü koruması devreye girdiğinde her zaman günlük kaydı oluşturun. Bu, aracıların ne sıklıkta ve neden takıldığını gösteren bir kayıt oluşturur — istemlerinizi ve araç uygulamalarınızı iyileştirmek için çok değerli verilerdir.
import logging
logger = logging.getLogger('agent_guard')
def check_and_break_loop(step: int, action_counts: dict, current_key: str) -> bool:
count = action_counts.get(current_key, 0)
if count > 2:
logger.warning(
f'Infinite loop detected at step {step}. '
f'Action hash {current_key[:8]} seen {count} times. '
f'Breaking loop.'
)
return True # signal to break
if step >= 18: # approaching limit
logger.warning(
f'Approaching max iterations at step {step}. '
f'Injecting escape prompt.'
)
return False
if __name__ == '__main__':
import sys
logging.basicConfig(level=logging.WARNING, format='%(message)s', stream=sys.stdout)
demo_counts = {'search:{"q": "weather"}': 3}
check_and_break_loop(step=10, action_counts=demo_counts, current_key='search:{"q": "weather"}')
Üç Korumanın Tümünü Birleştirme
Üretim aracılarında üç korumanın tümü birleştirilmelidir: azami yineleme (zorunlu), yineleme saptama (döngüleri yakalar) ve zaman aşımı (engelleyen araç çağrılarını yakalar). Birlikte kullanıldıklarında döngüyü son derece dayanıklı hale getirirler.
import threading
import hashlib
import json
def run_production_agent(query: str) -> dict:
MAX_STEPS = 20
TIMEOUT_SEC = 120
timed_out = threading.Event()
timer = threading.Timer(TIMEOUT_SEC, timed_out.set)
timer.start()
history = []
action_counts = {}
try:
for step in range(1, MAX_STEPS + 1):
if timed_out.is_set():
return {'status': 'timeout'}
action = decide_action(query, history)
if action['type'] == 'final_answer':
return {'status': 'ok', 'answer': action['answer']}
key = hashlib.md5(json.dumps(action, sort_keys=True).encode()).hexdigest()
action_counts[key] = action_counts.get(key, 0) + 1
if action_counts[key] > 2:
inject_loop_escape(history, step, 'repeat detected')
continue
result = execute_tool(action['tool'], action['args'])
history.append({'tool': action['tool'], 'result': result})
finally:
timer.cancel()
return {'status': 'max_steps'}Döngü Korumalarını Birim Sınamalarıyla Sınama
Döngü korumalarınız için özel birim sınamaları yazın. Her zaman aynı aracı çağıran sahte bir aracı oluşturun ve korumanın bunu beklenen adım sayısı içinde saptadığını doğrulayın.
from unittest.mock import MagicMock
def test_repeat_detection_breaks_loop():
# Create a mock that always returns the same action
always_same_action = MagicMock(return_value={
'type': 'tool',
'tool': 'search_web',
'args': {'query': 'same query'}
})
always_success = MagicMock(return_value='some result')
result = run_agent_with_repeat_detection(
query='test',
decide_action=always_same_action,
execute_tool=always_success
)
# Should stop due to loop detection, not run all 20 steps
assert result['status'] in ('loop_detected', 'max_iterations_reached')
# Should not have run all 20 steps (loop should be detected by step 6-7)
print('Loop guard test passed')Bilgi Yoklaması: Sonsuz Döngüleri Saptama
Sonsuz döngüleri saptama ve kırma tekniklerini anlayıp anlamadığınızı sınayın.
Özet: Sonsuz Döngüleri Saptama ve Kırma
Artık üç tamamlayıcı korumayla aracılarınızı sonsuz döngülere karşı koruyabilirsiniz:
- Azami yineleme: Her aracı döngüsünde zorunlu olan kesin adım sınırı
- Yineleme saptama: (araç, bağımsız değişkenler) çiftlerinin özet değerini hesaplayın ve N'den fazla görüldüğünde döngüyü kırın
- Zaman aşımı: Unix'te
signal.alarm(), platformlar arasındathreading.Timer, asenkron işlemler içinasyncio.wait_for() - Çıkış ekleme: Aracıya zorla durdurmadan önce sonuca varma fırsatı tanıyın
- Bir koruma her devreye girdiğinde mutlaka günlük kaydı oluşturun — bu, istemleri iyileştirmek için değerli veridir
Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 60
- Dersler
- 239
Sıkça Sorulan Sorular
“Sonsuz Döngüleri Tespit Etme ve Kırma” dersi ücretsiz mi?
Evet — “Sonsuz Döngüleri Tespit Etme ve Kırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Sonsuz Döngüleri Tespit Etme ve Kırma” dersinde ne öğreneceğim?
Maksimum yineleme korumaları, yinelenen eylem tespiti ve döngü devre kesicileri. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Sonsuz Döngüleri Tespit Etme ve Kırma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yaygın Aracı Döngüsü Hataları
- Aracı Adımları İçin İz Günlüğü Kaydı
- Sonsuz Döngüleri Tespit Etme ve Kırma
- Adım Adım Hata Ayıklama Teknikleri