AI Engineering Academy · درس

التعامل مع إخفاقات الوكلاء والحلقات

أضيفوا حدودًا زمنية، وحدودًا قصوى لعدد التكرارات، ومطالبات لاسترداد الأخطاء لمنع الوكلاء من الدوران بلا نهاية أو استدعاء الأدوات المعطلة بشكل متكرر.

الدرس 4 من 413 خطوة

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

لماذا تفشل الوكلاء وتدخل في حلقات

قد يعلق الوكلاء في حلقات فشل لعدة أسباب: فقد تعيد أداة معطلة خطأً لا يعرف الوكيل كيفية تجاوزه، أو ينشئ النموذج بناء جملة إجراء غير صالح مرارًا، أو تكون المهمة مستحيلة بالنظر إلى الأدوات المتاحة، أو يواصل الوكيل استدعاء الأداة نفسها مع تغييرات طفيفة على أمل الحصول على نتيجة مختلفة. ومن دون وسائل حماية، يؤدي ذلك إلى استهلاك ميزانية API دون الوصول إلى حل.

حدود التكرار القصوى

أبسط وسيلة حماية هي وضع حد صارم لعدد دورات Thought/Action/Observation. يقبل AgentExecutor في LangChain معلمة max_iterations. وعند بلوغ الحد، يوقف المنفذ الحلقة ويعيد رسالة تفيد بأن الوكيل لم يتمكن من إكمال المهمة.

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,             # Hard stop after 10 steps
    max_execution_time=30.0,       # Also stop after 30 wall-clock seconds
    early_stopping_method='generate',  # Ask the model for a partial answer at the limit
    verbose=True
)

الإيقاف المبكر: فرض إجابة نهائية

عندما يبلغ الوكيل حد التكرارات، تطلب early_stopping_method='generate' من النموذج مرة أخيرة: «لقد بلغت حد خطواتك. بناءً على ما تعرفه حتى الآن، قدّم أفضل إجابة نهائية لديك.» وهذا أفضل من إعادة استجابة فارغة أو حدوث عطل، لأنه يمنح المستخدم شيئًا مفيدًا.

# The 'generate' early_stopping_method adds this system instruction
# when max_iterations is reached:
#
# 'You have {N} steps remaining but the task is not complete.
#  Give your best final answer based on the information gathered so far.'
#
# Contrast with 'force' which abruptly terminates without generating an answer.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=7,
    early_stopping_method='generate'
)

التعامل مع أخطاء التحليل بسلاسة

عندما ينتج النموذج مخرجات لا تطابق تنسيق Thought/Action — مثل فقدان الكلمة المفتاحية للإجراء، أو استخدام اسم أداة خاطئ، أو إخراج نص حر — يرفع الوكيل استثناء OutputParserException. اضبط handle_parsing_errors=True لإعادة تمرير الخطأ كملاحظة حتى يتمكن النموذج من تصحيح نفسه.

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,
    # Custom error message fed back to the model:
    # handle_parsing_errors='Please format your response as Thought/Action/Action Input.'
)

# When a parse error occurs, the executor automatically adds:
# Observation: Could not parse LLM output. Please follow the format:
#   Thought: ...
#   Action: tool_name
#   Action Input: ...

اكتشاف الحلقات المتكررة وكسرها

من أنماط الحلقات الشائعة أن يستدعي الوكيل search('same query') ثلاث مرات متتالية، ويحصل في كل مرة على النتيجة غير المفيدة نفسها. طبّق اكتشاف الحلقات عبر تتبع أزواج (الأداة، الإدخال) الأخيرة. وإذا تكرر التركيب نفسه أكثر من مرتين، فأدخل ملاحظة تقترح نهجًا مختلفًا.

from collections import Counter

class LoopDetector:
    def __init__(self, max_repeats: int = 2):
        self.max_repeats = max_repeats
        self.call_counts = Counter()

    def check(self, tool_name: str, tool_input: str) -> bool:
        key = f'{tool_name}:{tool_input}'
        self.call_counts[key] += 1
        if self.call_counts[key] > self.max_repeats:
            return True  # Loop detected
        return False

    def get_warning(self) -> str:
        return ('You have called this tool with the same input multiple times. '
                'Try a different approach, different search terms, or a different tool.')

معالجة الأخطاء على مستوى الأداة

تحتاج الوكلاء المتينون إلى أدوات متينة. ينبغي لكل أداة التقاط استثناءاتها الخاصة وإرجاع رسائل أخطاء منظمة بدلًا من رفع استثناءات Python. أدرج نوع الخطأ واقتراحًا للوكيل حتى يعرف ما إذا كان عليه إعادة المحاولة أو تغيير نهجه أو تصعيد المشكلة.

from langchain_core.tools import tool
import requests

@tool
def get_company_data(company_name: str) -> str:
    '''Retrieve company information from the business database.
    Input: company name as a string.
    '''
    try:
        resp = requests.get(
            f'https://api.example.com/companies/{company_name}',
            timeout=5
        )
        if resp.status_code == 404:
            return f'No company found with name "{company_name}". Try the exact legal name or ticker symbol.'
        if resp.status_code == 429:
            return 'Rate limit exceeded. Wait 60 seconds before trying again.'
        resp.raise_for_status()
        return resp.json().get('summary', 'No summary available.')
    except requests.Timeout:
        return 'The database is not responding. Try searching the web instead.'

