0Pricing
AI Agents · درس

اكتشاف أخطاء الأدوات والتعافي منها

عندما تعيد أداة الخطأ 500، أعد الخطأ إلى النموذج ليجرّب نهجًا مختلفًا بدلًا من تعطّل البرنامج.

اكتشاف أخطاء الأدوات والتعافي منها درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

الأدوات تفشل، فخططوا لذلك

تفشل كل أداة حقيقية أحيانًا:

  • انتهاء مهلات الشبكة
  • حدود معدل الطلبات
  • وسائط غير صحيحة من النموذج
  • توقف الخدمة الخارجية
  • بيانات مصادقة غير صالحة

يجب أن تتعافى وكلاء الإنتاج من هذه الحالات بسلاسة.

أعيدوا النتيجة دائمًا ولا تثيروا استثناءً

داخل حلقة الوكيل، التقطوا جميع أخطاء الأدوات وأعيدوها كمحتوى. لا تسمحوا أبدًا لاستثناء بإنهاء الحلقة:

def safe_dispatch(tool_call):
    try:
        args = json.loads(tool_call.function.arguments)
        return TOOLS[tool_call.function.name](**args)
    except json.JSONDecodeError:
        return {'error': 'Arguments are not valid JSON.'}
    except KeyError:
        return {'error': f'Unknown tool: {tool_call.function.name}'}
    except Exception as e:
        return {'error': f'{type(e).__name__}: {e}'}

تنسيق الأخطاء المنظم

استخدموا بنية موحّدة حتى يتعرف النموذج على الأخطاء:

error = {'ok': False, 'error_type': 'TimeoutError', 'error_message': 'Tavily timed out after 10s', 'retryable': True}
print(error)

ميّزوا الأخطاء القابلة لإعادة المحاولة عن الدائمة

تستحق بعض الأخطاء إعادة المحاولة، مثل انتهاء المهلة؛ بينما لا تستحق أخطاء أخرى ذلك، مثل 404. أخبروا النموذج:

if isinstance(e, requests.Timeout):
    return {'ok': False, 'retryable': True, 'error': str(e)}
if isinstance(e, ValueError):
    return {'ok': False, 'retryable': False, 'error': str(e)}

إعادة المحاولة التلقائية للأخطاء المؤقتة

بالنسبة إلى استدعاءات الشبكة، أعيدوا المحاولة مع تراجع أُسّي:

from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type

@retry(
    wait=wait_exponential(multiplier=1, max=10),
    stop=stop_after_attempt(3),
    retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def web_search(query):
    return requests.get('https://api.tavily.com/search', ...).json()

التحقق من الوسائط

قبل استدعاء الأداة، تحقّقوا من الوسائط باستخدام نموذج Pydantic:

from pydantic import BaseModel, ValidationError

class SearchArgs(BaseModel):
    query: str
    k: int = 5

try:
    args = SearchArgs.model_validate_json(tool_call.function.arguments)
except ValidationError as e:
    return {'error': f'Bad arguments: {e}'}

أظهروا الخطأ للنموذج

أضيفوا الخطأ كنتيجة للأداة، ثم استدعوا النموذج مرة أخرى. فكثيرًا ما يصحح النموذج نفسه:

messages.append({
    'role': 'tool',
    'tool_call_id': tc.id,
    'content': json.dumps({'error': 'Argument k must be an integer'})
})
# Next model call: 'Sorry, let me retry with k=5...'

تجنبوا حلقات الأخطاء اللانهائية

عندما تُعرض على بعض النماذج رسالة خطأ، تعيد استدعاء العملية المعطلة نفسها. حدّدوا عدد تكرارات الحلقة واكتشفوا التكرارات:

recent_calls = []
for tc in msg.tool_calls:
    key = (tc.function.name, tc.function.arguments)
    if recent_calls.count(key) >= 3:
        return 'Agent stuck in retry loop, aborting.'
    recent_calls.append(key)

التعافي الخاص بكل أداة

بالنسبة إلى الأدوات المعروفة بعدم استقرارها، أنشئ منطق إعادة المحاولة داخل الأداة، وليس داخل الحلقة:

def search_with_fallback(query):
    try:
        return tavily_search(query)
    except Exception:
        return bing_search(query)   # secondary provider

مهلة زمنية لكل استدعاء

يحتاج كل استدعاء خارجي إلى مهلة زمنية. وإلا فإن خدمة بطيئة واحدة ستجمّد وكيلك بالكامل:

import requests
response = requests.get(url, timeout=10)  # 10s

# For LLM calls:
from openai import OpenAI
client = OpenAI(timeout=30.0)

قواطع الدائرة

عندما تفشل أداة بشكل متكرر، «افتح» الدائرة وتجاوزها لبعض الوقت:

import time

class CircuitOpen(Exception):
    pass

def circuit(failure_threshold=5, recovery_timeout=60):
    def decorator(func):
        state = {'failures': 0, 'open_until': 0}
        def wrapper(*args, **kwargs):
            if time.time() < state['open_until']:
                raise CircuitOpen('circuit is open')
            try:
                result = func(*args, **kwargs)
                state['failures'] = 0
                return result
            except Exception:
                state['failures'] += 1
                if state['failures'] >= failure_threshold:
                    state['open_until'] = time.time() + recovery_timeout
                raise
        return wrapper
    return decorator

@circuit(failure_threshold=3, recovery_timeout=1)
def fragile_tool(x):
    if x < 0:
        raise ValueError('bad input')
    return x * 2

for x in [1, -1, -1, -1, -1]:
    try:
        print('ok', fragile_tool(x))
    except CircuitOpen as e:
        print('blocked:', e)
    except ValueError as e:
        print('failed:', e)

تسجيل الأخطاء مع السياق

سجّل معلومات كافية لتصحيح الأخطاء لاحقًا: اسم الأداة، الوسائط، نوع الخطأ، تتبّع المكدس، معرّف الطلب، معرّف المستخدم، ومعرّف التتبّع. أرسلها إلى أداة المراقبة لديك.

التدهور الرشيق

عندما تتوقف أداة مهمة عن العمل، أخبر المستخدم بصدق بدلًا من التظاهر بأن الوكيل نجح:

if all_search_tools_failed:
    return 'I was unable to search the web right now. Please try again in a few minutes.'

نمط أخطاء الأدوات

ما الطريقة الأكثر أمانًا للتعامل مع استثناءات الأدوات داخل حلقة الوكيل؟

مراجعة

تفشل الأدوات. التقط الأخطاء، وصنّفها، وحوّلها إلى محتوى منظّم، ودَع الوكيل يتعافى. أضف المهلات الزمنية وإعادة المحاولات وقواطع الدائرة لتحقيق موثوقية مناسبة لبيئة الإنتاج.

الأسئلة الشائعة

هل درس «اكتشاف أخطاء الأدوات والتعافي منها» مجاني؟

نعم — نص درس «اكتشاف أخطاء الأدوات والتعافي منها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «اكتشاف أخطاء الأدوات والتعافي منها»؟

عندما تعيد أداة الخطأ 500، أعد الخطأ إلى النموذج ليجرّب نهجًا مختلفًا بدلًا من تعطّل البرنامج. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «اكتشاف أخطاء الأدوات والتعافي منها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ReAct: نمط التفكير والفعل
  2. تنفيذ ReAct من الصفر
  3. مجموعات الأدوات الشائعة (الويب والآلة الحاسبة وRAG)
  4. اكتشاف أخطاء الأدوات والتعافي منها
← العودة إلى AI Agents