توسعه سریع مدلهای زبانی بزرگ (LLM) تمرکز را از چتباتهای ساده به سمت عاملهای خودمختار پیچیدهای که توانایی استدلال، استفاده از ابزارها و برنامهریزی چندمرحلهای دارند، تغییر داده است. با این حال، ساخت سیستمهای عاملی مستحکم اغلب مانند مبارزه با ماهیت احتمالی مدلها به نظر میرسد. اینجاست که LangGraph وارد عمل میشود. LangGraph که توسط LangChain توسعه یافته است، صرفاً یک لایه نازک دیگر روی LLMها نیست؛ بلکه یک چارچوب ارکستراسیون سطح پایین است که برای ساخت، مدیریت و استقرار برنامههای چندعاملی با حالت طراحی شده است.
برخلاف زنجیرههای خطی سنتی، LangGraph به توسعهدهندگان اجازه میدهد تا برنامهها را به عنوان گرافها مدلسازی کنند. این تغییر پارادایم کنترل دقیقتری بر جریان اجرا ارائه میدهد و امکان ایجاد حلقهها، منطق شرطی و مدیریت حالت پایدار را فراهم میکند. در این مقاله، بررسی میکنیم که چگونه از LangGraph برای ساخت سیستمهای هوش مصنوعی مقاوم استفاده کنیم.
چرا باید فراتر از زنجیرههای خطی برویم؟
چارچوبهای سنتی برنامههای مبتنی بر LLM اغلب به "زنجیرهها" تکیه میکنند — یک توالی از مراحل که در آن هر مرحله خروجی خود را به مرحله بعدی منتقل میکند. اگرچه این روش شهودی است، اما زمانی که عاملها نیاز به تکرار، اصلاح خطاها یا بازگشت به مراحل قبلی دارند، شکست میخورند. برای مثال، یک عامل تحقیقاتی ممکن است نیاز داشته باشد: جستجو در وب → خواندن یک مقاله → درک اینکه اطلاعات کافی نیست → جستجو مجدد → ترکیب یک پاسخ نهایی.
LangGraph این مشکل را با اجازه دادن به چرخههای صریح حل میکند. برنامه به عنوان یک StateGraph تعریف میشود، که در آن گرهها (nodes) نماینده توابع (منطق یا فراخوانیهای LLM) هستند و یالها (edges) جریان کنترل را تعریف میکنند. این تعریف صریح، دیباگ را آسانتر میکند و امکان مداخله انسان در حلقه (human-in-the-loop) در نقاط خاص را فراهم میآورد.
مفاهیم کلیدی: حالت و گرهها
در قلب LangGraph، مفهوم حالت مشترک (Shared State) قرار دارد. برخلاف عبور متغیرها بین فراخوانیهای تابع، LangGraph یک شیء حالت مشترک را حفظ میکند که همه گرهها میتوانند از آن بخوانند و آن را بهروزرسانی کنند. این حالت معمولاً به عنوان یک TypedDict یا یک مدل Pydantic تعریف میشود، که اطمینان از ایمنی نوع و شفافیت را تضمین میکند.
یک اسکیمای حالت ساده برای یک ربات پشتیبانی را در نظر بگیرید:
from typing import TypedDict
class AgentState(TypedDict):
messages: list
intent: str
resolution: str
هر گره یک تابع است که حالت فعلی را دریافت کرده و یک بهروزرسانی جزئی را برمیگرداند. این جداسازی نگرانیها به شما امکان میدهد تا اجزای فردی (مثلاً تغییر مدل LLM یا پایگاه داده برداری) را بدون بازنویسی کل منطق ارکستراسیون تعویض کنید.
ساخت اولین گراف عامل شما
بیایید یک مثال عملی را بررسی کنیم: یک عامل ساده تریاژ (Triage) که بر اساس نیت، درخواستهای کاربر را به "دستیار مفید" یا "پردازنده بازپرداخت" مسیریابی میکند.
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4")
def triage_agent(state: AgentState):
prompt = f"Classify the intent of this message: {state['messages'][-1].content}\nReturn only 'help' or 'refund'."
response = llm.invoke(prompt)
intent = response.content.strip().lower()
return {"intent": intent}
def help_agent(state: AgentState):
prompt = "You are a helpful assistant. Answer: " + state['messages'][-1].content
response = llm.invoke(prompt)
return {"resolution": response.content}
def refund_agent(state: AgentState):
return {"resolution": "Your refund request has been logged."}
# Define the graph
graph = StateGraph(AgentState)
# Add nodes
graph.add_node("triage", triage_agent)
graph.add_node("help", help_agent)
graph.add_node("refund", refund_agent)
# Set entry point
graph.set_entry_point("triage")
# Define conditional edges
def route_by_intent(state: AgentState):
if state["intent"] == "refund":
return "refund"
return "help"
graph.add_conditional_edges(
"triage",
route_by_intent,
["help", "refund"]
)
# Finish the graph
graph.add_edge("help", END)
graph.add_edge("refund", END)
# Compile
app = graph.compile()
این کد قدرت LangGraph را نشان میدهد: triage_agent به عنوان یک مسیریاب عمل میکند و مسیر بعدی به بهروزرسانی پویای حالت بستگی دارد. میتوانید این ساختار را با استفاده از LangGraph Studio یا روش داخلی .get_graph() که یک نمودار Mermaid برای مستندسازی تولید میکند، بصریسازی کنید.
ملاحظات تولید: ماندگاری و حافظه
یکی از مهمترین مزایای LangGraph، پشتیبانی آن از ماندگاری (Persistence) است. با یکپارچهسازی با LangGraph Platform یا استفاده از ذخیرهسازی محلی، میتوانید پس از هر مرحله وضعیت را چکپوینت کنید. این کار امکانهای زیر را فراهم میکند:
- ادامهپذیری (Resumption): اگر عامل در میانه یک وظیفه به دلیل خطای API شکست بخورد، میتوانید از آخرین چکپوینت موفق شروع کنید به جای اینکه از صفر شروع کنید.
- انسان در حلقه (Human-in-the-Loop): میتوانید اجرای گراف را متوقف کنید، نتایج میانی را برای تأیید به یک انسان ارائه دهید و سپس پس از دریافت ورودی، به طور خودکار ادامه دهید.
- دیباگ (Debugging): با بارگذاری یک وضعیت چکپوینت خاص، میتوانید هر مکالمهای را بازپخش کنید.
نتیجهگیری
LangGraph نشاندهنده بلوغ در چشمانداز عاملهای هوش مصنوعی است. این چارچوب فراتر از "جادو" زنجیرهبندی خودکار حرکت میکند و سختی ساختاری مورد نیاز برای برنامههای سطح سازمانی را فراهم میکند. با در نظر گرفتن منطق عامل خود به عنوان یک گراف، شما مشاهدهپذیری، کنترل و مقاومت را به دست میآورید. با ادامه رشد قابلیتهای LLMها، چارچوبهایی که به ما امکان میدهند این قابلیتها را با دقت ارکستراسیون کنیم — مانند LangGraph — برای ساخت سیستمهای هوش مصنوعی قابل اعتماد و مقیاسپذیر ضروری خواهند بود.