فاز 14 · درس 14

مدل اکتور برای ایجنت‌ها: پیام‌رسانی ناهمگام و رانتایم‌های مقید

نوع
مفهومی و ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 14 · درس 01 (حلقه‌ی ایجنت)، فاز 14 · درس 12 (الگوهای گردش کار)
چند محفظه مکعبی شیشه‌ای مجزا در کنار یکدیگر که نامه‌ها از طریق لوله‌های معلق و شفاف پنوماتیک بین آن‌ها ردوبدل می‌شوند
فهرست مطالب
  1. اهداف یادگیری
  2. مسئله چیست؟
  3. مفهوم
  4. اکتورها
  5. سه لایه‌ی API
  6. چرا جداسازی پیام مهم است؟
  7. توپولوژی‌ها
  8. مشاهده‌پذیری
  9. وضعیت: حالت نگهداری
  10. پیاده‌سازی
  11. کاربردها
  12. خروجی آماده
  13. تمرین‌ها
  14. اصطلاحات کلیدی
  15. مطالعه‌ی بیشتر

بسیاری از توسعه‌دهندگان هنگام ساخت سیستم‌های چندایجنت با فریم‌ورک‌های متداول، به بن‌بست معماری همگام برخورد می‌کنند: بروز یک خطا در ابزار یا پاسخ یک مدل، کل پشته‌ی فراخوانی را از کار می‌اندازد و افزودن همزمانی نیازمند بازنویسی‌های پیچیده است. مدل اکتور (Actor Model) این چالش را با جداسازی حافظه و تبدیل ارتباطات به پیام‌های ناهمگام حل می‌کند؛ الگویی بنیادین که در بازطراحی فریم‌ورک‌هایی مانند AutoGen v0.4 به هسته‌ی اصلی ارکستراسیون بدل شده است.

درک این الگو از این جهت حیاتی است که ساختار سنتی زنجیره‌ای جای خود را به سیستم‌های تاب‌آور می‌دهد. در مدل اکتور، هر ایجنت وضعیت خصوصی و صندوق دریافت خود را دارد و کرش کردن یک بخش، به معنای توقف کل چرخه نخواهد بود؛ قابلیتی که هم در طراحی رانتایم‌های محلی و هم در سیستم‌های توزیع‌شده مزیت بزرگی محسوب می‌شود.

کد پیاده‌سازی این درس صرفاً با کتابخانه‌ی استاندارد Python اجرا می‌شود و برای درک مفاهیم آن به سخت‌افزار خاص یا پردازش ابری نیازی ندارید؛ بنابراین پیاده‌سازی آن روی سیستم‌های شخصی بدون هیچ پیچیدگی جانبی ممکن است.

ایجنت‌ها در نقش اکتور (Actor): تبادل ناهمگام پیام، هندلرهای رویدادمحور، تفکیک خطا (fault isolation) و همزمانی طبیعی. بخش تحقیقات مایکروسافت در ژانویه 2025 با معرفی AutoGen v0.4، ارکستراسیون ایجنت‌ها را بر پایه‌ی این مدل بازطراحی کرد. این فریم‌ورک اکنون در حالت نگهداری (maintenance mode) قرار دارد و Microsoft Agent Framework (پیش‌نمایش عمومی اکتبر 2025) جانشین عملیاتی آن است.

اهداف یادگیری

  • مدل اکتور را تشریح کنید: ایجنت‌ها در نقش اکتور، پیام‌ها به‌عنوان تنها روش ارتباط بین‌فرایندی (IPC) و تفکیک خطا به‌ازای هر اکتور.
  • سه لایه‌ی API در AutoGen v0.4 یعنی Core، AgentChat و Extensions و کاربرد هرکدام را نام ببرید.
  • توضیح دهید چرا جداسازی تحویل پیام از پردازش آن، تفکیک خطا و همزمانی طبیعی ایجاد می‌کند.
  • یک محیط اجرای (runtime) اکتور را با کتابخانه‌ی استاندارد Python پیاده‌سازی کنید و فرایند بازبینی کد دورایجنت را روی آن اجرا کنید.

مسئله چیست؟

بیشتر فریم‌ورک‌های ایجنت همگام هستند: یک ایجنت تولید می‌کند و دیگری در همان پشته‌ی فراخوانی (call stack) مصرف می‌کند. بروز خطا کل پشته را می‌خواباند، همزمانی به‌صورت وصله‌پینه‌ای اضافه شده است و توزیع‌شدگی مستلزم بازنویسی کامل کد خواهد بود.

پاسخ AutoGen v0.4: مدل اکتور. هر ایجنت اکتوری با یک صندوق دریافت (inbox) اختصاصی است. پیام‌ها تنها شیوه‌ی تعامل‌اند. محیط اجرا تحویل پیام را از پردازش آن جدا می‌کند. خطاها درون همان یک اکتور مهار می‌شوند. همزمانی ماهیتی بومی دارد و توزیع‌شدگی صرفاً تغییر بستر انتقال (transport) است.

مفهوم

اکتورها

یک اکتور شامل این اجزاست:

  • وضعیت اختصاصی (که هرگز مستقیماً از بیرون دستکاری نمی‌شود).
  • یک صندوق دریافت (صف پیام).
  • یک هندلر: receive(message) -> effects که اثرهای جانبی آن می‌تواند «پاسخ دادن»، «ارسال به اکتور دیگر»، «ساخت اکتور جدید»، «به‌روزرسانی وضعیت» یا «توقف خود» باشد.

دو اکتور نمی‌توانند حافظه‌ی مشترک داشته باشند؛ تنها راه تعامل، ارسال پیام است.

سه لایه‌ی API

AutoGen v0.4 سطح دسترسی خود را به سه بخش تقسیم می‌کند:

  1. Core: فریم‌ورک سطح پایین اکتور شامل AgentRuntime، Agent، Message و Topic. تبادل ناهمگام پیام و مبتنی بر رویداد.
  2. AgentChat: رابط سطح بالای وظیفه‌محور (جایگزین ConversableAgent در نسخه‌ی v0.2) شامل AssistantAgent، UserProxyAgent، RoundRobinGroupChat و SelectorGroupChat.
  3. Extensions: یکپارچه‌سازی‌ها با OpenAI، Anthropic، Azure، ابزارها و حافظه.

چرا جداسازی پیام مهم است؟

در مدل نسخه‌ی v0.2، فراخوانی agent_a.chat(agent_b) به‌شکل همگام، agent_a را تا زمان بازگشت پاسخ از agent_b مسدود می‌کرد. در v0.4، متد send(agent_b, msg) پیام را در صندوق دریافت agent_b می‌گذارد و بلافاصله برمی‌گردد. محیط اجرا بعداً پیام را تحویل می‌دهد. این سازوکار سه دستاورد دارد:

  • تفکیک خطا. از کار افتادن ایجنت B باعث توقف ایجنت A نمی‌شود؛ محیط اجرا خطا را درون هندلر B مهار می‌کند و درباره‌ی ادامه‌ی کار (لاگ، تلاش مجدد یا ارسال به صف پیام‌های پردازش‌نشده) تصمیم می‌گیرد.
  • همزمانی طبیعی. پیام‌های زیادی می‌توانند هم‌زمان در جریان باشند و اکتورها پیام‌های صندوق دریافت خود را هم‌زمان پردازش می‌کنند.
  • آمادگی برای توزیع‌شدگی. چه اکتور درون یک فرایند باشد و چه روی میزبانی دیگر، صندوق دریافت و بستر انتقال انتزاع کاملاً یکسانی دارند.

توپولوژی‌ها

  • RoundRobinGroupChat: ایجنت‌ها نوبت به نوبت و در چرخه‌ای ثابت پیش می‌روند.
  • SelectorGroupChat: یک ایجنت انتخاب‌کننده، براساس محتوای گفت‌وگو تصمیم می‌گیرد چه کسی نوبت بعدی را در دست بگیرد.
  • Magentic-One: تیم مرجع چندایجنت برای وب‌گردی، اجرای کد و کار با فایل که بر پایه‌ی AgentChat ساخته شده است.

مشاهده‌پذیری

پشتیبانی از OpenTelemetry توکار است. هر پیام یک اسپن (span) ثبت می‌کند و فراخوانی‌های ابزار (tool calls) طبق قراردادهای معنایی (semantic conventions) مربوط به GenAI در OTel سال 2026 (درس 23)، ویژگی‌های gen_ai.* را به‌همراه دارند.

وضعیت: حالت نگهداری

اوایل 2026: AutoGen v0.7.x برای کارهای پژوهشی و ساخت نمونه‌ی اولیه پایدار است. مایکروسافت توسعه‌ی فعال را به Microsoft Agent Framework منتقل کرده که جانشین آماده‌ی تولید آن است (پیش‌نمایش عمومی در 1 اکتبر 2025؛ انتشار نسخه‌ی نهایی 1.0 GA برای اواخر سه‌ماهه‌ی اول 2026 هدف‌گذاری شده بود). الگوهای AutoGen به‌خوبی به فریم‌ورک جدید منتقل می‌شوند، چون مدل اکتور ایده‌ای ماندگار است.

مدل اکتورانتقال پیام ناهمگام
ACTOR MODELEach agent is an actor: private state, a mailbox, a handler. Actors never share memory; they only send messages, and the runtime decouples delivery from handling. A crash isolates to one actor, concurrency is native, and moving to a distributed deployment is just a change of transport.coderوضعیت خصوصیreviewerوضعیت خصوصیمحیط اجراوضعیت خصوصیپیام‌ها تنها روش IPC هستند
هر ایجنت یک اکتور است: وضعیت خصوصی، صندوق پیام و یک کنترل‌کننده (handler). اکتورها هرگز حافظه مشترک ندارند؛ آن‌ها فقط پیام می‌فرستند و محیط اجرا تحویل پیام را از پردازش آن تفکیک می‌کند. خرابی تنها به یک اکتور محدود می‌شود، همزمانی به‌طور محلی پشتیبانی می‌شود و مهاجرت به استقرار توزیع‌شده صرفاً با تغییر بستر انتقال انجام می‌گیرد.

پیاده‌سازی

فایل code/main.py یک محیط اجرای اکتور را با کتابخانه‌ی استاندارد پیاده‌سازی می‌کند:

  • Message: محموله‌ی نوع‌دار با sender، recipient، topic و body.
  • Actor: کلاس انتزاعی با متد receive(message, runtime).
  • Runtime: حلقه‌ی رویداد با صف مشترک، تحویل پیام و تفکیک خطا.
  • دموی دو اکتوری: ReviewerAgent کد را بررسی می‌کند، ChecklistAgent چک‌لیست را پیش می‌برد و تا رسیدن به توافق به تبادل پیام ادامه می‌دهند.

اجرایش کنید:

python3 code/main.py

ردگیری محاسبات (trace) روند تحویل پیام، خطای شبیه‌سازی‌شده در یکی از اکتورها بدون کرش کردن دیگری و در نهایت توافق روی یک نتیجه‌ی مشترک را نشان می‌دهد.

کاربردها

  • AutoGen v0.4/v0.7 (نگهداری): پایدار برای پژوهش، نمونه‌سازی اولیه و الگوهای چندایجنت.
  • Microsoft Agent Framework: جانشین عملیاتی (پیش‌نمایش عمومی اکتبر 2025)؛ همان ایده‌های مدل اکتور با یک API به‌روزرسانی‌شده.
  • توپولوژی Swarm در LangGraph (درس 13): الگویی مشابه از طریق دست‌به‌دست کردن با ابزارهای مشترک.
  • محیط اجرای اختصاصی اکتور: مناسب وقت‌هایی که به بستر انتقال خاصی (مثل NATS، RabbitMQ یا gRPC) نیاز دارید.

خروجی آماده

فایل outputs/skill-actor-runtime.md یک محیط اجرای مینیمال اکتور به‌همراه قالب تیم (RoundRobin یا Selector) برای وظیفه‌ی چندایجنت مدنظر شما تولید می‌کند.

تمرین‌ها

  1. یک صف پیام‌های پردازش‌نشده (dead-letter queue) بسازید: وقتی یک هندلر با خطا متوقف شد، پیام ناموفق را برای بازبینی انسانی کنار بگذارید. در پروژه‌ی کوچک شما چقدر پیش می‌آید که پیامی وارد این صف شود؟
  2. ساختار SelectorGroupChat را پیاده‌سازی کنید: یک اکتور انتخاب‌کننده بسازید که با توجه به وضعیت گفت‌وگو، مشخص کند چه کسی باید پیام بعدی را پردازش کند.
  3. بستر انتقال توزیع‌شده اضافه کنید: صف درون‌فرایندی را با یک سرور JSON-over-HTTP عوض کنید تا اکتورها بتوانند در فرایندهای جداگانه اجرا شوند.
  4. به‌ازای هر پیام یک اسپن OTel (یا ساختار ساده‌سازی‌شده‌ی معادل) متصل کنید. ویژگی‌های gen_ai.agent.name و gen_ai.operation.name را مطابق درس 23 صادر کنید.
  5. پست معماری AutoGen v0.4 را بخوانید. کد نمونه‌ی خود را به API واقعی autogen_core منتقل کنید. از چه نکاتی صرف‌نظر کرده بودید که در محیط عملیاتی واقعاً اهمیت دارند؟

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها معنای دقیق فنی
اکتور (Actor) «ایجنت» وضعیت اختصاصی + صندوق دریافت + هندلر؛ بدون حافظه‌ی مشترک
پیام (Message) «رویداد» محموله‌ی داده‌ای نوع‌دار؛ تنها روش تعامل اکتورها
صندوق دریافت (Inbox) «صندوق پستی» صف پیام‌های در انتظارِ هر اکتور
محیط اجرا (Runtime) «میزبان ایجنت» حلقه‌ی رویدادی که پیام‌ها را مسیریابی و خطاها را تفکیک می‌کند
تاپیک (Topic) «کانال» مسیر انتشار-اشتراکِ نام‌گذاری‌شده بین اکتورها
تفکیک خطا (Fault isolation) «بگذار کرش کند» از کار افتادن یک اکتور بقیه را متوقف نمی‌کند
RoundRobinGroupChat «تیم با نوبت چرخشی ثابت» ایجنت‌ها نوبت به نوبت و منظم پیش می‌روند
SelectorGroupChat «تیم با مسیریابی براساس بافتار» انتخاب‌کننده تعیین می‌کند چه کسی نوبت بعدی باشد
Magentic-One «تیم مرجع» تیم چندایجنت برای وب، کد و فایل‌ها

مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درستنها روش مجاز برای تعامل اکتورها با یکدیگر در AutoGen v0.4 چیست؟
  2. پیش از درسسه لایه API در AutoGen v0.4 کدامند؟
  3. حین درسچرا جداسازی تحویل پیام از پردازش آن باعث ایزوله‌سازی خطا (Fault Isolation) می‌شود؟
  4. حین درسکدام توپولوژی AgentChat نوبت ایجنت‌ها را با ترتیبی ثابت تغییر می‌دهد؟
  5. حین درسدر این درس Magentic-One به چه چیزی اشاره دارد؟
  6. پس از درسطبق این درس، وضعیت AutoGen v0.4 در اوایل سال 2026 چگونه اعلام شده است؟
  7. پس از درسکدام استاندارد مشاهده‌پذیری به‌طور پیش‌فرض توسط AutoGen v0.4 ارسال می‌شود؟

سؤالات متداول

مدل اکتور در سیستم‌های چندایجنت چه مزیتی نسبت به فراخوانی مستقیم دارد؟

در مدل اکتور حافظه‌ی مشترک وجود ندارد و ایجنت‌ها فقط از طریق صف پیام با هم تعامل می‌کنند. این تفکیک باعث می‌شود خطای یک ایجنت کل برنامه را متوقف نکند و همزمانی بدون قفل‌گذاری حافظه محقق شود.

لایه‌های سه‌گانه‌ی معماری AutoGen v0.4 چیستند؟

شامل Core (هسته‌ی سطح پایین مدل اکتور و مسیریابی رویدادها)، AgentChat (رابط سطح بالا و الگوهای تیمی مانند چرخش نوبتی) و Extensions (ابزارهای یکپارچه‌سازی با ارائه‌دهندگان مدل و حافظه).

تفاوت RoundRobinGroupChat با SelectorGroupChat در چیست؟

در الگوی اول ایجنت‌ها با ترتیبی ثابت و نوبتی صحبت می‌کنند، اما در الگوی دوم یک ایجنت انتخاب‌کننده بر پایه‌ی بافتار فعلی گفت‌وگو مشخص می‌کند چه کسی پیام بعدی را ارسال کند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.