תזמור רב-סוכנים (Multi-Agent Orchestration)

במה זה שונה מ-Subagents

בפרק 3 ראינו subagent: הורה שמאציל משימה ממוקדת לילד, מחכה שהוא יסיים, ומקבל תקציר בחזרה — יחס היררכי, חד-כיווני ולרוב טורי מנקודת המבט של ההורה. תזמור רב-סוכנים הוא משהו אחר: כמה agents שרצים כעמיתים (peers), לא בהכרח ביחסי הורה-ילד, שיכולים לתקשר ישירות זה עם זה או דרך רכיב מתאם משותף, ולעיתים קרובות במקביל ממש — לא רק "מחכים בתור".

ההבדל המעשי: subagent הוא כלי לפירוק משימה אחת פנימה (ההורה שולט בכל התהליך), בעוד תזמור רב-סוכנים עוסק בכמה תהליכי עבודה עצמאיים-יחסית שצריכים להתקדם יחד לקראת מטרה משותפת או חלקית-משותפת.

תרשים המחולק לשני חלקים: משמאל עץ היררכי כחול עם צומת הורה עליון וחצים חד-כיווניים יורדים לשלושה צמתים תחתונים. מימין רשת כתומה של חמישה צמתים ללא היררכיה ברורה, מחוברים זה לזה בקווים דו-כיווניים במספר כיוונים — ממחיש את ההבדל בין יחס הורה-ילד היררכי לרשת עמיתים.
Subagent הוא יחס היררכי הורה-ילד; תזמור רב-סוכנים הוא רשת עמיתים ללא היררכיה קבועה

טופולוגיה 1: Coordinator ועובדים מתמחים

דפוס נפוץ: agent אחד משמש "מתאם" (coordinator/manager) שמפרק את המשימה הכוללת ומחלק חלקים ל-agents "עובדים" מתמחים — כל אחד עם תפקיד, הקשר וסט כלים ממוקדים משלו. המתאם לא בהכרח מבצע עבודה בעצמו; תפקידו הוא לתזמן, לחלק ולאסוף.

הדמיון ל-subagents ברמת המנגנון (הפעלת agent נפרד עם משימה ממוקדת) הוא לא מקרי — coordinator/worker לרוב בנוי מהמנגנון הטכני של subagents, רק שהעובדים יכולים לרוץ במקביל זה לזה ולתקשר דרך המתאם, ולא רק אחד אחרי השני בטור.

תרשים המציג צומת מתאם מרכזי (עיגול עם נקודה) עם שלושה חצים כחולים יוצאים ממנו אל שלושה עובדים מסביב, וחצים כתומים מקווקווים חוזרים מכל עובד בחזרה למתאם — ממחיש דפוס hub-and-spoke שבו המתאם מפזר משימות ואוסף תוצאות מעובדים מתמחים.
Coordinator/worker: המתאם מפזר משימות לעובדים מתמחים שרצים במקביל, ואוסף את התוצאות בחזרה

טופולוגיה 2: Pipeline ותקשורת חופשית בין עמיתים

דפוס אחר: pipeline — סדרת agents שכל אחד מקבל את הפלט של הקודם לו כקלט, מבצע את חלקו, ומעביר הלאה (למשל agent אחד שאוסף מידע, השני שמנתח אותו, השלישי שכותב דוח). אין כאן מתאם מרכזי — כל שלב פשוט יודע מי בא לפניו ואחריו.

דפוס פחות נפוץ אך אפשרי: תקשורת חופשית בין עמיתים (peer-to-peer), שבה agents שולחים הודעות זה לזה ישירות לפי הצורך, בלי היררכיה קבועה מראש — גמיש יותר, אך גם קשה משמעותית לעקוב אחריו ולדבג כשמשהו משתבש.

תרשים המחולק לשני חלקים: משמאל שלושה עיגולים כחולים בשרשרת ישרה עם חצים חד-כיווניים ביניהם (pipeline). מימין חמישה עיגולים כתומים מחוברים זה לזה בדפוס חופשי וחסר סדר קבוע (תקשורת חופשית בין עמיתים).
Pipeline: שרשרת ליניארית שבה כל שלב מעביר לבא אחריו; לעומת תקשורת חופשית בין עמיתים ללא סדר קבוע

האתגר המרכזי: מצב משותף ועבודה כפולה

מעבר מ-agent בודד לכמה agents שפועלים יחד מוסיף בעיה שלא קיימת כלל בלולאה אגנטית יחידה: כמה מקורות פעולה עצמאיים עלולים לגעת באותו משאב בו-זמנית (למשל שני agents שעורכים את אותו קובץ), לבצע את אותה עבודה פעמיים בלי לדעת אחד על השני, או להגיע למסקנות סותרות שמישהו צריך ליישב.

אין פתרון אחד גורף — אבל דפוסים נפוצים כוללים: חלוקת עבודה מראש כך שלכל agent יש תחום אחריות בלעדי (למשל קבצים/תיקיות נפרדות), ושלב "איחוד" מפורש בסוף (ע"י המתאם או agent ייעודי) שמזהה ופותר סתירות בין תוצרים, במקום להניח שהם יתאחדו מעצמם.

תרשים המחולק לשני חלקים: משמאל שני עיגולים כתומים ששניהם מצביעים בחץ אל אותה תיבת משאב יחידה, עם סימן אזהרה '!' מעליה — קונפליקט. מימין שני עיגולים כחולים, כל אחד מצביע אל תיבת משאב נפרדת משלו, ללא חפיפה כלל — הפתרון.
שני agents שנוגעים באותו משאב מייצרים קונפליקט; חלוקה לתחומי אחריות בלעדיים ונפרדים פותרת זאת

דוגמה מלאה: כמה סוכנים סוקרים קוד במקביל

נניח משימה: "סקור את כל הפרויקט ומצא בעיות". coordinator agent מחלק את הפרויקט לשלושה תחומי אחריות נפרדים (למשל: auth, API, ממשק משתמש) ומפעיל שלושה worker agents במקביל, כל אחד עם גישה לתיקייה שלו בלבד — כך שאין חפיפה ואין סיכון שנוגעים באותו קובץ בו-זמנית.

כל worker מחזיר רשימת ממצאים ממוקדת לתחום שלו. ה-coordinator מחכה שכל השלושה יסיימו, מאחד את הרשימות לדוח אחד, ומזהה אם יש חפיפה או סתירה בין ממצאים משני תחומים (למשל בעיה שנוגעת גם ל-auth וגם ל-API) — שלב שקוד לא יכול לבצע אוטומטית, כי הוא דורש שיפוט של מה בעצם חשוב ומה כפול.

TypeScript
async function reviewProject(areas: string[]) {
  const findings = await Promise.all(
    areas.map((area) => runWorkerAgent(area)) // רץ במקביל, כל worker בתיקייה משלו
  );

  return mergeCoordinatorReport(findings); // מזהה חפיפות/סתירות בין הממצאים
}