AI Engineering Academy · درس

بناء مسارات متعددة الوكلاء باستخدام LangGraph

استخدموا LangGraph لتعريف عقد الوكلاء والحواف الشرطية والحالة المشتركة في رسم بياني موجه، مما يتيح سير عمل معقدًا متعدد الوكلاء يتضمن الحلقات والتفرعات ونقاط التحقق بمشاركة الإنسان.

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

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

ما هو LangGraph؟

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

# pip install langgraph
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

# Define your shared state schema
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]  # append-only list
    research: str
    draft: str
    status: str

تعريف الحالة في LangGraph

يعمل كل مسار عمل في LangGraph على كائن حالة مشترك يمكن لجميع العُقد قراءته والكتابة فيه. والحالة عبارة عن قاموس مُنَمْنَم (TypedDict) ينقل البيانات عبر الرسم البياني. وعند تشغيل عقدة، تتلقى الحالة الحالية، وتنفيذ عملها، ثم تعيد قاموسًا من التحديثات لدمجه في الحالة. ويمكّن نموذج الحالة المشتركة هذا الوكلاء من التواصل دون ترابط مباشر.

from typing import TypedDict

class ResearchState(TypedDict):
    query: str           # input from user
    research_notes: str  # filled by researcher node
    written_draft: str   # filled by writer node
    review_feedback: str # filled by reviewer node
    final_output: str    # filled by synthesizer node
    iteration_count: int # tracks how many revision loops occurred

# Each node returns a PARTIAL update - only the keys it modifies
def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {'research_notes': notes}  # only update this key

إنشاء عُقد الوكلاء

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

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(model='gpt-4o')

def researcher_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a research specialist. Find accurate information.'),
        HumanMessage(content=f'Research this topic: {state["query"]}')
    ]
    response = llm.invoke(messages)
    return {'research_notes': response.content}

def writer_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a technical writer. Write clear, engaging prose.'),
        HumanMessage(content=f'Write a draft using these notes:\n{state["research_notes"]}')
    ]
    response = llm.invoke(messages)
    return {'written_draft': response.content}

بناء الرسم البياني باستخدام StateGraph

بعد تعريف دوال العُقد، تصلون بينها باستخدام StateGraph. وتضيفون العُقد باستخدام graph.add_node()، وتضيفون الحواف بينها باستخدام graph.add_edge()، وتحددون نقطة الدخول باستخدام graph.set_entry_point()، ثم تترجمون الرسم البياني إلى كائن قابل للتنفيذ باستخدام graph.compile(). والرسم البياني المترجم هو كائن قابل للتشغيل يقبل حالة أولية ويعيد الحالة النهائية.

from langgraph.graph import StateGraph, END

# Build the graph
workflow = StateGraph(ResearchState)

# Add nodes
workflow.add_node('researcher', researcher_node)
workflow.add_node('writer', writer_node)
workflow.add_node('reviewer', reviewer_node)

# Add edges (sequential pipeline)
workflow.set_entry_point('researcher')
workflow.add_edge('researcher', 'writer')
workflow.add_edge('writer', 'reviewer')
workflow.add_edge('reviewer', END)

# Compile into an executable
app = workflow.compile()

# Run it
result = app.invoke({'query': 'What is RAG?', 'iteration_count': 0})
print(result['written_draft'])

الحواف الشرطية للتوجيه الديناميكي

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

def should_revise(state: ResearchState) -> str:
    '''Router function: returns the name of the next node.'''
    if state['iteration_count'] >= 3:
        return 'finalize'  # Too many revisions - accept as is
    if 'insufficient' in state.get('review_feedback', '').lower():
        return 'researcher'  # Need more research
    if 'rewrite' in state.get('review_feedback', '').lower():
        return 'writer'  # Needs rewriting
    return 'finalize'  # Looks good

# Add conditional edge from reviewer
workflow.add_conditional_edges(
    'reviewer',                    # from node
    should_revise,                 # routing function
    {
        'researcher': 'researcher', # route name -> node name
        'writer': 'writer',
        'finalize': 'finalizer'
    }
)

الحلقات والتكرار في LangGraph

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

def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {
        'research_notes': notes,
        'iteration_count': state['iteration_count'] + 1  # always increment
    }

def should_continue_research(state: ResearchState) -> str:
    # Terminate loop after 3 iterations regardless of quality
    if state['iteration_count'] >= 3:
        return END
    # Continue if research is incomplete
    if len(state.get('research_notes', '')) < 500:
        return 'researcher'  # loop back
    return 'writer'  # proceed to next stage

التنفيذ المتوازي للعُقد

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

# Fan-out: one node triggers multiple parallel ones
workflow.add_edge('planner', 'researcher_a')
workflow.add_edge('planner', 'researcher_b')
workflow.add_edge('planner', 'researcher_c')

