فاز 16 · درس 10

چت گروهی و انتخاب گوینده در سیستم‌های چندایجنت

نوع
مفهومی و ساختنی
زمان
حدود 60 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 16 · 04 (مدل اولیه)
یک میز گرد بزرگ با چندین میکروفون که چراغ یکی از آن‌ها روشن است و نور به سمت آن متمرکز شده است
فهرست مطالب
  1. صورت مسئله
  2. مفهوم
  3. ساختار کلی
  4. سه حالت انتخاب‌کننده
  5. رابط برنامه‌نویسی ConversableAgent
  6. پایان گفت‌وگو
  7. شجره‌نامه: انشعاب‌ها و ادغام‌ها
  8. چه زمانی GroupChat مناسب است؟
  9. چه زمانی شکست می‌خورد؟
  10. مقایسه‌ی گفت‌وگوی گروهی و ناظر (Supervisor)
  11. پیاده‌سازی از صفر
  12. استفاده از ابزارهای واقعی
  13. بردن به محیط عملیاتی
  14. تمرین‌ها
  15. اصطلاحات کلیدی
  16. برای مطالعه‌ی بیشتر

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

الگوی چت گروهی (GroupChat) که ابتدا در AutoGen v0.2 مطرح شد و اکنون در انشعاب AG2 و Microsoft Agent Framework زنده مانده، ساختاری برای شکل‌گیری گفت‌وگوهای خودجوش میان ایجنت‌ها است. با یادگیری این مفهوم پایه، می‌توانید تعاملات تیمی انعطاف‌پذیری بسازید که در سناریوهای حل مسئله‌ی اکتشافی یا طوفان فکری عملکرد درخشانی دارند.

ارکستراسیون بر پایه‌ی گفت‌وگوی مشترک (Shared-conversation orchestration)، تعداد N ایجنت را در یک گفت‌وگوی واحد قرار می‌دهد؛ در این ساختار، یک تابع انتخاب‌کننده (مدل زبانی، نوبت‌گردشی یا منطق سفارشی) تعیین می‌کند چه‌کسی باید بعداً صحبت کند. این سازوکار، الگوی بنیادین گفت‌وگوهای چندایجنت خودجوش (Emergent) به شمار می‌آید؛ ایجنت‌ها جایگاه ثابتی در یک گراف ایستا ندارند، بلکه فقط به مخزن پیام‌های مشترک واکنش نشان می‌دهند. ابزارهای AutoGen GroupChat و AG2 GroupChat پیاده‌سازی‌های مرجع این الگو هستند: معناشناسی GroupChat در نسخه‌ی AutoGen v0.2 در قالب fork پروژه‌ی AG2 حفظ شد؛ در نسخه‌ی AutoGen v0.4 نیز این ساختار بر پایه‌ی یک مدل اکتور (Actor Model) رویدادمحور بازنویسی شد. مایکروسافت در فوریه‌ی 2026 پروژه‌ی AutoGen را به حالت نگهداری (Maintenance mode) برد و آن را با Semantic Kernel ادغام کرد تا Microsoft Agent Framework (نسخه‌ی RC در فوریه‌ی 2026) متولد شود. مفهوم بنیادین GroupChat هم در AG2 و هم در Microsoft Agent Framework باقی مانده است؛ آن را یک بار یاد بگیرید و همه‌جا به کار ببرید.

صورت مسئله

گراف‌های ایستا (مانند LangGraph) زمانی فوق‌العاده‌اند که جریان کاری کاملاً مشخص باشد. اما گفت‌وگوهای واقعی ایستا نیستند: گاهی برنامه‌نویس از بازبین سؤال می‌پرسد، گاهی از پژوهشگر و گاهی هم از نویسنده. هاردکد کردن تک‌تک حالت‌های دست‌به‌دست‌کردن (Handoff)، به انفجار یال‌های گراف ختم می‌شود. چیزی که نیاز دارید، واکنش ایجنت‌ها به یک مخزن پیام مشترک است، همراه با تابعی که تصمیم بگیرد چه‌کسی نوبت صحبت بعدی را دارد.

این دقیقاً همان کاری است که AutoGen GroupChat انجام می‌دهد.

مفهوم

ساختار کلی

              ┌─── shared pool ────┐
              │   m1  m2  m3  ...  │
              └─────────┬──────────┘
                        │ (everyone reads all)
      ┌───────┬─────────┼─────────┬───────┐
      ▼       ▼         ▼         ▼       ▼
    Agent A  Agent B  Agent C  Agent D  Selector
                                           │
                                           ▼
                                  "next speaker = C"

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

سه حالت انتخاب‌کننده

نوبت‌گردشی (Round-robin): چرخه‌ای ثابت و قطعی (Deterministic). با افزایش N به‌صورت خطی مقیاس‌پذیر می‌شود، اما زمینه (Context) را کاملاً نادیده می‌گیرد؛ مثلاً نوبت به برنامه‌نویس می‌رسد، حتی وقتی موضوع بحث بازبینی حقوقی است.

انتخاب با مدل زبانی (LLM-selected): یک فراخوانی مدل زبانی که پیام‌های اخیر مخزن را می‌خواند و بهترین گوینده‌ی بعدی را انتخاب می‌کند. نسبت به زمینه آگاه است ولی سرعت پایینی دارد؛ چون در هر نوبت، یک فراخوانی مدل زبانی اضافه می‌شود. این حالت، گزینه‌ی پیش‌فرض AutoGen است.

سفارشی (Custom): یک تابع پایتون با هر منطقی که مد نظرتان باشد. حالت رایج: انتخاب با مدل زبانی همراه با قواعد طرح پشتیبان (Fallback)؛ مثلاً: «همیشه بعد از برنامه‌نویس، نوبت را به مدل اعتبارسنج (Verifier) بده».

رابط برنامه‌نویسی ConversableAgent

agent = ConversableAgent(
    name="coder",
    system_message="You write Python.",
    llm_config={...},
)
chat = GroupChat(agents=[coder, reviewer, tester], messages=[])
manager = GroupChatManager(groupchat=chat, llm_config={...})

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

پایان گفت‌وگو

سه الگوی رایج برای پایان:

  • سقف دورها (Max rounds): محدودیت قاطع روی کل نوبت‌های گفت‌وگو.
  • توکن «TERMINATE»: ایجنت‌ها می‌توانند یک پیام نشانگر بفرستند؛ مدیر چت به‌محض مشاهده‌ی آن متوقف می‌شود.
  • بررسی رسیدن به هدف: یک مدل اعتبارسنج سبک در هر نوبت گفت‌وگو اجرا می‌شود و وقتی کار به پایان رسید، چت را می‌بندد.

شجره‌نامه: انشعاب‌ها و ادغام‌ها

در اوایل سال 2025، مایکروسافت بازنویسی بزرگی را روی AutoGen (نسخه‌ی v0.4) بر محور یک مدل اکتور رویدادمحور آغاز کرد. جامعه‌ی کاربری، معناشناسی GroupChat در نسخه‌ی AutoGen v0.2 را در قالب پروژه‌ی AG2 انشعاب داد (fork کرد) تا رابط برنامه‌نویسی‌ای که کاربران اولیه با آن کار کرده بودند حفظ شود.

در فوریه‌ی 2026، مایکروسافت اعلام کرد AutoGen به حالت نگهداری منتقل می‌شود و مدل اکتور رویدادمحور آن با Microsoft Agent Framework (نسخه‌ی RC در فوریه‌ی 2026، که اکنون با Semantic Kernel ادغام شده) یکی (merge) خواهد شد. مفهوم کلی GroupChat در هر دو مسیر حفظ شده، هرچند جزئیات پیاده‌سازی آن‌ها متفاوت است. برای کدهایی که باید با v0.2 سازگار باشند، AG2 پروژه‌ی بالادستی ارجح به شمار می‌رود.

چه زمانی GroupChat مناسب است؟

  • گفت‌وگوهای خودجوش: وقتی نمی‌خواهید گوینده‌ی بعدیِ هر مرحله را از قبل به‌صورت ثابت سیم‌کشی کنید.
  • وظایفی با تداخل نقش‌ها: برنامه‌نویس از پژوهشگر می‌پرسد، پژوهشگر از آرشیودار، و آرشیودار دوباره از برنامه‌نویس. فلو یک گراف جهت‌دار بدون دور (DAG) نیست.
  • حل مسئله‌ی اکتشافی: شرایطی مثل «جلسه‌ی طوفان فکری»، نه «خط مونتاژ کارخانه».

چه زمانی شکست می‌خورد؟

  • نیاز به قطعیت کامل: انتخاب‌کننده‌ی مبتنی بر مدل زبانی ممکن است رفتار متناقض نشان دهد؛ پرامپت یکسان در اجراهای مختلف گویندگان متفاوتی برمی‌گزیند.
  • آبشار تملق و دنباله‌روی (Sycophancy cascades): ایجنت‌ها تسلیم نظر کسی می‌شوند که با اعتمادبه‌نفس بیشتری صحبت کرده است. باید در پرامپت‌ها صراحتاً جلوی این کار را بگیرید.
  • باد کردن زمینه (Context bloat): هر ایجنت تک‌تک پیام‌ها را می‌خواند؛ بعد از 10 نوبت، حجم کانتکست بسیار سنگین می‌شود. برای مدیریت دامنه‌ی دید ایجنت‌ها، از تصویر کردن (Projection) (درس 15) استفاده کنید.
  • گوینده‌ی غالب (Hot speaker): یک ایجنت بر کل گفت‌وگو مسلط می‌شود، چون انتخاب‌کننده مدام تخصص‌های آن را ترجیح می‌دهد. باید توازن نوبت‌ها را به عنوان یک معیار در تابع انتخاب‌کننده بگنجانید.

مقایسه‌ی گفت‌وگوی گروهی و ناظر (Supervisor)

عناصر بنیادین هر دو یکسان است، ولی پیش‌فرض‌های متفاوتی دارند:

  • ناظر: یک ایجنت برنامه‌ریزی می‌کند و بقیه اجرا می‌کنند. انتخاب‌کننده یعنی: «از ایجنت برنامه‌ریز بپرس قدم بعدی چیست».
  • گفت‌وگوی گروهی: همه‌ی ایجنت‌ها هم‌سطح (Peer) هستند؛ انتخاب‌کننده تابعی است که روی مخزن پیام‌های مشترک تصمیم می‌گیرد.

هر دو از چهار عنصر بنیادین درس 04 استفاده می‌کنند. گفت‌وگوی گروهی به‌طور پیش‌فرض از ارکستراسیون مبتنی بر مدل زبانی و وضعیت مشترک در کل مخزن پیام بهره می‌گیرد.

انتخاب گویندهچه کسی بعدی صحبت می‌کند
SPEAKER SELECTIONAgents react to one shared pool instead of a fixed graph. A selector — round-robin, an LLM, or a custom rule — picks who speaks next, so the token hops between candidates and settles on one. This avoids the edge explosion of hardcoding every possible handoff between N agents.مشترکاستخرAABBCCDDEEانتخاب‌گر گوینده بعدی را برمی‌گزیندتوکن مسیر A→B→C→D→E را می‌پیماید و روی گوینده منتخب می‌نشیند
ایجنت‌ها به‌جای یک گراف ثابت، به یک استخر مشترک واکنش نشان می‌دهند. یک انتخاب‌گر — نوبتی (round-robin)، یک LLM، یا یک قانون سفارشی — تعیین می‌کند چه کسی بعدی صحبت کند؛ بنابراین توکن بین نامزدها گام لغزش برمی‌دارد و روی یکی تثبیت می‌شود. این کار از انفجار یال‌ها در کدنویسیِ صریحِ تمام حالت‌های دست‌به‌دست‌کردن بین N ایجنت جلوگیری می‌کند.

پیاده‌سازی از صفر

فایل code/main.py یک GroupChat را از صفر و صرفاً با استفاده از کتابخانه‌ی استاندارد پایتون پیاده‌سازی می‌کند: سه ایجنت (برنامه‌نویس، بازبین و مدیر)، نسخه‌های نوبت‌گردشی و مبتنی بر مدل زبانی، و پایان با توکن TERMINATE.

این دمو، متن گفت‌وگو را به همراه ردگیری محاسبات (Trace) تصمیمات انتخاب‌کننده برای هر دو حالت نمایش می‌دهد.

اجرا:

python3 code/main.py

استفاده از ابزارهای واقعی

فایل outputs/skill-groupchat-selector.md یک تابع انتخاب‌کننده‌ی GroupChat را برای وظیفه‌ای مشخص پیکربندی می‌کند: انتخاب بین حالت نوبت‌گردشی، مبتنی بر مدل زبانی یا سفارشی، و این‌که چه ورودی‌هایی (پیام‌های اخیر، تخصص ایجنت‌ها، تعداد نوبت‌ها) به انتخاب‌کننده داده شود.

بردن به محیط عملیاتی

چک‌لیست:

  • سقف حداکثر دورها: همیشه این سقف را بگذارید؛ معمولاً 10 تا 20 دور برای کارهای معمولی کافی است.
  • معیار توازن گویندگان: تعداد نوبت‌های هر ایجنت را رصد کنید و اگر ناترازی از یک آستانه (Threshold) فراتر رفت، هشدار دهید.
  • توکن پایان: کلمه‌ی TERMINATE یا یک ایجنت اختصاصی در نقش مدل اعتبارسنج تعیین کنید.
  • تصویر کردن یا حافظه‌ی محدود به دامنه: بعد از حدود 10 پیام، برای جلوگیری از باد کردن زمینه، فقط یک دید متناسب با دامنه به هر ایجنت بدهید.
  • ثبت لاگ تصمیمات انتخاب‌کننده: در روش‌های مبتنی بر مدل زبانی، هم ورودی‌های انتخاب‌کننده و هم انتخاب نهایی آن را لاگ کنید؛ وگرنه اشکال‌زدایی غیرممکن خواهد بود.

تمرین‌ها

  1. فایل code/main.py را اجرا کنید. روند گفت‌وگو را در حالت نوبت‌گردشی با حالت مدل زبانی مقایسه کنید. در هر حالت کدام ایجنت مسلط می‌شود؟
  2. یک قاعده‌ی «حداکثر دفعات صحبت برای هر ایجنت» به انتخاب‌کننده اضافه کنید. این تغییر چه تأثیری روی متن گفت‌وگو می‌گذارد؟
  3. یک شرط پایان مبتنی بر تحقق هدف پیاده کنید: وقتی بازبین کلمه‌ی «approved» را فرستاد، چت متوقف شود. این شرط چند وقت یک‌بار پیش از رسیدن به سقف دورها فعال می‌شود؟
  4. مستندات پایدار AutoGen درباره‌ی GroupChat را در آدرس (https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/design-patterns/group-chat.html) بخوانید. انتخاب‌کننده‌ی پیش‌فرضی را که GroupChatManager به کار می‌برد شناسایی کنید.
  5. مخزن AG2 را در آدرس (https://github.com/ag2ai/ag2) بررسی کرده و GroupChat نسخه‌ی v0.2 آن را با نسخه‌ی رویدادمحور v0.4 مقایسه کنید. نسخه‌ی v0.4 دقیقاً چه ویژگی عینی و ملموسی (نرخ پردازش، تحمل خطا، ترکیب‌پذیری) را اضافه می‌کند؟

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

اصطلاح باور عمومی معنای دقیق فنی
GroupChat «حضور ایجنت‌ها در یک اتاق گفت‌وگو» مخزن پیام مشترک به اضافه‌ی یک تابع انتخاب‌کننده؛ از مفاهیم بنیادین AutoGen و AG2.
انتخاب گوینده (Speaker selection) «تعیین این‌که چه‌کسی حرف بزند» تابعی که ایجنت بعدی را برمی‌گزیند؛ نوبت‌گردشی، مبتنی بر مدل زبانی، یا سفارشی.
GroupChatManager «میزبان جلسه» مؤلفه‌ای در AutoGen که انتخاب‌کننده را در بر دارد و روی نوبت‌های گفت‌وگو حلقه می‌زند.
ConversableAgent «ایجنت پایه» کلاس پایه‌ی AutoGen؛ ایجنتی که توانایی ارسال و دریافت پیام را دارد.
توکن پایان (Termination token) «کلمه‌ی ایست» رشته‌ای نشانگر (معمولاً TERMINATE) که به چت پایان می‌دهد.
گوینده‌ی غالب (Hot speaker) «تسلط یک ایجنت بر بحث» یک حالت شکست که در آن انتخاب‌کننده مدام همان ایجنت قبلی را انتخاب می‌کند.
باد کردن زمینه (Context bloat) «رشد بی‌رویه‌ی مخزن پیام» هر ایجنت تمام پیام‌های پیشین را می‌خواند؛ حجم کانتکست با نوبت‌های گفت‌وگو رشد می‌کند.
تصویر کردن (Projection) «نمای محدود به دامنه» ایجاد نمای ویژه‌ی نقش از مخزن پیام‌های مشترک برای جلوگیری از باد کردن زمینه.

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

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

الگوی GroupChat چه تفاوتی با الگوی ناظر (Supervisor) دارد؟

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

انتخاب‌کننده‌ی گوینده (Speaker Selector) در چت گروهی چگونه کار می‌کند؟

این انتخاب‌کننده می‌تواند به شکل نوبت‌گردشی (Round-robin)، مبتنی بر تصمیم یک مدل زبانی (LLM-selected) یا یک تابع پایتونی سفارشی باشد که بر اساس پیام‌های اخیر یا قواعد مشخص، گوینده‌ی بعدی را برمی‌گزیند.

چگونه می‌توان از باد کردن زمینه (Context Bloat) در چت‌های گروهی جلوگیری کرد؟

با تنظیم سقف مشخص برای حداکثر دورهای مکالمه (Max rounds) و استفاده از تصویر کردن (Projection) جهت محدود کردن دید هر ایجنت به پیام‌های مرتبط با نقش خودش.

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

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