با تکامل مدلهای زبانی بزرگ (LLMs) از تکمیلکنندگان ساده متن به عاملهای خودمختار، الگوهای معماری برای ساخت آنها نیز باید بالغ شوند. در حالی که چارچوبهایی مانند LangChain در سادهسازی یکپارچهسازی LLMها نقش کلیدی داشتهاند، آنها عمدتاً برای زنجیرههای خطی طراحی شده بودند. با این حال، کاربردهای واقعی سازمانی به ندرت از یک خط مستقیم پیروی میکنند. آنها به حلقهها، منطق شاخهای، اجرای شرطی و از همه مهمتر، مدیریت حالت پایدار نیاز دارند. اینجاست که
LangGraph وارد میدان میشود. LangGraph که بر روی LangChain ساخته شده است، یک کتابخانه برای ساخت برنامههای چندعاملی دارای حالت با LLMها است که به طور خاص برای حل محدودیتهای ساختارهای گراف خطی طراحی شده است.
چرا گرافها به جای زنجیرهها؟
تغییر بنیادین در LangGraph، حرکت از یک گراف جهتدار بدون دور (DAG) به یک گراف عمومی است که از چرخهها پشتیبانی میکند. در یک زنجیره سنتی، دادهها از A به B و سپس به C جریان مییابند. اگر خطایی رخ دهد یا به یک نقطه تصمیمگیری برسید، زنجیره معمولاً شکسته میشود یا برای مدیریت تلاشهای مجدد به منطق پیچیدهای در قالب پوشش نیاز دارد. در مقابل، یک گراف به گرهها اجازه میدهد تا به گرههای قبلی متصل شوند و رفتارهای بازگشتی را امکانپذیر سازد.
این ساختار برای عاملهایی که نیاز به انجام کارهای زیر دارند ایدهآل است:
- برنامهریزی و اجرا: تولید یک برنامه، اجرای یک گام، مشاهده نتیجه و برنامهریزی مجدد در صورت شکست گام.
- مدیریت خطاها به صورت شایسته: هدایت اجرا به یک گره مدیریت خطا بدون متوقف شدن کل جریان کاری.
- مدیریت حالت پیچیده: حفظ یک شیء حالت مشترک که با تعامل عامل با ابزارها و حافظه تکامل مییابد.
مفاهیم کلیدی: گرهها، یالها و حالت
برای بهرهبرداری از LangGraph، باید به صورت ماشینهای حالت فکر کنید. سه انتزاع اصلی عبارتند از:
- حالت (State): یک TypedDict در پایتون که طرح دادههای جریانیافته در گراف را تعریف میکند. هر گره از این حالت میخواند و به آن مینویسد.
- گرهها (Nodes): توابع یا کلاسهای فردی که محاسبات را انجام میدهند، LLMها را فراخوانی میکنند یا ابزارها را اجرا میکنند. آنها توابع خالصی هستند که حالت را تبدیل میکنند.
- یالها (Edges): اتصالات بین گرهها. اینها میتوانند ایستا باشند (همیشه به گره B بروند) یا شرطی (بر اساس حالت، بین گره B یا گره C تصمیمگیری کنند).
با تعریف این اجزا، شما یک جریان کاری قابل مشاهده و قابل اشکالزدایی ایجاد میکنید. LangGraph یک ابزار تجسم ارائه میدهد که ساختار گراف شما را نمایش میدهد و درک رفتارهای پیچیده عامل را آسانتر میسازد.
ساخت یک حلقه ساده: الگوی ReAct
یکی از رایجترین موارد استفاده از LangGraph، پیادهسازی الگوی ReAct (استدلال و عمل) است، جایی که یک عامل بین فکر کردن (فراخوانی یک LLM) و عمل کردن (استفاده از ابزارها) سوییچ میکند. در اینجا یک مثال عملی از نحوه تعریف یک حالت و ساختار گراف ساده در پایتون آورده شده است.
from langchain_core.messages import HumanMessage
from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated, List, Operator
import operator
# 1. تعریف طرح حالت
class AgentState(TypedDict):
messages: Annotated[List, operator.add]
steps: int
# 2. تعریف گرهها
def chatbot(state: AgentState):
# شبیهسازی منطق LLM
last_message = state["messages"][-1].content
if "hello" in last_message.lower():
return {"messages": [HumanMessage(content="Hi there! How can I help?")] }
return {"messages": [HumanMessage(content="I'm not sure how to help with that.")] }
def check_step(state: AgentState):
# منطق شرطی برای توقف اگر تعداد مراحل از حد مجاز فراتر رود
if state["steps"] < 5:
return "continue"
return "end"
# 3. ساخت گراف
workflow = StateGraph(AgentState)
# افزودن گرهها
workflow.add_node("chatbot", chatbot)
workflow.add_node("check", check_step)
# افزودن یالها
workflow.add_edge(START, "chatbot")
workflow.add_conditional_edges(
"chatbot",
check_step,
{
"continue": "chatbot", # بازگشت به حلقه اگر ادامه داده شود
"end": END # توقف اگر پایان باشد
}
)
# کامپایل کردن برنامه
app = workflow.compile()
# اجرای گراف
initial_state = {"messages": [HumanMessage(content="Hello")], "steps": 0}
result = app.invoke(initial_state)
کاربردهای عملی در سازمانها
LangGraph در سناریوهایی که نیاز به تعاملات با حضور انسان در حلقه دارند، درخشش میکند. برای مثال، در یک ربات پشتیبانی مشتری، ممکن است بخواهید عامل یک پاسخ را پیشنویس کند، گراف را متوقف کند، منتظر تأیید یک ناظر انسانی از طریق یک رابط کاربری جداگانه بماند و سپس پیام را تنها پس از تأیید ارسال کند. API
checkpoint در LangGraph به شما امکان میدهد حالت گراف را در هر گره ذخیره کنید که قابلیتهای توقف و ادامه را امکانپذیر میسازد و برای انطباق سازمانی و سوابق حسابرسی حیاتی است.
علاوه بر این، LangGraph از سیستمهای چندعاملی پشتیبانی میکند. شما میتوانید زیرگرافهایی برای عاملهای تخصصی (مثلاً یک «عامل تحقیق» و یک «عامل کدنویسی») تعریف کنید و آنها را در یک گراف والد هماهنگ کنید. این ماژولاریت اجازه میدهد تا معماریهایی با قابلیت مقیاسپذیری بالا و نگهداری آسان ایجاد شود.
نتیجهگیری
LangGraph نمایانگر یک گام بزرگ رو به جلو در تکامل توسعه برنامههای LLM است. با ارائه یک چارچوب قوی برای جریانهای کاری چرخهای، مدیریت حالت و تجسم، به توسعهدهندگان قدرت میبخشد تا عاملهایی بسازند که نه تنها هوشمند، بلکه از نظر جریان کنترل قابل اعتماد و قطعی باشند. برای توسعهدهندگانی که به دنبال فراتر رفتن از چتباتهای ساده و ساخت سیستمهای خودمختار پیچیده هستند، تسلط بر LangGraph دیگر اختیاری نیست—بلکه ضروری است.