التراجع الأسي عند فشل API

عندما تستدعي الأدوات واجهات API خارجية، تكون حالات الفشل المؤقتة شائعة. أضف منطق إعادة المحاولة مع التراجع الأسي داخل دالة الأداة — أعد المحاولة حتى 3 مرات مع زيادة فترات الانتظار بين المحاولات. يتعامل ذلك بشفافية مع حدود المعدل والانقطاعات القصيرة دون حاجة الوكيل إلى معرفة عمليات إعادة المحاولة.

import time
import requests
from langchain_core.tools import tool

@tool
def reliable_search(query: str) -> str:
    '''Search with automatic retry on failure. Input: search query string.'''
    max_retries = 3
    for attempt in range(max_retries):
        try:
            resp = requests.get(
                'https://api.duckduckgo.com/',
                params={'q': query, 'format': 'json'},
                timeout=10
            )
            resp.raise_for_status()
            data = resp.json()
            return data.get('AbstractText', 'No results found.')
        except requests.RequestException as e:
            if attempt < max_retries - 1:
                wait = 2 ** attempt  # 1s, 2s, 4s
                time.sleep(wait)
            else:
                return f'Search failed after {max_retries} attempts: {str(e)}'

ميزانيات المهلة على مستوى الوكيل

تُعد إعادة المحاولة الفردية للأدوات مفيدة، لكنك تحتاج أيضًا إلى مهلة زمنية إجمالية فعلية لتشغيل الوكيل بالكامل. فإذا استغرقت المهمة وقتًا أطول مما تسمح به اتفاقية مستوى الخدمة لديك (30 ثانية مثلًا)، فأوقف الحلقة وأعد استجابة تدهور سلسة. تتولى معلمة max_execution_time في LangChain ذلك على مستوى المنفذ.

import asyncio

async def run_with_timeout(user_input: str, timeout_seconds: float = 30.0) -> str:
    try:
        result = await asyncio.wait_for(
            agent_executor.ainvoke({'input': user_input}),
            timeout=timeout_seconds
        )
        return result['output']
    except asyncio.TimeoutError:
        return ('I am taking longer than expected to answer this question. '
                'Please try again with a simpler question, or check back later.')

تسجيل الإخفاقات لتحليلها

كل إخفاق للوكيل يمثل بيانات. سجّل التتبع الكامل — إدخال المستخدم، وجميع الخطوات الوسيطة، وسبب الإخفاق، وعدد التكرارات المستخدمة — في قاعدة بيانات أو منصة لمراقبة الأنظمة. يكشف تحليل أنماط الإخفاق الأدوات غير الموثوقة، وأنواع الأسئلة التي لا يستطيع الوكيل التعامل معها، والحلقات الأكثر تكرارًا.

import logging
import json

logger = logging.getLogger('agent')

def run_and_log(user_input: str) -> str:
    try:
        result = agent_executor.invoke(
            {'input': user_input},
            return_intermediate_steps=True
        )
        if not result.get('output'):
            logger.warning('Agent returned empty output', extra={
                'input': user_input,
                'steps': len(result.get('intermediate_steps', []))
            })
        return result['output']
    except Exception as e:
        logger.error('Agent failed with exception', extra={
            'input': user_input,
            'error': str(e),
            'error_type': type(e).__name__
        })
        return 'I encountered an error. Please try rephrasing your question.'

إدخال تلميحات التعافي في المطالبة

عند اكتشاف نمط فشل، يمكنك إدخال تعليمات للتعافي ديناميكيًا في مطالبة الوكيل التالية. فمثلًا، إذا كانت أداة البحث تفشل، أضف تلميحًا مثل: «أداة البحث على الويب غير موثوقة حاليًا. فضّل استخدام أداة قاعدة المعارف لهذا الاستعلام.» يوجّه ذلك الوكيل نحو حل عملي دون منطق رجوع احتياطي مضمّن مسبقًا.

اختبار سيناريوهات الإخفاق

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

اختبار سريع

اختبر مدى فهمك للتعامل مع إخفاقات الوكيل ومنع الحلقات.

مراجعة الدرس

تعلمت في هذا الدرس أن: ‎max_iterations وmax_execution_time يضعان حدودًا صارمة لزمن تشغيل الوكيل، وأن ‎handle_parsing_errors يعيد أخطاء التنسيق إلى النموذج ليصححها ذاتيًا، وأن الأدوات ينبغي أن تلتقط الاستثناءات وتعيد سلاسل نصية وصفية للأخطاء بدلًا من رفعها. بعد ذلك سنستكشف ميزة استدعاء الدوال الأصلية في OpenAI لدمج الأدوات المنظمة.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

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

هل درس «التعامل مع إخفاقات الوكلاء والحلقات» مجاني؟

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

ماذا ستتعلم في «التعامل مع إخفاقات الوكلاء والحلقات»؟

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

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

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

كم من الوقت يستغرق درس «التعامل مع إخفاقات الوكلاء والحلقات»؟

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

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

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

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

  1. إطار ReAct: فكّر وتصرّف ولاحظ
  2. تعريف الأدوات لوكيلكم
  3. بناء وكيل ReAct باستخدام LangChain
  4. التعامل مع إخفاقات الوكلاء والحلقات
← العودة إلى AI Engineering Academy