Yaygın Aracı Döngüsü Hataları
Sonsuz döngüler, aynı araç çağrısını yineleme ve hiçbir zaman nihai yanıta ulaşamama.
Yaygın Aracı Döngüsü Hataları, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 1. 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.
Aracı Döngüsü ve Başarısızlık Türleri
Bir aracı döngüsü tekrar tekrar çalışır: akıl yürütür → araç çağırır → sonucu gözlemler → yeniden akıl yürütür. Bu döngü güçlüdür, ancak hassastır. İyi bilinen çeşitli başarısızlık türleri bir aracıyı sıkıştırabilir, belirteçleri boşa harcayabilir ve yararlı bir çıktı üretememesine yol açabilir.
Bu başarısızlıkları anlamak, bunlara karşı korunmanın ilk adımıdır.
Başarısızlık 1: Sonsuz Döngüler
Bir aracı ilerleme kaydetmeden aynı aracı aynı bağımsız değişkenlerle tekrar tekrar çağırdığında sonsuz döngü oluşur. Bu durum, araç yararsız bir sonuç döndürdüğünde ve aracı bu durumdan akıl yürüterek çıkamadığında ortaya çıkabilir.
# Example of an agent in an infinite loop:
# Step 1: reasoning='Need to search for Python docs'
# tool='search_web', args={'query': 'Python documentation'}
# Step 2: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# Step 3: reasoning='Search result was unhelpful, try again'
# tool='search_web', args={'query': 'Python documentation'}
# ... repeats until max_iterations or token budget is exhausted
print('Symptom: same tool + same arguments appearing repeatedly in steps')
print('Fix: detect repeated (tool, args) pairs and break the loop')Başarısızlık 2: Takılı Kalma Durumu
Takılı kalma durumu, sonsuz döngünün daha incelikli bir biçimidir. Aracı akıl yürütmeye ve farklı araçları çağırmaya devam eder, ancak nihai bir yanıta ulaşamaz. İlerleme kaydetmeden yaklaşımlar arasında gidip gelir.
# Example of a stuck agent:
# Step 1: tool='search_web', args={'query': 'topic A'}
# Step 2: tool='search_web', args={'query': 'topic B'} # different args
# Step 3: tool='search_web', args={'query': 'topic A'} # back to first
# Step 4: tool='read_document', args={'url': '...'}
# Step 5: tool='search_web', args={'query': 'topic A'}
# ... no FINAL_ANSWER ever produced
print('Symptom: agent takes many steps but never calls FINAL_ANSWER')
print('Fix: max_iterations guard + force final answer if limit is near')Başarısızlık 3: Son Yanıtın Eksik Olması
Bazı aracılar görevin tamamlandığına hiçbir zaman karar vermeden döngüye girer. Bilgi toplarlar, ancak durup bu bilgileri birleştirerek döndürmezler. Bu durum belirteçleri ve zamanı boşa harcar.
# An agent that never concludes:
def run_agent_bad(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'tool':
result = execute_tool(action)
history.append(result)
# BUG: No check for 'final_answer' type!
# The agent loops until max_steps, returning None
return None # never actually returns an answer
# Fix: explicitly check for final_answer signal
def run_agent_good(query: str, max_steps: int = 20) -> str:
for step in range(max_steps):
action = llm_decide_action(query, history)
if action['type'] == 'final_answer':
return action['answer'] # exit cleanly
execute_tool(action)
return 'Reached step limit without a conclusion.'Başarısızlık 4: Araç Çağrısı Ayrıştırma Hataları
LLM bir işlev çağrısı için hatalı JSON oluşturduğunda, araç yürütücüsü bunu ayrıştıramaz. Kötü yazılmış bir aracı çöker veya adımı sessizce atlar. Sağlam bir aracı, ayrıştırma hatalarını yakalar ve hatayı LLM'ye geri iletir.
import json
def safe_parse_tool_call(arguments_str: str) -> dict:
try:
return json.loads(arguments_str)
except json.JSONDecodeError as e:
print(f'Failed to parse tool arguments: {e}')
print(f'Raw: {arguments_str}')
return None
def execute_step(tool_call) -> str:
args = safe_parse_tool_call(tool_call.function.arguments)
if args is None:
# Feed the error back to the LLM in the next step
return f'ERROR: Could not parse tool arguments. Raw: {tool_call.function.arguments}'
return run_tool(tool_call.function.name, args)Başarısızlık 5: Araç Yararlı Veri Döndürmüyor
Bir araç teknik olarak başarılı olabilir (istisna oluşmaz), ancak boş veya yararsız veriler döndürebilir. Aracı bu durumu ele almalı ve her araç çağrısının kullanılabilir bilgiler döndürdüğünü varsaymamalıdır.
def run_agent_with_empty_result_handling(query: str) -> str:
for step in range(20):
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return action['answer']
result = execute_tool(action['tool'], action['args'])
# Detect empty results and provide context
if not result or result.strip() == '':
observation = f'Tool {action["tool"]} returned no data. Try a different approach or different arguments.'
elif 'error' in result.lower():
observation = f'Tool error: {result}. Consider a different tool or query.'
else:
observation = result
history.append({'tool': action['tool'], 'result': observation})
return 'Could not complete task within step limit.'Başarısızlık 6: Uydurulmuş Araç Adları
LLM bazen var olmayan araç adları oluşturur. Çağırmayı denemeden önce araç adını her zaman kayıtlı araçlara göre doğrulayın. Böyle bir durum gerçekleştiğinde aracıya açıklayıcı bir hata döndürün.
REGISTERED_TOOLS = {
'search_web': search_web_function,
'get_weather': get_weather_function,
'calculate': calculate_function
}
def dispatch_tool(tool_name: str, args: dict) -> str:
if tool_name not in REGISTERED_TOOLS:
available = ', '.join(REGISTERED_TOOLS.keys())
return (
f'ERROR: Unknown tool "{tool_name}". '
f'Available tools: {available}. '
f'Please use one of the available tools.'
)
tool_fn = REGISTERED_TOOLS[tool_name]
return tool_fn(**args)Başarısızlık 7: Belirteç Bütçesinin Tükenmesi
Araç sonuçlarının tamamını bağlamında saklayan uzun süre çalışan bir aracı, LLM bağlam penceresinin sınırına ulaşabilir. Geçmişe eklemeden önce büyük araç sonuçlarını özetleyin veya kısaltın.
def truncate_tool_result(result: str, max_chars: int = 2000) -> str:
if len(result) <= max_chars:
return result
truncated = result[:max_chars]
return f'{truncated}\n... [result truncated to {max_chars} chars]'
def add_observation_to_history(history: list, tool_name: str, result: str):
safe_result = truncate_tool_result(result, max_chars=2000)
history.append({
'role': 'tool',
'content': safe_result,
'tool_name': tool_name
})
print(f'[Step] Tool={tool_name}, Result length={len(result)} (stored {len(safe_result)})')
if __name__ == '__main__':
demo_history = []
add_observation_to_history(demo_history, 'search_web', 'x' * 3000)
Başarısızlık Türünü Programatik Olarak Saptama
Hangi başarısızlık türünün gerçekleştiğini belirlemek için aracının adım geçmişini analiz eden bir tanılama işlevi yazın. Bu, hata ayıklama sırasında çok değerlidir.
def diagnose_agent_failure(steps: list) -> str:
if not steps:
return 'No steps recorded'
# Check for infinite loop: same (tool, args) repeated
seen = {}
for s in steps:
key = (s.get('tool'), str(s.get('args')))
seen[key] = seen.get(key, 0) + 1
repeated = {k: v for k, v in seen.items() if v > 2}
if repeated:
return f'INFINITE_LOOP: repeated actions: {repeated}'
# Check for missing final answer
has_answer = any(s.get('type') == 'final_answer' for s in steps)
if not has_answer and len(steps) >= 15:
return 'STUCK_STATE: many steps taken but no final answer'
# Check for parse errors
errors = [s for s in steps if 'ERROR' in str(s.get('result', ''))]
if len(errors) > 2:
return f'TOOL_ERROR: {len(errors)} tool errors in pipeline'
return 'OK'
if __name__ == '__main__':
demo_steps = [{'tool': 'search_web', 'args': {'q': 'weather'}} for _ in range(3)]
print('Diagnosis:', diagnose_agent_failure(demo_steps))
Basit Bir Adım Bütçesi Uygulama
Her üretim aracı döngüsünün kesin bir adım sınırı olmalıdır. Bu, en önemli güvenlik mekanizmasıdır — LLM neye karar verirse versin döngünün sonlanmasını garanti eder.
def run_agent_with_budget(query: str, max_steps: int = 15) -> dict:
history = []
for step in range(1, max_steps + 1):
print(f'[Step {step}/{max_steps}]')
action = decide_next_action(query, history)
if action['type'] == 'final_answer':
return {
'status': 'success',
'answer': action['answer'],
'steps_taken': step
}
result = execute_tool(action['tool'], action['args'])
history.append({'step': step, 'tool': action['tool'], 'result': result})
if step == max_steps - 1:
# Warn the agent it must conclude
history.append({'role': 'system',
'content': 'You must provide a FINAL_ANSWER on the next step.'})
return {'status': 'timeout', 'answer': None, 'steps_taken': max_steps}Hızlı Başvuru: Başarısızlık Türleri ve Çözümleri
Altı aracı döngüsü başarısızlık türünün ve çözümlerinin özeti:
- Sonsuz döngü: yinelenen (araç, bağımsız değişkenler) çiftlerini saptayın; hata geri bildirimiyle döngüyü kırın
- Takılı kalma durumu: azami yineleme koruması kullanın; sınıra yaklaşırken nihai yanıtı zorlayın
- Son yanıtın eksik olması: eylemde nihai yanıt sinyalini açıkça kontrol edin
- Ayrıştırma hataları: JSON ayrıştırmasını try/except içine alın; hatayı LLM'ye geri iletin
- Boş araç sonuçları: boş dizeleri saptayın; 'veri yok' geri bildirimi sağlayın
- Uydurulmuş araç adları: kayıtlı araçlara göre doğrulayın; hata iletisi döndürün
Bilgi Yoklaması: Aracı Döngüsü Başarısızlıkları
Yaygın aracı döngüsü başarısızlıklarını anlayıp anlamadığınızı sınayın.
Özet: Yaygın Aracı Döngüsü Başarısızlıkları
Artık başlıca aracı döngüsü başarısızlıklarını saptayabilir ve bunlara karşı korunabilirsiniz:
- Sonsuz döngüler, takılı kalma durumları ve eksik nihai yanıtların tümü azami yineleme koruması gerektirir
- Araç çağrısı ayrıştırma hatalarında JSON ayrıştırmasının çevresinde try/except kullanılmalıdır
- Boş araç sonuçları saptanmalı ve LLM'ye açıklayıcı geri bildirim verilmelidir
- Uydurulmuş araç adları, kayıtlı araç listesine göre doğrulanmalıdır
- Belirteç bütçesinin tükenmesini önlemek için sonuçlar kısaltılmalıdır
Sağlam bir aracı döngüsü tüm bu başarısızlık türlerini öngörür ve bunları uygun biçimde ele alır.
Sıkça Sorulan Sorular
“Yaygın Aracı Döngüsü Hataları” dersi ücretsiz mi?
Evet — “Yaygın Aracı Döngüsü Hataları” 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.
“Yaygın Aracı Döngüsü Hataları” dersinde ne öğreneceğim?
Sonsuz döngüler, aynı araç çağrısını yineleme ve hiçbir zaman nihai yanıta ulaşamama. 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 1. dersidir.
“Yaygın Aracı Döngüsü Hataları” 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