# Fan-in: aggregator waits for all three
workflow.add_edge('researcher_a', 'aggregator')
workflow.add_edge('researcher_b', 'aggregator')
workflow.add_edge('researcher_c', 'aggregator')
workflow.add_edge('aggregator', 'writer')

# Aggregator merges parallel results
def aggregator_node(state: ResearchState) -> dict:
    combined = state.get('notes_a', '') + '\n' + state.get('notes_b', '') + '\n' + state.get('notes_c', '')
    return {'research_notes': combined}

نقاط التحقق والإنسان ضمن الحلقة

يدعم LangGraph إنشاء نقاط التحقق من خلال التكامل مع واجهة خلفية لحفظ نقاط التحقق (SQLite أو Redis أو PostgreSQL). وعند تفعيل نقاط التحقق، تُحفظ حالة الرسم البياني بعد تنفيذ كل عقدة. ويتيح ذلك إيقاف مسارات العمل طويلة التشغيل وفحصها واستئنافها. كما يتيح أنماط الإنسان ضمن الحلقة، حيث يتوقف الرسم البياني عند عقدة محددة وينتظر من الإنسان الموافقة أو تقديم مدخلات قبل المتابعة.

from langgraph.checkpoint.sqlite import SqliteSaver

# Use SQLite for persistent checkpoints
checkpointer = SqliteSaver.from_conn_string(':memory:')
app = workflow.compile(checkpointer=checkpointer, interrupt_before=['human_review'])

# First run - pauses at human_review node
thread = {'configurable': {'thread_id': 'my-workflow-1'}}
result = app.invoke({'query': 'Analyze competitors'}, config=thread)
# result.next == 'human_review' -- waiting for human input

# Human provides feedback and resumes
app.update_state(thread, {'review_feedback': 'Good research, proceed with writing'})
final = app.invoke(None, config=thread)  # resume from checkpoint

بث مخرجات LangGraph

يدعم LangGraph وضع البث الذي يصدر تحديثات وسيطة للحالة عند اكتمال كل عقدة، بدلًا من الانتظار حتى انتهاء مسار العمل بالكامل. ويكون ذلك مفيدًا لخطوط المعالجة الطويلة التي تريدون فيها عرض التقدم الجزئي للمستخدم. استخدموا app.stream() للحصول على مكرّر من لقطات الحالة من كل خطوة.

# Stream intermediate results as each node completes
for event in app.stream({'query': 'What is RAG?'}):
    for node_name, node_output in event.items():
        print(f'Node completed: {node_name}')
        if 'research_notes' in node_output:
            print('Research done:', node_output['research_notes'][:100])
        if 'written_draft' in node_output:
            print('Draft done:', node_output['written_draft'][:100])

تصوير الرسم البياني

يمكن لـ LangGraph رسم الرسم البياني على هيئة مخطط Mermaid، وهو أمر بالغ الأهمية لفهم مسارات العمل المعقدة التي تحتوي على عُقد وحواف شرطية كثيرة. استدعوا app.get_graph().draw_mermaid_png() للحصول على صورة PNG، أو app.get_graph().draw_mermaid() للحصول على صيغة Mermaid التي يمكنكم لصقها في أي عارض Mermaid.

# Visualize the workflow graph
graph_image = app.get_graph().draw_mermaid_png()
with open('workflow.png', 'wb') as f:
    f.write(graph_image)

# Or print Mermaid syntax
print(app.get_graph().draw_mermaid())
# Outputs:
# graph TD
#    __start__ --> researcher
#    researcher --> writer
#    writer --> reviewer
#    reviewer -->|Good| finalize
#    reviewer -->|Needs work| researcher

مثال على وكيل LangGraph متكامل من البداية إلى النهاية

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

تحقق سريع

اختبر مدى فهمك لخطوط المعالجة متعددة الوكلاء في LangGraph من هذا الدرس.

مراجعة الدرس

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

البدء مجانًا

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

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

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

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

هل درس «بناء مسارات متعددة الوكلاء باستخدام LangGraph» مجاني؟

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

ماذا ستتعلم في «بناء مسارات متعددة الوكلاء باستخدام LangGraph»؟

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

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

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

كم من الوقت يستغرق درس «بناء مسارات متعددة الوكلاء باستخدام LangGraph»؟

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

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

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

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

  1. لماذا تصل الوكلاء المنفردة إلى طريق مسدود
  2. نمط المنسّق والوكيل الفرعي
  3. بناء مسارات متعددة الوكلاء باستخدام LangGraph
  4. الذاكرة المشتركة والتواصل بين الوكلاء
← العودة إلى AI Engineering Academy