Agent Frameworks

إتقان LangGraph: بناء وكلاء ذكاء اصطناعي متينين وحالين باستخدام المنطق الدوري

مع انتقال نماذج اللغات الكبيرة (LLMs) إلى ما هو أبعد من واجهات الدردشة البسيطة نحو وكلاء مستقلين معقدين، تصبح إدارة الحالة وتدفق التحكم أمراً بالغ الأهمية. غالباً ما تواجه أطر العمل التقليدية للوكلاء صعوبات مع الحلقات اللانهائية أو نقص القابلية للمراقبة أو مسارات التنفيذ الخطية الجامدة. هنا يأتي دور LangGraph، وهي مكتبة مبنية فوق LangChain تتيح للمطورين بناء تطبيقات متعددة الجهات فاعلة وحالية باستخدام نماذج اللغات الكبيرة من خلال الرسوم البيانية الموجهة. يستكشف هذا المقال سبب تحول LangGraph إلى المعيار الذهبي لتطوير الوكلاء على مستوى الإنتاج، وكيف يمكنك الاستفادة منها.

لماذا LangGraph بدلاً من السلاسل التقليدية؟

تُبنى معظم تطبيقات نماذج اللغات الكبيرة على شكل سلاسل: تسلسل خطي من الخطوات حيث يُغذي المخرج A المدخل B. ومع ذلك، نادراً ما تتبع المشكلات الواقعية خطاً مستقيماً. فهي تتطلب حلقات، ومنطقاً انشعابياً، والقدرة على إيقاف التنفيذ للحصول على موافقة بشرية. يعامل LangGraph منطق الوكيل الخاص بك على أنه رسم بياني حيث تمثل العقد العمليات الحسابية (مثل استدعاء نموذج لغوي كبير أو تنفيذ أداة)، وتمثل الحواف تدفق التحكم.

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

المفاهيم الأساسية: الحالة، العقد، والحواف

لبناء وكيل باستخدام LangGraph، يجب عليك تحديد ثلاثة مكونات أساسية:

  1. مخطط الحالة (State Schema): نموذج TypedDict أو Pydantic يحدد البيانات التي تبقى محفوظة عبر الرسم البياني.
  2. العقد (Nodes): دوال تستقبل الحالة الحالية، تقوم بالعمل، وتعيد حالة محدثة.
  3. الحواف (Edges): قواعد تحدد العقدة التي سيتم تنفيذها تالياً بناءً على الحالة الحالية.

مثال عملي: وكيل بحث ذاتي التصحيح

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

from langchain_core.messages import HumanMessage, AIMessage
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated, List
import operator

# 1. تعريف الحالة
class AgentState(TypedDict):
    messages: Annotated[List, operator.add]
    is_answer_complete: bool

# 2. تعريف العقد (دوال المنطق)
def search_node(state: AgentState) -> dict:
    # محاكاة عملية بحث
    return {
        "messages": [AIMessage(content="نتائج البحث: باريس هي عاصمة فرنسا.")],
        "is_answer_complete": True
    }

def verify_node(state: AgentState) -> dict:
    # التحقق مما إذا كانت الرسالة الأخيرة تحتوي على معلومات كافية
    # في السيناريو الحقيقي، ستقوم بتمرير ذلك إلى نموذج لغوي كبير
    messages = state["messages"]
    last_msg = messages[-1].content
    if "France" in last_msg:
        return {"is_answer_complete": True}
    return {"is_answer_complete": False}

# 3. بناء الرسم البياني
graph_builder = StateGraph(AgentState)

# إضافة العقد
graph_builder.add_node("search", search_node)
graph_builder.add_node("verify", verify_node)

# تعيين نقطة الدخول
graph_builder.set_entry_point("search")

# إضافة حواف شرطية للحلقة
def route_after_search(state: AgentState) -> str:
    if state["is_answer_complete"]:
        return "end"
    return "search" # العودة إلى البحث إذا لم تكن الإجابة مكتملة

# حافة من البحث إلى التحقق
graph_builder.add_edge("search", "verify")

# حافة شرطية بناءً على نتيجة التحقق
graph_builder.add_conditional_edges(
    "verify",
    route_after_search,
    {
        "end": END,
        "search": "search"
    }
)

# تجميع الرسم البياني
app = graph_builder.compile()

قدرات الإنسان في الحلقة (Human-in-the-Loop)

إحدى أقوى ميزات LangGraph هي دعمها الأصلي لسير العمل الذي يتضمن الإنسان في الحلقة (HITL). نظراً لأن حالة الرسم البياني دائمة، يمكنك إيقاف التنفيذ عند أي عقدة والانتظار للتدخل البشري. هذا أمر حاسم للعمليات الحساسة مثل المعاملات المالية أو تعديل المحتوى.

يمكنك تحقيق ذلك باستخدام دالة interrupt أو عن طريق التحقق من وجود علم حالة معين يوقف الرسم البياني حتى يقوم الإنسان بتحديث الحالة عبر استدعاء واجهة برمجة التطبيقات (API). هذا يحول وكيلك من نص برمجي أسود الصندوق إلى عملية تفاعلية وقابلة للتدقيق.

الخاتمة

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

Share: