הקשר כלים ומטמון הנחיות
שני דברים נכונים לגבי כל בקשה שהרתמה המובנית שולחת: הגדרות הכלים הן העלות הקבועה הגדולה ביותר בה, וכמעט אף אחת מהן לא תשמש. העמוד הזה מסביר מה Control Center עושה בנוגע לכך, ולמה התשובה אינה פשוט „לשלוח פחות כלים”.
הבעיה היא קשב, לא בייטים
קטע בשם “הבעיה היא קשב, לא בייטים”Control Center רושם כ־126 כלים. כשהם נשלחים במלואם, ההגדרות שלהם עולות בערך 23,000 אסימונים בכל בקשה — עלות ששום דחיסה לא יכולה לגעת בה, מפני שהגדרות הכלים נוסעות בחלק של הבקשה הנפרד מהשיחה.
חשבון האסימונים הוא התלונה המובנת מאליה, ועם מטמון הנחיות הוא גם הבעיה הקטנה יותר. העלות האמיתית היא דיוק הבחירה. הערכות שפורסמו בנושא קריאה לכלים מסכימות שמודלים בוחרים את הכלי הנכון באופן מהימן עד לאזור של 30–50 כלים בהקשר, ומתדרדרים בהדרגה מעבר לכך. הסיבה הנקובה אינה מספר האסימונים אלא חפיפה סמנטית: ברגע שקטלוג מכיל כמה כלים שתיאוריהם נקראים דומה, המודל בוחר בין דומים־מראה במקום להיזכר ביכולת.
עם 126 כלים, סוכן נמצא הרבה מעבר לטווח הזה בכל תור ותור — כולל התורים הרבים שבהם הוא רק היה צריך לקרוא קובץ.
המשטח הדו־שכבתי
קטע בשם “המשטח הדו־שכבתי”הרצה מוצגת אפוא שני דברים:
- קבוצה תושבת — כשני תריסר כלים, הנשלחים עם סכימות מלאות בכל בקשה;
- מדד שמות של כל השאר, מקובץ תחת כותרות כמו „Tickets and projects” או „Memory and knowledge”, בעלות של כמה מאות אסימונים עבור הקטלוג כולו.
כשמודדים על הקטלוג הנוכחי, זה מעביר את בלוק הכלים מ־~23.1k אסימונים ל־~5.0k, כ־78% פחות, ומכניס את הקבוצה הנראית תמיד לתוך הטווח שבו הבחירה מהימנה.
הקבוצה התושבת היא הכלים שהרצה משתמשת בהם ברוב ההרצות: אוצר המילים של קבצים ומעטפת (read, write, edit, search, bash, …), כלי הגילוי, רשימת המשימות, חיפוש בזיכרון, וכל פועל שהמצב הנוכחי חייב לקרוא לו כדי למסור את הפלט שלו. הפועל של המצב עצמו תמיד תושב — הרצה לעולם אסור שתצטרך לחפש את הקריאה האחת שמפיקה את התוצר שלה.
טעינה לפי דרישה אינה חוסר זמינות
קטע בשם “טעינה לפי דרישה אינה חוסר זמינות”זה החלק שהופך את התכנון לבטוח ולא רק לזול. ניתן לקרוא לכלי שנטען לפי דרישה כבר מהתור הראשון. רק הסכימה שלו לא נשלחת.
הסוכן רואה את השם בהנחיה שלו. אם הוא קורא לשם הזה ישירות, הרתמה טוענת את הסכימה ומריצה את הכלי באותו צעד — בלי שגיאה, בלי סבב הלוך ושוב. המודל לא צריך לדעת שהכלי אי פעם היה „לא טעון”.
כשהסוכן מכיר את המשימה אבל לא את השם, search_tools מקבל תיאור בשפה חופשית („להקצות כרטיס למישהו”), מדרג את כל המשטח של ההרצה, ומחזיר את ההתאמות כשהסכימות שלהן כבר טעונות, כך שהתור הבא ממש יכול לקרוא לאחת מהן. אם חיפוש לא מוצא דבר, הוא אומר זאת בפשטות ומציע ניסוח אחר או חיפוש רחב יותר — במכוון, מפני שסוכן שמפרש חיפוש ריק כ„היכולת הזו אינה קיימת” ימציא תחליף במקום לחפש שוב.
search_tools קיים רק ברתמה המובנית. ללקוחות MCP חיצוניים יש במקום זאת את search_tool_bm25, שמדרג את אותו מדד אבל רק מתאר את ההתאמות — הלקוחות האלה כבר קיבלו כל סכימה מ־tools/list, כך שאין מה לטעון.
מה שטעינה לפי דרישה לא עושה לעולם
קטע בשם “מה שטעינה לפי דרישה לא עושה לעולם”טעינה לפי דרישה מוחלת אחרי סינון הכלים של המצב, ולעולם לא במקומו. היא מסתירה סכימה; היא לא יכולה לחשוף כלי שהמצב חסם. כלי שהופעל עדיין עובר את בקשת האישור ואת מעקות הבטיחות של הפעולות בדיוק כפי שכלי תושב היה עובר, וכלי לא יכול לטעון שם שלא היה על משטח ההרצה מלכתחילה.
משטח ה-MCP שלקוחות חיצוניים רואים אינו מושפע. tools/list עדיין מחזיר את הקטלוג המלא. ניסיון מוקדם לקצץ אותו שבר את הסוכנים לחלוטין: לקוחות MCP מאמתים שמות כלים מול הרשימה המטמונת שלהם ומסרבים לכל דבר שלא מופיע בה בלי לשאול את השרת בכלל, כך שכלי „מוסתר אבל קריא” היה פשוט בלתי נגיש. טעינה לפי דרישה חיה ברתמה, שם טעינת כלי באמצע הרצה היא משהו שהרתמה באמת יכולה לעשות.
כיבויו
קטע בשם “כיבויו”--tool-deferral=off (או CC_SERVER_TOOL_DEFERRAL=off) מחזיר להיות תושב כל כלי שהתקבל, ומייצר בדיוק את הבקשות שהשרת שלח לפני שטעינה לפי דרישה הייתה קיימת. ראו את תיעוד ה-CLI של cc_server.
מטמון הנחיות
קטע בשם “מטמון הנחיות”עומסי העבודה של סוכנים אינם מאוזנים: הם שולחים הנחיות עצומות ומקבלים תשובות קטנות, תור אחר תור, עם אותה קידומת בכל פעם. הספקים מטמינים את הקידומת הזו, וקריאה מהמטמון עולה בערך עשירית מקריאה טרייה. שיעור הפגיעות במטמון הוא אפוא תכונה ממדרגה ראשונה של הרתמה ולא אופטימיזציה — וב-Anthropic הוא גם קונה תפוקה, מפני שאסימונים שנמצאים במטמון לא נספרים במגבלת הקלט לדקה.
המטמון עובד לפי התאמת קידומת מדויקת, ומכאן כלל מנחה אחד.
לעולם לא לשכתב את מה שכבר נשלח
קטע בשם “לעולם לא לשכתב את מה שכבר נשלח”כל בייט שמשתנה מבטל את המטמון מאותה נקודה והלאה. לכן הרתמה רק מוסיפה בסוף: הודעות חדשות בסוף, וסכימות כלים שהופעלו זה עתה אחרי בלוק הכלים שנמצא במטמון ולא ממוזגות לתוכו. הסדר הזה הוא הסיבה שההפעלה זולה — הקידומת שבמטמון נשארת זהה וההרצה משלמת רק על הסכימות שהיא זה עתה טענה.
הלולאה גם מקצצת פלט כלים מיושן מתורים ישנים יותר כדי להחזיר הקשר. היא ממתינה עד שיש מספיק להחזיר כדי שהשכתוב יהיה שווה, כך שקיצוץ הוא שכתוב עמוק ונדיר במקום החמצת מטמון מתמשכת.
היכן ממוקמות נקודות השבירה
קטע בשם “היכן ממוקמות נקודות השבירה”ספק מאפשר מספר מוגבל של סמני מטמון, ו-Control Center מוציא אותם במכוון:
| סמן | מכסה | זמן חיים |
|---|---|---|
| הכלי התושב האחרון | בלוק הכלים | שעה אחת |
| בלוק המערכת האחרון | כלים + הנחיית מערכת | שעה אחת |
| זנב התור הקודם | היסטוריה עד הבקשה האחרונה | 5 דקות |
| זנב התור הנוכחי | ההיסטוריה המלאה | 5 דקות |
שני האחרונים הם זוג מתגלגל, והסיבה לזוג היא עדינה: חיפוש במטמון מחפש אחורה מספר מוגבל של בלוקים אחר משהו שבקשה קודמת שמרה. תור בודד שמריץ הרבה כלים במקביל יכול לפלוט יותר בלוקים מהחלון הזה, ואז סמן זנב אחד מפספס בשקט והבקשה משלמת מחיר מלא בלי שדבר בתשובה יאמר זאת. סימון הנקודה המדויקת שבה הבקשה הקודמת נעצרה הופך את הפגיעה למבנית במקום למרוץ.
הקידומת של כלים ומערכת מקבלת את זמן החיים הארוך מפני שהיא קבועה לכל אורך ההרצה, משותפת לכל הרצה ותת־סוכן בעלי אותה צורה, ומפני שהשעון מתחיל כשבקשה מתחילה — תור שזורם במשך כמה דקות כבר בילה את רובו של חלון קצר לפני שהבקשה הבאה נוצרת.
תת־סוכנים חולקים קידומת אחת
קטע בשם “תת־סוכנים חולקים קידומת אחת”תת־סוכנים מאותו סוג מפיקים קידומות הנחיה זהות בייט אחר בייט, ולכן הם אמורים לקרוא רשומת מטמון אחת במקום שכל אחד יכתוב משלו. אבל רשומה נעשית קריאה רק כשהבקשה שכתבה אותה מתחילה להשיב, כך שפיזור שמשוגר בבת אחת גורם לכל ילד לשלם את הפרמיה על קידומת שכולם חולקים.
הרתמה נותנת לילד הראשון בעל צורה נתונה להתחיל, ואז משחררת את אחיו ברגע שהוא מתחיל לזרום. ההמתנה מוגבלת: ילד ראשון איטי עולה פגיעת מטמון, ולעולם לא את הפיזור עצמו. מאותה סיבה, כל תת־סוכן מקבל את אותה קבוצת כלים תושבת בלי קשר לפרופיל שלו — שינוי שלה לפי פרופיל היה מפצל את הקידומת המשותפת בלי שום רווח, מפני שהפרופיל כבר הכריע מה הילד רשאי לקרוא.
לראות את זה עובד
קטע בשם “לראות את זה עובד”שני החצאים ניתנים לצפייה ולא מונחים כהנחה:
- סייר ההקשר בשיחה מדווח על הכלים התושבים, על מדד הטעינה לפי דרישה ועל מה שכל סכימה שלא נשלחת הייתה עולה, ונבנה מאותו מסלול קוד שהרצה אמיתית משתמשת בו.
- כל הרצה מתעדת אילו כלים שנטענים לפי דרישה היא טענה ומה הפעיל אותם, כך שחיפוש שלא מוצא דבר נראה כהחמצת שליפה במקום להיעלם אל תוך סוכן שעושה בשקט משהו סמוך.
- מסך הניטור מדווח על שיעור מטמון כיחס בין קריאות מטמון לכלל אסימוני ההנחיה שעובדו, כולל כתיבות למטמון — הרצה שממשיכה לבנות מחדש את הקידומת שלה מקבלת ציון נמוך, במקום ציון של הרצה שמעולם לא נזקקה למטמון.