أخطاء حلقات الوكلاء الشائعة
الحلقات اللانهائية، وتكرار استدعاء الأداة نفسها، وعدم الوصول إلى إجابة نهائية
أخطاء حلقات الوكلاء الشائعة درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
حلقة الوكيل وأنماط فشلها
تعمل حلقة الوكيل بشكل متكرر: يستدل → يستدعي أداة → يلاحظ النتيجة → يستدل من جديد. هذه الحلقة قوية لكنها هشة. ويمكن لعدة أنماط فشل معروفة أن تحاصر الوكيل، وتهدر الرموز المميزة، وتنتج مخرجات غير مفيدة.
يُعد فهم هذه الإخفاقات الخطوة الأولى للحماية منها.
الفشل 1: الحلقات اللانهائية
تحدث الحلقة اللانهائية عندما يستدعي الوكيل الأداة نفسها مرارًا باستخدام الوسيطات نفسها من دون إحراز تقدم. وقد يحدث ذلك عندما تُرجع الأداة نتيجة غير مفيدة ولا يتمكن الوكيل من إيجاد مخرج منها بالاستدلال.
# 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')الفشل 2: حالة عالقة
الحالة العالقة نسخة أكثر دقة من الحلقة اللانهائية. يواصل الوكيل الاستدلال واستدعاء أدوات مختلفة، لكنه لا يتمكن من الوصول إلى إجابة نهائية. ويتنقل ذهابًا وإيابًا بين الأساليب من دون إحراز تقدم.
# 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')الفشل 3: غياب الإجابة النهائية
تستمر بعض الوكلاء في التكرار من دون أن تقرر أن المهمة اكتملت. فهي تجمع المعلومات لكنها لا تتوقف لتجميعها وإرجاعها. ويؤدي ذلك إلى إهدار الرموز المميزة والوقت.
# 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.'الفشل 4: أخطاء تحليل استدعاءات الأدوات
عندما ينشئ LLM كائن JSON غير صالح لاستدعاء دالة، يفشل منفذ الأداة في تحليله. وقد يتعطل الوكيل سيئ التصميم أو يتجاوز الخطوة بصمت. أما الوكيل المتين فيلتقط أخطاء التحليل ويمرر الخطأ مرة أخرى إلى LLM.
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)الفشل 5: الأداة لا تُرجع بيانات مفيدة
قد تنجح الأداة من الناحية التقنية، أي من دون استثناء، لكنها تُرجع بيانات فارغة أو غير مفيدة. ويجب على الوكيل معالجة هذه الحالة، لا افتراض أن كل استدعاء لأداة يُرجع معلومات قابلة للاستخدام.
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.'الفشل 6: أسماء أدوات مختلقة
ينشئ LLM أحيانًا أسماء أدوات غير موجودة. تحققوا دائمًا من اسم الأداة مقابل الأدوات المسجلة قبل محاولة استدعائها. وأعيدوا إلى الوكيل رسالة خطأ توضيحية عند حدوث ذلك.
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)الفشل 7: استنفاد ميزانية الرموز المميزة
قد يصل وكيل يعمل لفترة طويلة ويخزن نتائج الأدوات كاملة في سياقه إلى حد نافذة سياق LLM. لخصوا نتائج الأدوات الكبيرة أو اقتطعوها قبل إضافتها إلى السجل.
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)
اكتشاف نمط الفشل برمجيًا
اكتبوا دالة تشخيص تحلل سجل خطوات الوكيل لتحديد نمط الفشل الذي حدث. وتُعد هذه الدالة ذات قيمة كبيرة أثناء تصحيح الأخطاء.
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))
تنفيذ ميزانية بسيطة للخطوات
يجب أن تحتوي كل حلقة وكيل مخصصة للإنتاج على حد صارم لعدد الخطوات. وهذه أهم آلية أمان؛ إذ تضمن انتهاء الحلقة بغض النظر عما يقرره LLM.
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}مرجع سريع: أنماط الفشل وإصلاحاتها
ملخص لأنماط فشل حلقات الوكلاء الستة وإصلاحاتها:
- الحلقة اللانهائية: اكتشفوا أزواج (الأداة، الوسيطات) المتكررة؛ واخرجوا مع تمرير ملاحظات الخطأ
- الحالة العالقة: استخدموا حارس
max_iterations؛ وأجبروا الوكيل على تقديم إجابة نهائية عند الاقتراب من الحد - غياب الإجابة النهائية: تحققوا صراحةً من وجود إشارة
final_answerفي الإجراء - أخطاء التحليل: أحاطوا تحليل JSON بكتلة
try/except؛ ومرروا الخطأ مرة أخرى إلى LLM - نتائج الأدوات الفارغة: اكتشفوا السلاسل الفارغة؛ وقدموا ملاحظات تفيد بعدم وجود بيانات
- أسماء الأدوات المختلقة: تحققوا منها مقابل الأدوات المسجلة؛ وأعيدوا رسالة خطأ
اختبار المعرفة: إخفاقات حلقة الوكيل
اختبروا فهمكم لأنماط فشل حلقات الوكلاء الشائعة.
مراجعة: إخفاقات حلقات الوكلاء الشائعة
يمكنكم الآن تحديد أنماط فشل حلقات الوكلاء الرئيسية والحماية منها:
- تتطلب الحلقات اللانهائية والحالات العالقة وغياب الإجابات النهائية حارس الحد الأقصى للتكرارات
- تحتاج أخطاء تحليل استدعاءات الأدوات إلى try/except حول تحليل JSON
- تحتاج نتائج الأدوات الفارغة إلى اكتشافها وتقديم ملاحظات توضيحية إلى LLM
- تحتاج أسماء الأدوات المختلقة إلى التحقق منها مقابل قائمة الأدوات المسجلة
- يحتاج استنفاد ميزانية الرموز المميزة إلى اقتطاع النتائج
تتوقع حلقة الوكيل المتينة جميع أنماط الفشل هذه وتعالجها بسلاسة.
الأسئلة الشائعة
هل درس «أخطاء حلقات الوكلاء الشائعة» مجاني؟
نعم — نص درس «أخطاء حلقات الوكلاء الشائعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «أخطاء حلقات الوكلاء الشائعة»؟
الحلقات اللانهائية، وتكرار استدعاء الأداة نفسها، وعدم الوصول إلى إجابة نهائية تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أخطاء حلقات الوكلاء الشائعة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أخطاء حلقات الوكلاء الشائعة
- تسجيل التتبعات لخطوات الوكيل
- اكتشاف الحلقات اللانهائية وكسرها
- تقنيات تصحيح الأخطاء خطوة بخطوة