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

מסוכן אחד למערכת של סוכנים

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

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

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

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

הדפוס הנפוץ ביותר: סוכן מתאם (orchestrator) מפרק את המשימה ומחלק חלקים לסוכני "עובדים" מתמחים, כל אחד עם תפקיד, הקשר וסט כלים משלו. המתאם לא בהכרח עושה את העבודה בעצמו — התפקיד שלו הוא לתכנן, לחלק ולאחד.

מבחינה טכנית, העובדים הם בדרך כלל subagents: המתאם מפעיל אותם כמו שראינו בפרק 4, רק שכאן כמה מהם רצים במקביל, וכל התכנון של המערכת בנוי סביב החלוקה הזו.

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

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

Pipeline: שרשרת סוכנים שבה כל אחד מקבל את הפלט של הקודם, מבצע את החלק שלו ומעביר הלאה — למשל סוכן שאוסף מידע, סוכן שמנתח אותו וסוכן שכותב דוח. אין מתאם מרכזי; הסדר קבוע מראש, בדומה ל-prompt chaining מפרק 3, רק שכל שלב הוא סוכן ולא קריאה בודדת.

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

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

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

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

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

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

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

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

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

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

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

מתי לא כדאי מערכת רב-סוכנית

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

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

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