التوثيق / LangGraph

LangGraph

LangGraph مكتبة لبناء تطبيقات متعددة الخطوات ووكيلية، من خلال تمثيل تدفق التنفيذ على شكل رسم بياني للحالات (State Graph) بدلًا من سلسلة خطية بسيطة.

State Graph Cycles By LangChain

ما هو LangGraph؟

يُبنى LangGraph على نفس مكوّنات LangChain (النموذج، المحفّز، الأداة)، لكن بدلًا من تركيبها خطيًا بعامل |، فإنه يتيح لك تعريف تدفق التنفيذ على شكل رسم بياني من العقد (Node) والأطراف (Edge) — بما في ذلك الحلقات والفروع الشرطية والعودة إلى خطوات سابقة. هذا بالضبط ما يلزم لتنفيذ نمط ReAct فعليًا.

لماذا رسم بياني بدلًا من سلسلة خطية؟

تفترض السلسلة الخطية (Chain) أن الخطوة A تنتقل دائمًا إلى B ثم إلى C. لكن سلوك العميل الذكي الحقيقي ليس كذلك: فقد تكون النتيجة غير كافية بعد استدعاء أداة، ويحتاج العميل للعودة إلى خطوة "اتخاذ القرار" (حلقة)، أو قد يُتَّبع مسار مختلف تمامًا حسب نوع طلب المستخدم (فرع شرطي). يُمثّل الرسم البياني هذه الأنماط بشكل طبيعي.

المفاهيم الأساسية

  • State — كائن مشترك يُتبادل ويُحدَّث بين جميع العقد (أشبه بالذاكرة العاملة للرسم البياني)
  • Node — وحدة معالجة (دالة بايثون أو سلسلة LangChain) تقرأ State وتُعيد نسخة محدَّثة منه
  • Edge — المسار بين عقدتين؛ يمكن أن يكون ثابتًا أو شرطيًا (يقرر العقدة التالية بناءً على State)

مخطط لرسم بياني نموذجي

START Reason Decide next step Needs tool Tool Call MCP / UCP Return to Reason with new result Final answer ready END

نموذج كود

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 للأنظمة متعددة العملاء أيضًا؟

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