LangGraph
LangGraph کتابخانهای برای ساخت اپلیکیشنهای چندمرحلهای و ایجنتی است، با مدلسازی جریان اجرا بهشکل یک گراف حالت بهجای یک زنجیرهی خطی ساده.
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"}})
Persistence، Checkpointing و Human-in-the-loop
یکی از قابلیتهای متمایزکنندهی LangGraph، ذخیرهی خودکار State بعد از اجرای هر گره (Checkpoint) است. این یعنی اجرای یک گراف را میتوان در وسط راه متوقف کرد و بعداً — حتی بعد از ریاستارت کامل برنامه — دقیقاً از همان نقطه ادامه داد، چون کل State در یک پایگاهداده (مثل Postgres یا Redis) ذخیره شده، نه فقط در حافظهی برنامه.
این مکانیزم دو کاربرد مهم دارد:
- Human-in-the-loop — گراف میتواند قبل از یک اقدام حساس (مثل پرداخت نهایی) عمداً متوقف شود، منتظر تایید انسانی بماند، و بعد از تایید دقیقاً از همانجا ادامه یابد — بدون از دست رفتن هیچکدام از مراحل قبلی.
- بازیابی از خطا — اگر سرور در وسط یک اجرای طولانی از کار بیفتد، بعد از بالا آمدن دوباره، اجرا از آخرین Checkpoint موفق ادامه پیدا میکند، نه از صفر.
LangGraph در برابر LangChain ساده
| LangChain (LCEL) | LangGraph | |
|---|---|---|
| ساختار جریان | خطی (Pipe) | گراف (Node/Edge) |
| حلقه و بازگشت | پشتیبانی محدود | پشتیبانی کامل، هدف اصلی طراحی |
| مناسب برای | پایپلاینهای ساده و RAG استاندارد | ایجنتهای چندمرحلهای و چند-ایجنتی |
سوالات متداول
آیا باید اول LangChain یاد بگیرم تا LangGraph را بفهمم؟
دانستن مفاهیم پایه (Model، Prompt) کمک میکند، اما LangGraph را میتوان مستقل هم یاد گرفت.
آیا LangGraph برای سیستمهای چند-ایجنتی هم استفاده میشود؟
بله، یکی از رایجترین کاربردهای آن دقیقاً همین است — هر ایجنت یک زیرگراف یا گره، و یک گرهی ارکستراتور مسیر بین آنها را مشخص میکند. جزئیات در ارکستراسیون ایجنتها.