الدرس 13 من 20

معالجة الأخطاء والتعافي

أوضاع الفشل في الوكلاء

3 دقيقة للقراءة

يمكن أن يفشل وكلاء الذكاء الاصطناعي بطرق عديدة—فهم أوضاع الفشل هذه هو الخطوة الأولى لبناء أنظمة قوية.

فئات الفشل الشائعة

الفئة مثال التأثير
فشل API حدود المعدل، انتهاء المهلة، انقطاع الخدمة توقف الوكيل عن العمل
فشل الأدوات معلمات غير صالحة، أخطاء الصلاحيات مهام غير مكتملة
فشل الاستدلال هلوسات، حلقات، استنتاجات خاطئة مخرجات غير صحيحة
فشل السياق تجاوز الرموز، فقدان السياق أداء متدهور

فشل API والشبكة

import time
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential(multiplier=1, min=4, max=60)
)
def call_llm_with_retry(prompt):
    """إعادة محاولة استدعاءات LLM مع تراجع أسي"""
    try:
        return llm.generate(prompt)
    except RateLimitError:
        raise  # سيؤدي لإعادة المحاولة
    except ServiceUnavailableError:
        raise  # سيؤدي لإعادة المحاولة

فشل تنفيذ الأدوات

class SafeToolExecutor:
    def execute(self, tool_name, params):
        try:
            result = self.tools[tool_name].run(**params)
            return {"success": True, "result": result}
        except KeyError:
            return {"success": False, "error": f"أداة غير معروفة: {tool_name}"}
        except TypeError as e:
            return {"success": False, "error": f"معلمات غير صالحة: {e}"}
        except PermissionError:
            return {"success": False, "error": "تم رفض الصلاحية"}
        except Exception as e:
            return {"success": False, "error": f"خطأ غير متوقع: {e}"}

فشل الاستدلال

الحلقات اللانهائية

class LoopDetector:
    def __init__(self, max_iterations=10):
        self.max_iterations = max_iterations
        self.action_history = []

    def check_and_record(self, action):
        self.action_history.append(action)

        # التحقق من الأنماط المتكررة
        if len(self.action_history) > self.max_iterations:
            recent = self.action_history[-5:]
            if len(set(recent)) == 1:  # نفس الإجراء متكرر
                raise LoopDetectedError("الوكيل عالق في حلقة")

        return True

كشف الهلوسات

def verify_tool_output(claimed_result, actual_result):
    """التحقق إذا كانت النتيجة المدعاة تطابق ناتج الأداة الفعلي"""
    if claimed_result != actual_result:
        return {
            "verified": False,
            "discrepancy": f"الوكيل ادعى '{claimed_result}' لكن الأداة أرجعت '{actual_result}'"
        }
    return {"verified": True}

مراقبة الفشل

تتبع الإخفاقات لتحديد الأنماط:

from collections import defaultdict
from datetime import datetime

class FailureTracker:
    def __init__(self):
        self.failures = defaultdict(list)

    def log_failure(self, category, details):
        self.failures[category].append({
            "timestamp": datetime.now(),
            "details": details
        })

    def get_failure_rate(self, category, hours=24):
        cutoff = datetime.now() - timedelta(hours=hours)
        recent = [f for f in self.failures[category]
                  if f["timestamp"] > cutoff]
        return len(recent)

مؤشرات الفشل الرئيسية

راقب هذه العلامات التحذيرية:

  • إعادة محاولات متكررة ← مشكلة في الخدمة الأساسية
  • زيادة التأخير ← قيود الموارد
  • ارتفاع أخطاء الأدوات ← تغييرات في المخطط أو API
  • اقتطاع السياق ← الحاجة لإدارة ذاكرة أفضل

التالي: تعلم كيفية التعامل مع الإخفاقات بسلاسة دون كسر تجربة المستخدم. :::

اختبار

الوحدة 4: معالجة الأخطاء والتعافي

خذ الاختبار