بسیاری از توسعهدهندگان وقتی سراغ ساخت سیستمهای چندایجنت میروند، در همان روزهای اول پشت دموهای جذاب فریمورکها متوقف میشوند. ساخت پایپلاینهای چندمرحلهای مثل تحلیل داده، جستوجو و تدوین گزارش نیازمند ابزارهایی است که با ساختار داده و منطق مسئله هماهنگ باشند. استفاده از فریمورک نامناسب باعث میشود بخش بزرگی از زمان پروژه صرف جنگیدن با لایهی مدیریت وضعیت (State) یا ساختارهای نامنعطف ارکستراسیون شود.
اگر از داخل ایران روی توسعهی این ایجنتها کار میکنید، محدودیتهای دسترسی به ارائهدهندگان خارجی و هزینههای ارزی مصرف توکن چالش را دوچندان میکند. کارتهای بانکی ایرانی امکان پرداخت مستقیم به ارائهدهندگانی مانند OpenAI یا Anthropic را ندارند؛ در نتیجه استفاده از فریمورکهایی که تصمیمگیری و مسیریابی را مدام به پرامپتهای مدیر محول میکنند، هزینه و تاخیر فراخوانیها را به شدت افزایش میدهد. برای این سناریوها شناخت معماری فریمورکها کمک میکند تا با کمترین مصرف توکن و از طریق گیتویهای واسط یا مدلهای سبک محلی، سیستمی پایدار بسازید.
در این درس چهار فریمورک مطرح LangGraph، CrewAI، AutoGen و Agno را در معیارهای کلیدی مثل نوع انتزاع، مدل ذخیرهسازی وضعیت، شیوهی انشعاب و رصدپذیری مقایسه میکنیم تا پیش از نوشتن حتی یک خط کد، ابزار درست را انتخاب کنید.
همهی فریمورکها یک دمو را میفروشند (ایجنت پژوهشگری که گزارش میسازد) و یک باگ مشترک را پنهان میکنند (جنگ اسکیما با لایهی ارکستراسیون). فریمورکی را انتخاب کنید که انتزاعهایش با فرم مسئلهتان جور باشد؛ هر چیز دیگری چسبی است که مجبورید دو بار بنویسید.
صورت مسئله
کاری دارید که به بیش از یک فراخوانی مدل زبانی (LLM call) نیاز دارد. شاید یک گردشکار پژوهشی است (برنامهریزی، جستوجو، خلاصهسازی، ارجاعدهی). شاید یک پایپلاین بازبینی کد است (پارس کردن diff، نقد، پچ زدن، اعتبارسنجی). شاید هم یک دستیار چندنوبته است که پرواز رزرو میکند، ایمیل میزند و گزارشهای هزینه را ثبت میکند. یک فریمورک انتخاب میکنید.
سه روز بعد متوجه میشوید که انتزاعهای فریمورک پس میزنند و محدودیتهایشان بیرون میزند. CrewAI به شما نقش میدهد، اما وقتی «پژوهشگر» بخواهد یک برنامهی ساختاریافته تحویل «نویسنده» دهد، دستوپایتان را میبندد. AutoGen گفتوگوی بین ایجنتها را فراهم میکند اما وضعیت (state) درجهیک ندارد؛ به همین دلیل چکپوینت شما عملاً یک فایل pickle از لاگ گفتوگوست. LangGraph به شما گراف وضعیت میدهد اما مجبورتان میکند پیش از آنکه بدانید ایجنت قرار است چه کند، تکتک گذارها (transitions) را نامگذاری کنید. Agno انتزاعی تکایجنت ارائه میدهد که بهمحض تلاش برای پخش موازی کار بین سه ورکر همروند، صدایش درمیآید.
راه چاره «انتخاب بهترین فریمورک» نیست؛ هماهنگ کردن انتزاع هستهای فریمورک با فرم مسئلهتان است. این درس همان نقشهی راه را ترسیم میکند.
مفهوم
چهار فریمورک بر فضای سال 2026 مسلط هستند. انتزاعهای هستهای آنها یکسان نیستند.
| فریمورک | انتزاع هستهای | بهترین کاربرد | بدترین کاربرد |
|---|---|---|---|
| LangGraph | StateGraph — وضعیت تیپدار، نودها، یالهای شرطی، چکپوینتر. |
گردشکارهای نیازمند وضعیت صریح و وقفه برای ورود انسان به چرخه (human-in-the-loop)؛ ایجنتهای پروداکشن نیازمند دیباگ سفر در زمان (time-travel debugging). | طوفان فکری آزاد و نقشمحور که توپولوژی آن از پیش نامشخص است. |
| CrewAI | Crew — نقشها (هدف، پسزمینهی شخصیتی)، تسکها، فرایند (ترتیبی یا سلسلهمراتبی). |
گردشکارهای نقشآفرینی یا مبتنی بر پرسونای مشخص با برنامهی خطی/سلسلهمراتبی کوتاه. | هر سناریوی وضعیتداری فراتر از تاریخچهی نوبتهای تیم؛ انشعابهای پیچیده. |
| AutoGen | جفت ConversableAgent — دو یا چند ایجنت که نوبتی گفتوگو میکنند تا به شرط خروج برسند. |
دیالوگ چندایجنت (استاد-شاگرد، پیشنهاددهنده-منتقد، مجری-بازبین) که در آن روند اندیشیدن از دل چت شکل میگیرد. | گردشکارهای قطعی با یک DAG مشخص؛ هر سیستمی که پس از راهاندازی مجدد به وضعیت پایدار نیاز دارد. |
| Agno | Agent — یک LLM تکی + ابزارها + حافظه، با قابلیت ترکیب در قالب تیمها. |
ساخت سریع ایجنتهای تکی و تیمهای سبک؛ پشتیبانی قوی از چندوجهی (multi-modality) و درایورهای ذخیرهسازی داخلی. | گرافهای عمیق با انشعابهای صریح و ردیوسرهای (reducers) سفارشی. |
معنای واقعی «انتزاع»
انتزاع هستهای یک فریمورک همان چیزی است که وقتی معماری را روی تخته سفید ترسیم میکنید، میکشید.
- LangGraph ← یک گراف میکشید. نودها مراحل کارند، یالها گذارها هستند و شیء وضعیت در هر نقطه تیپ مشخصی دارد. مدل ذهنی آن یک ماشین وضعیت (state machine) است.
- CrewAI ← یک چارت سازمانی میکشید. هر نقش شرح وظایف دارد و یک مدیر تسکها را مسیریابی میکند. مدل ذهنی آن یک تیم کوچک از متخصصان است.
- AutoGen ← یک پیام خصوصی در Slack میکشید. دو ایجنت به هم پیام میدهند؛ اگر ناظر نیاز باشد، سومی هم اضافه میشود. مدل ذهنی آن چت و گفتوگوست.
- Agno ← یک جعبهی تکی میکشید که ابزارهایی به آن متصل است. برای ساخت تیم، چند جعبه را کنار هم میگذارید. مدل ذهنی آن «ایجنت همهچیزتمام» (batteries included) است.
مسئلهی وضعیت
وضعیت همان نقطهای است که بیشتر انتخابهای فریمورک در محیط پروداکشن در آن گیر میکنند.
- LangGraph. وضعیت تیپدار (
TypedDictیا مدل Pydantic)، ردیوسر برای هر فیلد، چکپوینتر درجهیک (SQLite/Postgres/Redis). ازسرگیری، وقفه و سفر در زمان بدون دردسر و رایگان در دسترساند. (رجوع کنید به فاز 11 · 16.) - CrewAI. وضعیت در قالب رشته از طریق فیلد
contextبین تسکها جابهجا میشود، یا باoutput_pydanticساختار میگیرد. بهصورت پیشفرض حافظهی پایدار مجزایی به ازای هر تیم ندارد؛ اگر قرار است تیم پس از ریاستارت کارش را ادامه دهد، باید خودتان آن را به سیستم وصل کنید. - AutoGen. وضعیت همان تاریخچهی چت و
contextتعریفشده توسط کاربر است. متن گفتوگوها ذخیره میشود؛ وضعیت دلخواه گردشکار پایدار نمیماند مگر اینکه خودتان برایش آداپتور بنویسید. - Agno. درایورهای ذخیرهسازی داخلی (SQLite، Postgres، Mongo، Redis، DynamoDB) که با
storage=بهAgentمتصل میشوند — نشستهای گفتوگو و حافظههای کاربر خودبهخود ذخیره و پایدار میمانند. این ابزار یک چکپوینتر گراف کامل نیست؛ یک ذخیرهساز نشست (session store) است.
مسئلهی انشعاب
هر ایجنت غیرسادهای انشعاب پیدا میکند. مسئلهی مهم این است که چه کسی دربارهی انشعاب تصمیم میگیرد.
- LangGraph — شما از طریق یالهای شرطی تصمیم میگیرید. مسیریابی یک تابع پایتون با شاخههای نامگذاریشده است. شاخهها در گراف کامپایلشده موجودیت درجهیک دارند؛ چکپوینتر ثبت میکند کدام شاخه طی شده است.
- CrewAI — در حالت سلسلهمراتبی مدیر تصمیم میگیرد؛ در حالت ترتیبی شما در زمان ساخت کد تعیین میکنید. مسیریابی در دل فهرست تسکها پنهان است؛ هیچ «شرط (if)» درجهیکی خارج از پرامپت مدیر وجود ندارد.
- AutoGen — ایجنتها از طریق چت تصمیم میگیرند. انشعاب بر اساس این شکل میگیرد که چه کسی نوبت بعدی صحبت را بر عهده بگیرد.
GroupChatManagerگویندهی بعدی را انتخاب میکند؛ میتوانید یکspeaker_selection_methodدستی بنویسید اما حالت پیشفرض بر پایهی LLM است. - Agno — ایجنت بر اساس ابزاری که برای فراخوانی بعدی انتخاب میکند تصمیم میگیرد. تیمها حالت هماهنگکننده/مسیریاب/همکار دارند؛ انشعاب فراتر از آن بر عهدهی توسعهدهنده است.
مسئلهی رصدپذیری
- LangGraph — پشتیبانی از OpenTelemetry از طریق LangSmith یا هر اکسپورتر دیگر OTel. هر گذار بین نودها یک span در ردگیری محاسبات است؛ چکپوینتها کار تریسهای قابل بازپخش را هم انجام میدهند. LangSmith گزینهی رسمی است؛ Langfuse و Phoenix هم برای آن آداپتور دارند.
- CrewAI — پشتیبانی درجهیک از OpenTelemetry از اواخر 2025؛ با قابلیت اتصال به Langfuse، Phoenix، Opik و AgentOps.
- AutoGen — یکپارچگی با OpenTelemetry از طریق
autogen-core؛ اتصالدهندههای AgentOps و Opik هم در دسترساند. سطح جزئیات ردگیری محاسبات به ازای هر پیام ایجنت است، نه به ازای هر نود. - Agno — پرچم داخلی
monitoring=Trueبه همراه اکسپورترهای OpenTelemetry؛ سازگاری یکپارچه با Langfuse برای ثبت تریسهای هر نشست.
هزینه و تاخیر
هر چهار فریمورک به ازای هر فراخوانی سربار ایجاد میکنند (منطق فریمورک، اعتبارسنجی، سریالسازی). ترتیب تقریبی افزایش سربار: Agno ≈ LangGraph < CrewAI ≈ AutoGen. بخش عمدهی این تفاوت به میزان مسیریابی اضافهای برمیگردد که فریمورک به دوش LLM میاندازد. مدیر سلسلهمراتبی در CrewAI برای تصمیمگیری دربارهی نوبت بعدی توکن مصرف میکند؛ GroupChatManager در AutoGen هم همینطور. LangGraph تنها در جاهایی توکن مصرف میکند که شما صریحاً llm.invoke نوشته باشید. مسیر تکایجنت Agno نیز بسیار سبک است.
وقتی هزینه به ازای هر بار اجرا اهمیت دارد، مسیریابی صریح (یالهای LangGraph، متد speaker_selection_method در AutoGen) را به مسیریابی با انتخاب LLM ترجیح دهید.
تعاملپذیری
- LangGraph ↔ ابزارها، بازیابها (retrievers) و مدلهای زبانی LangChain. آداپتور درجهیک MCP (ابزارها در قالب سرورهای MCP ایمپورت میشوند).
- CrewAI ↔ ابزارها از
BaseToolارثبری میکنند؛ ابزارهای LangChain، ابزارهای LlamaIndex و ابزارهای MCP همگی هماهنگ میشوند. تفویض اختیار از تیمی به تیم دیگر از طریقallow_delegation=Trueانجام میشود. - AutoGen ← کلاس
FunctionToolهر کالبل پایتونی را پوشش میدهد؛ آداپتور MCP هم در دسترس است. اتصال تنگاتنگ با اکوسیستم AG2 برای الگوهای ارتباط ایجنت با ایجنت. - Agno ← دکوراتور
tool@یا زیرکلاس BaseTool؛ دارای آداپتور MCP؛ ابزارها را میتوان میان ایجنتها و تیمها به اشتراک گذاشت.
مهارت
بتوانید در یک جمله توضیح دهید چرا فریمورکی خاص برای مسئلهی مشخصی از ایجنت مناسب است.
چکلیست پیش از پیادهسازی:
- فرم مسئله را رسم کنید. آیا با یک گراف روبهرو هستید (وضعیت تیپدار، گذارهای مشخص)؟ نقشآفرینی (متخصصانی که کار را دستبهدست میکنند)؟ چت (ایجنتهایی که تا پایان کار گفتوگو میکنند)؟ یا یک ایجنت تکی مجهز به ابزار؟
- مشخص کنید انشعابها دست کیست. انشعاب با تصمیم توسعهدهنده ← LangGraph. انشعاب با تصمیم ایجنت مدیر ← CrewAI در حالت سلسلهمراتبی. شکلگیری خودبهخودی از دل چت ← AutoGen. تصمیمگیری با فراخوانی ابزار ← Agno.
- ظرفیت و نیازهای وضعیت را بررسی کنید. آیا به قابلیت ازسرگیری از روی چکپوینت نیاز دارید؟ سفر در زمان چطور؟ وقفهی انسانی در میانهی اجرا؟ اگر بله، LangGraph گزینهی پیشفرض است؛ نشستهای Agno هم وضعیتهای در دامنهی گفتوگو را پوشش میدهند.
- بودجهی هزینه را بسنجید. مسیریابی با انتخاب LLM در هر نوبت توکن اضافه مصرف میکند. اگر ایجنت هزاران بار در روز اجرا میشود، سراغ مسیریابی صریح بروید.
- سربار فریمورک را محاسبه کنید. هر فریمورک یعنی یک وابستگی اضافه. اگر کار با دو فراخوانی LLM و یک ابزار راه میافتد، 30 خط پایتون خالص بنویسید؛ هیچ فریمورکی ارزانتر از ننوشتن فریمورک نیست.
پیش از آنکه بتوانید گراف، چارت سازمانی، چت یا جعبهی ایجنت را رسم کنید، دست به فریمورک نبرید. سراغ گزینهای نروید که برای ابتداییترین نیازهایتان مجبورتان کند با مدل وضعیت آن بجنگید.
ماتریس تصمیمگیری
| فرم مسئله | فریمورک پیشنهادی | دلیل |
|---|---|---|
| DAG گردشکار با وضعیت تیپدار، تاییدیههای انسانی، اجرای طولانیمدت | LangGraph | وضعیت درجهیک، چکپوینتر، وقفهها، سفر در زمان. |
| پایپلاین پژوهش / نویسندگی با نقشهای تفکیکشده | CrewAI (حالت ترتیبی) یا زیرگرافهای LangGraph | تعریف نقش به ازای هر تسک در CrewAI بسیار ساده و کمهزینه بیان میشود؛ با پیچیده شدن انشعابها، مقیاس کار را با LangGraph بالا ببرید. |
| دیالوگ پیشنهاددهنده-منتقد یا استاد-شاگرد | AutoGen | چت دونفره فرم بومی و طبیعی این فریمورک است. |
| ایجنت تکی همراه با ابزارها، نشستها و حافظه | Agno | سبکترین راهاندازی، همراه با ذخیرهسازی و حافظهی داخلی. |
| پخش موازی به هزاران شاخه همراه با ردیوسرها | LangGraph به همراه Send |
تنها گزینهای که API درجهیک برای دیسپچ موازی دارد. |
| نمونهی اولیهی سریع، بدون تعهد به فریمورک | پایتون خالص + SDK ارائهدهنده | استفاده نکردن از فریمورک، سریعترین فریمورک ممکن است. |
تمرینها
- ساده. تسک یکسانی را در نظر بگیرید — «پژوهش دربارهی دفتر مرکزی Anthropic، نوشتن خلاصه در 200 کلمه، ارجاعدهی به منابع» — و آن را هم در LangGraph (چهار نود: برنامهریزی، جستوجو، نگارش، ارجاعدهی) و هم در CrewAI (سه نقش: پژوهشگر، نویسنده، ویراستار) پیاده کنید. هزینهی توکن در هر بار اجرا و تعداد خطوط کد را گزارش دهید.
- متوسط. همین تسک را در AutoGen (چت بین پژوهشگر ↔ نویسنده، پیوستن ویراستار از طریق
GroupChat) و Agno (یک ایجنت تکی باsearch_toolsوwrite_toolsبه همراه ذخیرهساز نشست) بسازید. این چهار پیادهسازی را از نظر (الف) هزینه در هر اجرا، (ب) قابلیت ازسرگیری پس از کرش، (ج) امکان اعمال تاییدیه انسانی پیش از مرحلهی نوشتن رتبهبندی کنید. - سخت. یک اسکریپت درخت تصمیم با نام
pick_framework.pyبسازید که شرح کوتاهی از مسئله را (در قالب JSON:{has_typed_state, has_roles, has_dialogue, has_parallel_fanout, needs_resume}) دریافت کند و فریمورک پیشنهادی را همراه با دلیل در یک جمله برگرداند. درستی کارکرد آن را روی شش سناریوی طراحیشده توسط خودتان بیازمایید.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوهای روزمره | معنای فنی و دقیق |
|---|---|---|
| ارکستراسیون (Orchestration) | «نحوهی هماهنگی ایجنتها» | لایهای که مشخص میکند کدام نود/نقش/ایجنت در مرحلهی بعد اجرا شود. |
| وضعیت پایدار (Durable state) | «ادامهی کار بعد از ریاستارت» | وضعیتی که پس از توقف پروسه حفظ میشود و به یک چکپوینت یا ذخیرهساز نشست متصل است. |
| مسیریابی با انتخاب LLM (LLM-selected routing) | «سپردن تصمیم به خود مدل» | یک LLM برنامهریز در هر نوبت گام بعدی را تعیین میکند؛ منعطف است اما در هر تصمیم توکن میسوزاند. |
| مسیریابی صریح (Explicit routing) | «تصمیمگیری توسط توسعهدهنده» | یک تابع پایتون یا یال استاتیک مرحلهی بعد را مشخص میکند؛ ارزان و قابل ارزیابی است. |
| تیم (Crew) | «یک تیم در CrewAI» | نقشها + تسکها + فرایند (ترتیبی یا سلسلهمراتبی) که در قالب یک شیءِ قابلاجرا یکپارچه شدهاند. |
| گپ گروهی (GroupChat) | «چت چندایجنت در AutoGen» | یک گفتوگوی مدیریتشده میان N ایجنت همراه با یک انتخابکنندهی گوینده. |
| تیم در Agno (Team) | «حالت چندایجنت فریمورک Agno» | حالتهای مسیریابی / هماهنگی / همکاری روی مجموعهای از ایجنتها. |
| گراف وضعیت (StateGraph) | «گراف در LangGraph» | انتزاعی مبتنی بر وضعیت تیپدار، نودها، یالهای شرطی و چکپوینتر. |
برای مطالعهی بیشتر
- مستندات LangGraph — بررسی StateGraph، چکپوینترها، وقفهها و دیباگ سفر در زمان.
- مستندات CrewAI — آشنایی با ابزارهای Crews، Flows، Agents، Tasks و Processes.
- مستندات AutoGen — بررسی ConversableAgent، GroupChat، تیمها و ابزارها.
- مستندات Agno — مباحث Agent، Team، Workflow، ذخیرهسازی و حافظه.
- مقالهی Anthropic — ساخت ایجنتهای کارآمد (دسامبر 2024) — مجموعهای از الگوها (زنجیرهسازی پرامپت، مسیریابی، موازیسازی، ارکستراتور-ورکرها، ارزیاب-بهینهساز) مستقل از فریمورک.
- مقالهی Yao و همکاران، "ReAct: Synergizing Reasoning and Acting" (کنفرانس ICLR 2023) — حلقهی تکراری که همهی فریمورکها آن را در قالبی تازه ارائه میدهند.
- مقالهی Wu و همکاران، "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation" (سال 2023) — مقالهی معماری AutoGen.
- مقالهی Park و همکاران، "Generative Agents: Interactive Simulacra of Human Behavior" (کنفرانس UIST 2023) — پایههای نقشآفرینی که الگوهای پرسونا در فریمورکهایی مثل CrewAI بر آن بنا شدهاند.
- فاز 11 · 16 (LangGraph) — فریمورکی که در این درس مبنای مقایسه قرار گرفته است.
- فاز 11 · 19 (Reflexion) — الگویی که در LangGraph بسیار تمیز پیاده میشود، اما پیادهسازیاش در CrewAI دستوپاگیر است.
- فاز 11 · 22 (رصدپذیری در محیط پروداکشن) — روشهای ابزارگذاری برای هر فریمورکی که انتخاب میکنید.
