Agent Frameworks

تسلط بر LangGraph: ساخت عامل‌های هوش مصنوعی پایدار و دارای حالت با منطق حلقوی

با حرکت مدل‌های زبانی بزرگ (LLMs) از رابط‌های چت ساده به سمت عامل‌های خودمختار پیچیده، نیاز به مدیریت وضعیت و جریان کنترل پایدار بسیار حیاتی می‌شود. چارچوب‌های سنتی عامل اغلب در مدیریت حلقه‌های بی‌نهایت، عدم قابلیت مشاهده یا مسیرهای اجرای خطی خشک دچار مشکل می‌شوند. LangGraph به عنوان کتابخانه‌ای که روی LangChain ساخته شده است، به توسعه‌دهندگان اجازه می‌دهد تا برنامه‌های چندعاملی دارای حالت را با استفاده از گراف‌های جهت‌دار با LLMها بسازند. این پست به بررسی دلایلی می‌پردازد که LangGraph را به استاندارد طلایی برای توسعه عامل‌های در سطح تولید تبدیل کرده است و نحوه استفاده از آن را توضیح می‌دهد.

چرا LangGraph به جای زنجیره‌های سنتی؟

بیشتر برنامه‌های LLM به صورت زنجیره‌ای ساخته می‌شوند: دنباله‌ای خطی از مراحل که خروجی A به ورودی B تغذیه می‌شود. با این حال، مسائل دنیای واقعی به ندرت از یک خط مستقیم پیروی می‌کنند. آن‌ها به حلقه‌ها، منطق شاخه‌ای و قابلیت توقف اجرا برای تأیید انسانی نیاز دارند. LangGraph منطق عامل شما را به عنوان یک گراف در نظر می‌گیرد که در آن گره‌ها نمایانگر محاسبات (مانند تماس با LLM یا اجرای ابزار) و یال‌ها نمایانگر جریان کنترل هستند.

تفاوت کلیدی وضعیت است. در 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="Search results: Paris is the capital of France.")],
        "is_answer_complete": True
    }

def verify_node(state: AgentState) -> dict:
    # بررسی اینکه آیا آخرین پیام حاوی اطلاعات کافی است
    # در یک سناریوی واقعی، این را به یک LLM ارسال می‌کنید
    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 نشان‌دهنده یک جهش بزرگ در نحوه ساخت برنامه‌های LLM است. با پذیرش نظریه گراف و مدیریت وضعیت صریح، به توسعه‌دهندگان اجازه می‌دهد تا عامل‌هایی بسازند که نه تنها هوشمندتر، بلکه قابل اعتمادتر و قابل اشکال‌زدایی هستند. برای توسعه‌دهندگان متوسط تا پیشرفته‌ای که می‌خواهند از لوله‌های RAG ساده فراتر رفته و عامل‌های خودمختار، حلقوی و چندمرحله‌ای بسازند، LangGraph یک ابزار ضروری در مجموعه هوش مصنوعی مدرن است. با مدل‌سازی منطق خود به عنوان یک گراف شروع کنید و خواهید دید که پیچیدگی قابل مدیریت می‌شود.

Share: