چیتشیت
سیستمهای چندایجنت
Multi-Agent Systems
ایجنتها، تحویل وظیفه، وضعیت مشترک و هماهنگکنندهها. الگویی انتخاب کنید، رأیگیری کنید، چکپوینت بگیرید و خطاهای شناختهشده را حل کنید.
فهرست مطالب
چهار جزء سازنده
معماریهماهنگسازی ایجنتها
کار و کد| وظیفه | کد |
|---|---|
| به اشتراکگذاری استخر پیام | `state = SharedState()` then `state.append(<msg>)` |
| اجرای ترتیبی ثابت | StaticOrchestrator(<order>).run(team, state) |
| اجازه به ایجنت برای انتخاب بعدی | HandoffOrchestrator("<start>").run(team, state) |
| اجازه به انتخابگر برای انتخاب بعدی | LLMSelectorOrchestrator("<start>", round_robin_selector) |
| تحویل وظیفه با یک ابزار | def transfer_to_refunds() -> "Agent": return refund_agent |
| اجرای چت گروهی | run_groupchat(AGENTS, <selector>, max_rounds=8, label="<label>") |
| توزیع موازی ورکرها | threading.Thread(target=w.run, args=(sq, results, i)) |
| انتشار در یک موضوع | bb.publish("<writer>", "<topic>", "<content>", "<prompt>") |
رأیگیری، ماندگاری داده و محافظت
کار و کد| وظیفه | کد |
|---|---|
| شمارش آرا | plurality(votes) |
| وزندهی به آرا بر اساس اطمینان | cp_wbft(votes, threshold=0.5) |
| انتخاب بدون لیدر | decentllms(votes) |
| ذخیرهی یک چکپوینت | store.write(thread_id, super_step, dict(state)) |
| ادامهی کار پس از کرش | store.latest(thread_id) |
| اختصاص یک صف به ایجنت | AgentQueue("<agent_id>").enqueue(<msg>) |
| توقف طوفان تلاش مجدد | `if not breaker.allow(): ...` then `breaker.record(ok)` |
یک بار اجرای سرپرست (supervisor)
گامبهگام- لیدر
plan(query)کوئری را به چند پرسش فرعی تقسیم میکند. - لیدربرای هر پرسش فرعی، یک ترد
Workerآغاز میکند. - ورکرکار را از یک بافتار تازه با پرسشی مشخص و محدود شروع میکند.
- ورکریک
WorkerResultشامل خلاصه وtokens_spentمینویسد. - لیدرهمهی تردها را الحاق میکند. زمان واقعی کل معادل کُندترین ورکر است.
- لیدربا
synthesize(query, results)پاسخها را merge میکند. - لیدرمقادیر
wall_clock_seconds،total_tokensوworker_countرا گزارش میدهد.
حلقهی تحویل وظیفه (سبک Swarm)
کدpython
def run_swarm(start_agent: Agent, user_messages: list[str]) -> list[Msg]:
history: list[Msg] = []
active = start_agent # نگهدارندهی چت
for user in user_messages:
history.append(Msg(role="user", content=user))
out = scripted_router(active, user) # جایگزین LLM
if isinstance(out, Agent): # ابزاری که یک ایجنت برگرداند
history.append(
Msg(role="assistant", content=f"(handoff to {out.name})", sender=active.name)
)
active = out # تعویض ایجنت فعال
out = scripted_router(active, user)
history.append(Msg(role="assistant", content=str(out), sender=active.name))
return history # چیزی ذخیره نمیشود
رأیگیری وزندار بر اساس اطمینان
کدpython
def cp_wbft(votes: list[Vote], threshold: float = 0.5):
weights: dict[str, float] = {}
rep: dict[str, str] = {}
for v in votes:
key = v.canonical() # خوشهبندی پاسخهای یکسان
weights[key] = weights.get(key, 0.0) + v.confidence
rep.setdefault(key, v.answer)
total = sum(weights.values()) or 1.0
winner_key = max(weights, key=weights.get)
if weights[winner_key] / total < threshold:
return None, weights # بسیار ضعیف: تلاش مجدد یا ارجاع به بالاتر
return rep[winner_key], weights
انتخاب الگو
مفهومها- پایپلاین
- هر ایجنت داده را تبدیل کرده و انتقال میدهد. شکست در یک مرحله کل مراحل را مسدود میکند.
- توزیع موازی / تجمیع
- تقسیم بین ایجنتهای موازی و سپس merge. مناسب برای خردهوظایف مستقل.
- سرپرست (Supervisor)
- لیدر برنامهریزی میکند، تفویض مینماید و ترکیب میکند. برای وظایف ترتیبی اشتباه است.
- سلسلهمراتبی
- سرپرستها بالای سرپرستها. فقط برگها کار انجام میدهند.
- چت گروهی
- طرفهای ارتباط یک استخر مشترک دارند. انتخابگر گویندهی بعدی را برمیگزیند.
- تحویل وظیفه
- ایجنت فعال ابزاری را فراخوانی میکند که ایجنت بعدی را برمیگرداند.
- تختهسیاه (Blackboard)
- انتشار/اشتراک موضوعی. در تعداد بالای ایجنتها و اجراهای طولانی بهترین است.
- تکایجنتی
- زیر 20 فراخوانی ابزار و 100k توکن، از یک ایجنت استفاده کنید.
پیشفرضها در کد
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
max_steps | 10 | هر run هماهنگکننده |
max_rounds | 8 | سقف دمو چت گروهی |
TERMINATE | TERMINATE | توکنی که چت گروهی را خاتمه میدهد |
threshold | 0.5 | سهم پذیرش cp_wbft |
rounds | 2 | دورهای مناظره در توپولوژی گراف |
failure_threshold | 0.5 | مدارشکن بالای این نرخ خطا فعال (open) میشود |
window_size | 20 | نتایج مدارشکن در بازهی زمانی |
open_cooldown_s | 0.5 | ثانیههای قبل از وضعیت نیمهباز (half open) |
عیبیابی
عیبیابییک ایجنت در هر نوبت صحبت میکند
- علت
- گویندهی غالب در انتخابگر
- راهحل
- تعادل در نوبت صحبت به انتخابگر اضافه کنید
افزایش بافتار در هر نوبت گفتوگو
- علت
- همهی ایجنتها همهی پیامها را میخوانند
- راهحل
- به ایجنتها تصویرها (projections) اختصاص دهید
دو ایجنت مدام وظیفه را به هم واگذار میکنند
- علت
- حلقهی تحویل وظیفه
- راهحل
- مقدار
max_stepsرا روی هماهنگکننده محدود کنید
یک عدد اشتباه به همه منتقل میشود
- علت
- مسمومسازی حافظه در وضعیت مشترک
- راهحل
- منشأ و سندیت، فقط الحاق (append-only)، مدل اعتبارسنج فقط خواندنی
اکثریت با هم به خطا میروند
- علت
- تکمحصولی، مدل پایهی یکسان
- راهحل
- مدلهای پایه را ترکیب کنید
ورکرها در مورد هدف اشتباه تحقیق میکنند
- علت
- دریفت تقسیمبندی مدیر از هدف اصلی
- راهحل
- یک ورکر با پرسش قناری اضافه کنید
ورکرها اختلاف نظر دارند، یک طرف برنده میشود
- علت
- تعارض در ترکیب بیصدا
- راهحل
- دوباره بپرسید یا اختلاف نظر را گزارش دهید
بار بخشهای پایینی سیستم 10 برابر میشود
- علت
- طوفان تلاش مجدد
- راهحل
- مدارشکن، تعیین سقف برای تلاشهای مجدد
واژهنامه
اصطلاحها- BFT
- تحمل خطای بیزانس. تحمل خطای
f < n/3نود معیوب. - CP-WBFT
- الگوریتم BFT وزندار با آزمون ارزیابی اطمینان. رأیها بر اساس اطمینان وزندهی میشوند.
- MAST
- ردهبندی خطاها. مشخصات، هماهنگی، اعتبارسنجی.
- MARBLE
- بنچمارک چندایجنت. توپولوژیهای ستارهای، زنجیرهای، درختی و گرافی.
- Super-step
- ابرگام؛ واحد کار بین دو چکپوینت.
- الگوی اوتباکس
- ابتدا نیت اثر جانبی ثبت میشود. یک اجراکنندهی مجزا آن را اجرا میکند.
پرسش و پاسخ
پرسش و پاسخ- هزینهی سیستم چندایجنت چقدر است؟
- حدود 15 برابر توکنهای یک سیستم تکایجنتی.
- چرا مدل اعتبارسنج امکان نوشتن ندارد؟
- تا استخر مسموم نتواند آن را مسموم کند.
- چه آستانهای برای 5 تا 7 رأیدهنده مناسب است؟
- 0.5 تا 0.67. پایینتر از آن، ارجاع به بالاتر.
- ایجنتهای بیشتر یا مدلهای متفاوت؟
- مدلهای متفاوت. سه مدل مختلف بهتر از پنج نسخه از یک مدل عمل میکنند.
- رایجترین خطا چیست؟
- مشکلات مشخصات، 41.77٪ از خطاهای ردهبندی MAST.
نکات کاربردی
نکتهها- تنها بخش دارای وضعیت، وضعیت مشترک است. برای باگها اول آنجا را بررسی کنید.
- عمق سلسلهمراتب را روی 2 یا کمتر نگه دارید.
- دورهای مناظره را به 2 یا 3 محدود کنید.
- فراتر از حدود 4 ایجنت در یک گراف، مالیات هماهنگی افزایش مییابد.
- برای فراخوانیهای LLM از I/O غیرهمگام استفاده کنید. هر ترد حدود 1MB مصرف دارد.
- در هر فراخوانی اثر جانبی، یک کلید حذف تکراری (dedup) قرار دهید.