مقدمه
مدلهای زبانی بزرگ (LLMها) تعامل ما با نرمافزارها را متحول کردهاند، اما معماریهای تکعاملی اغلب در مواجهه با جریانهای کاری چندمرحلهای و بسیار پیچیده با مشکل مواجه میشوند. زمانی که یک وظیفه به مهارتهای متمایز نیاز دارد—مانند بازیابی سوابق حقوقی، انجام محاسبات ریاضی و سپس ترکیب یک گزارش منسجم—یک LLM عمومی ممکن است مستعد توهم (Hallucination) یا از دست دادن زمینه (Context) شود.
اینجاست که LangGraph درخشش خود را نشان میدهد. به عنوان یک چارچوب قدرتمند ساخته شده بر پایه LangChain، LangGraph به توسعهدهندگان امکان میدهد تا برنامههای چندعاملی با حالت (Stateful) را به صورت گرافها تعریف کنند. با هماهنگسازی عوامل LLM تخصصی، میتوان سیستمهایی ایجاد کرد که مقاومتر، دقیقتر و قابل نگهداریتر باشند. در این راهنما، ما معماری سیستمهای چندعاملی را بررسی خواهیم کرد و یک پیادهسازی عملی برای یک سناریوی پیچیده پشتیبانی مشتری ارائه خواهیم داد.
چرا معماری چندعاملی؟
رویکردهای سنتی زنجیره تفکر (Chain-of-thought) LLM را به عنوان یک جعبه سیاه واحد در نظر میگیرند. در مقابل، یک معماری چندعاملی مشکلات را به زیروظیفههای کوچکتر تجزیه میکند که هر کدام توسط عاملی با ابزارها و دستورالعملهای خاص مدیریت میشوند. مزایای کلیدی عبارتند از:
- تخصصیسازی: هر عامل بر یک حوزه باریک تمرکز میکند، که دقت را بهبود میبخشد.
- قابلیت عیبیابی: میتوانید دقیقاً ردیابی کنید که خطا در کجای جریان کاری رخ داده است.
- مقیاسپذیری: قابلیتهای جدید میتوانند به عنوان گرههای جدید در گراف اضافه شوند، بدون بازنویسی منطق اصلی.
طراحی معماری: گراف حالت
در قلب LangGraph، StateGraph قرار دارد. حالت یک دیکشنری است که در تمام گرهها (عوامل) گراف باقی میماند. برای مورد استفاده ما، بیایید یک ربات پشتیبانی با سه عامل طراحی کنیم:
- عامل تریاژ: نیت کاربر را طبقهبندی میکند (مثلاً، صورتحساب، فنی، حساب کاربری).
- عامل متخصص: یک گره پویا که به ابزار تخصصی صحیح یا پرامپت LLM مسیریابی میکند.
- عامل ترکیبکننده: یافتههای متخصص را به یک پاسخ نهایی و کاربرپسند ترکیب میکند.
پیادهسازی: ساخت عوامل
اول، ما نیاز داریم که طرح حالت (State schema) و عوامل فردی را تعریف کنیم. ما از Python و کتابخانه langgraph استفاده خواهیم کرد.
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
from langchain_openai import ChatOpenAI
import operator
# 1. تعریف حالت
class SupportState(TypedDict):
user_query: str
intent: str
specialist_response: str
final_response: str
# 2. مقداردهی اولیه LLMها
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 3. تعریف توابع عامل
def triage_agent(state: SupportState) -> dict:
"""نیت کاربر را طبقهبندی میکند."""
prompt = f"Classify the following query into 'billing', 'technical', or 'other': {state['user_query']}"
intent = llm.invoke(prompt).content.strip().lower()
return {"intent": intent}
def specialist_agent(state: SupportState) -> dict:
"""منطق حوزه خاص را مدیریت میکند."""
if state["intent"] == "billing":
# در یک اپلیکیشن واقعی، شما اینجا یک API یا RAG را فراخوانی میکنید
response = "I have checked your billing status. Your account is in good standing."
elif state["intent"] == "technical":
response = "Please try restarting your device. If issues persist, check your firewall settings."
else:
response = "I'm not sure how to handle that specific request."
return {"specialist_response": response}
def synthesizer_agent(state: SupportState) -> dict:
"""خروجی متخصص را به یک پاسخ دوستانه ترکیب میکند."""
prompt = f"""
User Query: {state['user_query']}
Specialist Info: {state['specialist_response']}
Write a polite, professional response to the user based on the specialist info.
"""
final_response = llm.invoke(prompt).content
return {"final_response": final_response}
هماهنگسازی جریان کاری
اکنون، ما این توابع را به یک گراف متصل میکنیم. LangGraph از گرهها برای نمایش عوامل و از یالها برای تعریف جریان داده استفاده میکند.
# 4. ساخت گراف
workflow = StateGraph(SupportState)
# افزودن گرهها
workflow.add_node("triage", triage_agent)
workflow.add_node("specialist", specialist_agent)
workflow.add_node("synthesizer", synthesizer_agent)
# تعریف جریان
workflow.set_entry_point("triage")
workflow.add_edge("triage", "specialist")
workflow.add_edge("specialist", "synthesizer")
workflow.add_edge("synthesizer", END)
# کامپایل گراف
app = workflow.compile()
تست سیستم
برای تست چتبات چندعاملی ما، ما صرفاً برنامه کامپایل شده را با یک پرسش کاربر فراخوانی میکنیم. توجه کنید که چگونه حالت از تریاژ، به متخصص و در نهایت به ترکیبکننده جریان مییابد.
# 5. اجرای برنامه
query = "I was double charged for my last subscription renewal."
result = app.invoke({
"user_query": query,
"intent": "",
"specialist_response": "",
"final_response": ""
})
print(f"Detected Intent: {result['intent']}")
print(f"Final Response: {result['final_response']}")
نتیجهگیری
ساخت چتباتهای هوش مصنوعی چندعاملی با LangGraph نحوه مدیریت ما از وظایف پیچیده هوش مصنوعی را متحول میکند. با تجزیه مشکلات به گرههای تخصصی، ما کنترل بهتری بر فرآیند استدلال به دست میآوریم و میتوانیم ابزارهای متنوع را به طور یکپارچه یکپارچه کنیم. اگرچه مثال بالا خطی است، LangGraph همچنین از شاخهبندی شرطی و چرخهها پشتیبانی میکند، که امکان تعاملات عاملی پیچیدهتر را فراهم میکند، مانند این که یک عامل قبل از ادامه دادن درخواست توضیح کند. هنگامی که به ساختن ادامه میدهید، در نظر بگیرید که لاگگیری و تأییدات انسانی در حلقه (human-in-the-loop) را اضافه کنید تا ایمنی و قابلیت اطمینان در محیطهای تولید تضمین شود.