LangGraph
LangGraph مكتبة لبناء تطبيقات متعددة الخطوات ووكيلية، من خلال تمثيل تدفق التنفيذ على شكل رسم بياني للحالات (State Graph) بدلًا من سلسلة خطية بسيطة.
ما هو LangGraph؟
يُبنى LangGraph على نفس مكوّنات LangChain (النموذج، المحفّز، الأداة)،
لكن بدلًا من تركيبها خطيًا بعامل |، فإنه يتيح لك تعريف تدفق التنفيذ على شكل رسم بياني
من العقد (Node) والأطراف (Edge) — بما في ذلك الحلقات والفروع الشرطية والعودة إلى خطوات سابقة. هذا بالضبط
ما يلزم لتنفيذ نمط ReAct فعليًا.
لماذا رسم بياني بدلًا من سلسلة خطية؟
تفترض السلسلة الخطية (Chain) أن الخطوة A تنتقل دائمًا إلى B ثم إلى C. لكن سلوك العميل الذكي الحقيقي ليس كذلك: فقد تكون النتيجة غير كافية بعد استدعاء أداة، ويحتاج العميل للعودة إلى خطوة "اتخاذ القرار" (حلقة)، أو قد يُتَّبع مسار مختلف تمامًا حسب نوع طلب المستخدم (فرع شرطي). يُمثّل الرسم البياني هذه الأنماط بشكل طبيعي.
المفاهيم الأساسية
- State — كائن مشترك يُتبادل ويُحدَّث بين جميع العقد (أشبه بالذاكرة العاملة للرسم البياني)
- Node — وحدة معالجة (دالة بايثون أو سلسلة LangChain) تقرأ State وتُعيد نسخة محدَّثة منه
- Edge — المسار بين عقدتين؛ يمكن أن يكون ثابتًا أو شرطيًا (يقرر العقدة التالية بناءً على State)
مخطط لرسم بياني نموذجي
نموذج كود
from langgraph.graph import StateGraph, END
def reason(state):
# يقرر النموذج: إجابة نهائية أم استدعاء أداة
return {"next": "tool" if state["needs_tool"] else END}
def call_tool(state):
result = tools[state["tool_name"]](**state["tool_args"])
return {"last_result": result, "needs_tool": False}
graph = StateGraph(dict)
graph.add_node("reason", reason)
graph.add_node("tool", call_tool)
graph.add_conditional_edges("reason", lambda s: s["next"])
graph.add_edge("tool", "reason")
graph.set_entry_point("reason")
app = graph.compile()
app.invoke({"needs_tool": True, "tool_name": "check_inventory", "tool_args": {"sku": "123"}})
الاستمرارية ونقاط التفتيش والتدخل البشري
من أبرز مميزات LangGraph حفظ State تلقائيًا بعد تنفيذ كل عقدة (نقطة تفتيش، Checkpoint). هذا يعني أن تنفيذ رسم بياني يمكن إيقافه في منتصف الطريق، ثم استئنافه لاحقًا — حتى بعد إعادة تشغيل التطبيق بالكامل — من نفس النقطة تمامًا، لأن كامل State مُخزَّن في قاعدة بيانات (مثل Postgres أو Redis)، لا في ذاكرة التطبيق فقط.
لهذه الآلية استخدامان مهمّان:
- التدخل البشري (Human-in-the-loop) — يمكن للرسم البياني أن يتوقف عمدًا قبل إجراء حساس (مثل الدفع النهائي)، وينتظر موافقة بشرية، ثم يستأنف من نفس النقطة تمامًا بعد الموافقة — دون فقدان أي من الخطوات السابقة.
- التعافي من الأخطاء — إذا تعطّل الخادم في منتصف تنفيذ طويل، فبعد إعادة تشغيله، يستأنف التنفيذ من آخر نقطة تفتيش ناجحة، لا من الصفر.
LangGraph مقابل LangChain البسيط
| LangChain (LCEL) | LangGraph | |
|---|---|---|
| بنية التدفق | خطية (Pipe) | رسم بياني (Node/Edge) |
| الحلقات والعودة | دعم محدود | دعم كامل، وهو هدف التصميم الأساسي |
| الأنسب لـ | خطوط الأنابيب البسيطة وRAG المعياري | العملاء متعددو الخطوات ومتعددو العملاء |
الأسئلة الشائعة
هل يجب أن أتعلم LangChain أولًا لفهم LangGraph؟
معرفة المفاهيم الأساسية (Model، Prompt) تساعد، لكن يمكن تعلّم LangGraph بشكل مستقل أيضًا.
هل يُستخدم LangGraph للأنظمة متعددة العملاء أيضًا؟
نعم، هذا بالضبط أحد أكثر استخداماته شيوعًا — كل عميل هو رسم بياني فرعي أو عقدة، وتحدّد عقدة منسّق المسار بينها. التفاصيل في تنسيق العملاء.