Search⌘ K
AI Features

معالجة الأخطاء وإعادة المحاولات في لغة LangGraph

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

يستطيع مساعدنا الآن استدعاء الأدوات بالتتابع أو بالتوازي، ليُنسق الإجابات معًا ببراعة مضيف ماهر يُدير حفل عشاء مفعم بالحيوية. لكننا افترضنا حتى هذه اللحظة أن كل أداة تعمل دائمًا على أكمل وجه.

في الواقع، نادرًا ما يحدث هذا. تتعطل واجهات برمجة التطبيقات (APIs). وتُطلق الأدوات استثناءات. أحيانًا ينسى الضيف المدعو ملاحظاته أو يسكب الحساء قبل الإجابة على السؤال. يحتاج المضيف إلى التعامل مع هذه المشاكل بسلاسة وعدم السماح بانهيار الأمسية بأكملها. وهنا يأتي دور معالجة الأخطاء وإعادة المحاولة.

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

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

كيفية تطبيق معالجة الأخطاء باستخدام الأدوات

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

import random
def get_weather(city: str) -> str:
"""Return a mock weather string for the given city, sometimes failing."""
if city.lower() == "london" and random.random() < 0.75:
raise Exception("Weather service for London failed!")
return f"The weather in {city} is sunny."
Weather tool sometimes fails, forcing retry logic

نقدم هنا أداة غير مستقرة: بالنسبة للندن فقط، نقوم برمي عملة معدنية غير متماثلة في السطر 5 ، ونُصدر استثناءً بنسبة 75% من الحالات. بينما تبقى باريس موثوقة. هذا التباين مقصود؛ فهو يسمح للمتعلمين برؤية نجاح جزئي عند دمج النتائج في الرسم البياني. يوثق النص التوضيحي المختصر في السطر 4 هذا السلوك، ويجعل الأداة ذاتية الوصف.

بما أن هذا العطل يقع داخل دالة فقط، فلا حاجة لتغيير أي شيء في بنية LangGraph. سنتولى عملية الاستعادة في العقدة التي تستدعي هذه الأداة. العقد هي المكان الذي تحدد فيه السياسة: عدد محاولات إعادة الاتصال، ورسالة الخطأ البديلة، ونوع الخطأ الذي سيتم عرضه. سنبقي باريس بسيطة ونغلف لندن باستخدام try/except. تبقى بنية الرسم البياني كما هي؛ فقط سلوك عقدة واحدة يتغير.

from langchain_core.messages import AIMessage
def weather_paris(state: MyMessagesState):
text = get_weather("Paris")
return {"messages": [AIMessage(content=text)]}
def weather_london(state: MyMessagesState):
try:
# First attempt
text = get_weather("London")
return {"messages": [AIMessage(content=text)]}
except Exception as e:
# Retry once
try:
text = get_weather("London")
return {"messages": [AIMessage(content=text)]}
except Exception:
# Fallback if still failing
return {"messages": [AIMessage(content="London weather is currently unavailable.")]}
Paris node stays reliable, London may stumble

ما الذي تغير ولماذا؟

  • الأسطر 3-5: باريس دائماً ناجحة؛ نبقيها مملة عن قصد.

  • الأسطر 8-11: المحاولة الأولى للوصول إلى ...