חנפנות
פלט model שמסכים בביטחון. מקורו ב-אימון: ה-model עוצב כך שיעדיף תשובות שבני אדם אוהבים, ובני אדם נוטים לאהוב הסכמה יותר מאשר לשמוע שטעו. לכן ה-model למד שהסכמה מתוגמלת — גם כשהיא שגויה.
מתבטא כך:
- כניעה ללחץ — חוזר בו מתשובה נכונה כשאומרים «אתה בטוח?».
- שבח לקלט גרוע — מסכים שהתוכנית השבורה שלכם מבריקה עוד לפני שניתח אותה.
- מסגור מוטה — הסקירה נוטה לחיוב כשאתם מציינים שכתבתם את הדבר, ולשלילה כשאתם אומרים שמישהו אחר כתב אותו. אותו תוצר, פסק דין שונה.
- חיקוי — מחזיר לכם את הטעויות שלכם כאישור.
בדיקה אבחונית: האם ה-model היה אומר זאת בלי הכוונה שלכם? אם הדבר היחיד שהשתנה היה הטון או המסגור שלכם, זו התחנפות ולא שינוי אמיתי בניתוח.
תיקון: הסתירו את העדפותיכם. נסחו prompts באופן ניטרלי — «סקור את הקוד הזה», לא «האם הקוד הזה טוב?».
הימנעו מ: שימוש ב«התחנפות» לכל תשובה שגויה שבמקרה מוצאת חן בעיניכם. בלי הבדיקה האבחונית, למונח אין ערך מעבר ל«שגוי».
שימוש:
«הוא אמר שתוכנית השכתוב שלי נראית נהדר, ואז שאלתי 'אתה בטוח?' והוא חזר בו לחלוטין.»
«התחנפות קלאסית — הוא הסכים קודם כי נשמעת בטוח, ואז נכנע כי נשמעת ספקן. איכות התוכנית לא השתנתה, הטון שלך השתנה. בצע ניקוי ושאל שוב בלי לרמוז לאף כיוון.»
הזיה
פלט model שבטוח בעצמו אך טועה. יש שני סוגים עם סיבות ופתרונות שונים:
| סוג | מה משתבש | סיבה | פתרון |
|---|
| נכונות עובדתית | עובדות מומצאות או שגויות על העולם — פונקציה שאינה קיימת, חתימת API שגויה, אסמכתה מזויפת | פערים ב-ידע הפרמטרי, לעיתים מעבר ל-מגבלת הידע | טענו את ה-ידע ההקשרי הנכון |
| נאמנות | הפלט סוטה מהידע ההקשרי שנטען, מהוראות המשתמש או מהנימוקים הקודמים של ה-model עצמו | התדרדרות קשב; מחמירה ב-אזור הטיפשות | בצעו ניקוי או compaction |
חיזוי הטוקן הבא מפיק פלט שוטף בין שהעובדה הבסיסית אמיתית ובין שלא — ל-model אין אות פנימי שמציין שאינו יודע, ולכן שיטה מומצאת מופיעה באותו סגנון בטוח כמו שיטה נכונה. קוד הזוי משכנע מטבעו: כך הייתה נראית ה-API אילו הייתה קיימת, וזה בדיוק מה שגורם לו לחמוק מסקירה שטחית ולהיכשל רק בהרצה.
צריך לדעת באיזה סוג מדובר, כי התיקון לאחד מחמיר את האחר. נכונות עובדתית משמעה שחסר ידע: הפתרון הוא הוספת context — תיעוד, הגדרות טיפוסים או הקובץ. נאמנות משמעה שהידע קיים אך מפסיד בתחרות על הקשב: הפתרון הוא הסרת context. אם מאבחנים בטעות בעיית נאמנות כבעיית נכונות עובדתית, מדביקים עוד תיעוד, שמגדיל את ה-context ומחמיר את הסטייה. כשה-agent טועה, בדקו אם המידע הנכון כבר היה ב-context לפני שתחליטו באיזו בעיה מדובר.
הימנעו מ: שימוש ב«הזיה» כמילה נרדפת סתמית ל«טעות» — בלי לציין את הסוג, למונח אין ערך אבחוני.
שימוש:
«הוא המציא שיטת `parseAsync` בסכמה.»
«נכונות עובדתית או נאמנות?»
«השיטה קיימת בתיעוד שהדבקתי — הוא פשוט הפסיק לקרוא אותו אחרי תור ארבעים.»
«אז זו בעיית נאמנות. בצעו compaction וטענו מחדש; אל תוסיפו עוד תיעוד.»
ידע פרמטרי
מה שהמודל ״יודע״ מתוך האימון, ושמאוחסן בפרמטרים שלו. הידע מוקפא בזמן האימון — המודל אינו יכול לראות את הפרמטרים שלו או לעדכן אותם. פרטים הולכים לאיבוד בדחיסה: מיליארדי עובדות נדחסות למספר קבוע של פרמטרים, והנדירות מיטשטשות. זהו מקור השטף שלו בנושאים נפוצים, ומקור ההמצאות בנושאים לא נפוצים. זהו הניגוד לידע הקשרי.
ידע פרמטרי אינו מאוחסן כעובדות. האימון אינו מספק למודל מסד נתונים לחיפוש; הוא מתאים את הפרמטרים עד שהמודל חוזה טקסט היטב, ומודל שחוזה היטב טקסט על נושא מתנהג כאילו הוא מכיר את הנושא. מידת האמינות של הידע תואמת את תדירות הופעתו בנתוני האימון: נושא שמופיעות בו מיליוני דוגמאות משוחזר במדויק; כשיש רק קומץ דוגמאות, המודל מנחש לפי מראה של נושאים דומים. שחזור וניחוש הם אותו תהליך מבחינת המודל, ולכן הוא אינו יכול להבחין איזו מהפעולות הוא מבצע. תשובה מומצאת מגיעה באותו שטף כמו תשובה נכונה. הזיה היא ניחוש שגוי של המודל.
גם ידע פרמטרי מתיישן. הפרמטרים מפסיקים להשתנות במועד חיתוך הידע, ולכן ספרייה שיצאה או שינתה את שמה אחרי התאריך הזה אינה קיימת בהם, ו-API שהשתנה זכור למודל בצורתו הישנה.
לשני הפערים — מידע נדיר מדי ומידע חדש מדי — יש אותו פתרון: אי אפשר להוסיף את הידע לפרמטרים, ולכן צריך לספק אותו כידע הקשרי במקום זאת.
שימוש:
״הוא כותב React ללא רבב אבל ממציא שיטות ב-SDK הפנימי שלנו.״
״React צפופה בידע הפרמטרי — מיליוני דוגמאות אימון. ה-SDK שלך אינו כזה, ולכן המודל משלים צורות שנראות סבירות. טען את תיעוד ה-SDK להקשר.״
מגבלת ידע
התאריך שממנו ואילך אין למודל ידע פרמטרי. ספריות, ממשקי API ואירועים שאחרי מועד החיתוך הם מלכודות של מידע מומצא, אלא אם התיעוד שלהם נטען כידע הקשרי. לכל גרסת מודל יש מועד חיתוך משלה.
מועד החיתוך נובע מאופן יצירת המודלים: האימון מטמיע תמונת מצב של טקסט בפרמטרים של המודל, ולאחר מכן הפרמטרים מוקפאים. המודל אינו יודע שלידע שלו יש גבול — כששואלים אותו על משהו שמאוחר ממועד החיתוך, הוא לא מסרב, אלא משליך מהדבר הקרוב ביותר שהוא כן מכיר. לכן המלכודת שקטה: קוד שנכתב לגרסה ישנה של ספרייה נראה סביר, ולעיתים קרובות אפילו מתקמפל, אך נכשל בחלקים שהשתנו.
הפתרון תמיד זהה: להכניס מידע עדכני להקשר. טען את יומן השינויים, הצבע על הגדרות הטיפוסים של הגרסה המותקנת או בקש מהסוכן לקרוא את התיעוד מהאינטרנט. כל מידע שנמצא בהקשר גובר על מה שאינו בפרמטרים.
שימוש:
״הוא ממשיך לכתוב תחביר של SDK v3 — אנחנו ב-v5.״
״v5 יצא אחרי מועד חיתוך הידע. טען את יומן השינויים של v5 כידע הקשרי, אחרת הוא ימשיך להמציא על סמך הגרסה הפרמטרית הישנה.״
ידע הקשרי
עובדות שה-agent יכול לקרוא ישירות מתוך ה-context כרגע — משימת המשתמש, קבצים שה-agent קרא, תוצאות כלים ותוכן AGENTS.md שנטען בתחילת session. המקביל של ידע פרמטרי: ידע פרמטרי נשלף מהזיכרון מתוך הפרמטרים; ידע הקשרי נקרא מתוך ה-חלון. הזיות נדירות הרבה יותר כשה-agent עובד מתוך ידע הקשרי — התשובה נמצאת מולו, לא נשלפת מזיכרון מטושטש.
מבין שני סוגי הידע, רק בידע הקשרי יש לכם שליטה. הפרמטרים קפואים, ולכן הדרך היחידה לתת ל-model ידע חסר — SDK פנימי, ספרייה ששוחררה לאחר מגבלת הידע, החלטה שהתקבלה אתמול — היא להכניסו ל-context. חלק גדול מעבודת כתיבת הקוד המעשית בעזרת AI מצטמצם לכך: הצגת העובדות הנכונות ל-model ברגע שהוא זקוק להן.
כשידע הקשרי וידע פרמטרי מתנגשים, הידע ההקשרי בדרך כלל מנצח. הדביקו את תיעוד ה-API הנוכחי וה-model פועל לפיו במקום לפי הזיכרון המיושן שלו על ה-API הישן — אף שהגרסה הישנה עדיין עלולה לחלחל, במיוחד עמוק בתוך session ארוך. אם ה-agent ממשיך לחזור לדפוס מיושן למרות שהתיעוד נטען, פירוש הדבר שהידע הפרמטרי דולף מעבר לידע ההקשרי; חזרה על התיקון או קירובו לעבודה עוזרים.
בניגוד לידע פרמטרי, שימוש בידע הקשרי עולה משהו. כל דבר שנטען לחלון צורך tokens ומתחרה על תקציב הקשב של ה-model, ולכן טעינה של עוד אינה בהכרח טובה יותר — המטרה היא העובדות הרלוונטיות בחלון, לא כל העובדות.
השתמשו במונח הזה רק כשמשווים אותו לידע פרמטרי; אחרת פשוט אמרו context.
הימנעו מ: «זיכרון עבודה» — ידע הקשרי הוא מה שנמצא בחלון כעת; מערכת זיכרון היא מה שמכניס אליו תוכן ממפגשים קודמים. אלה קני מידה שונים, אל תערבבו ביניהם.
שימוש:
«למה הוא מדייק ב-API כשאני מדביק את התיעוד, אבל ממציא אותו כשאינני עושה זאת?»
«כשהתיעוד בפנים, זה ידע הקשרי — הוא קורא מהדף. בלעדיו, הידע פרמטרי ונקודות הקצה הנדירות מיטשטשות.»
קשר קשב
בעת חיזוי כל אסימון, המודל מביא בחשבון כל אסימון אחר בהקשר — חלקם במידה רבה, ואחרים בקושי. הקשר בין שני אסימונים הוא יחס קשב, וזוגות משמעותיים (״her״ עם ״Sarah״, או קריאה ל-`getUser()` עם ההגדרה `function getUser`) משפיעים זה על זה יותר מאשר אסימונים שאינם קשורים. בהקשר של N אסימונים יש בערך N² יחסים.
בזוגות האלה טמונה ההבנה לכאורה של המודל. כשהוא פותר כינוי גוף, זה משום שיחס הקשב בין ״her״ ל-״Sarah״ חזק. כשהוא קורא לפונקציה עם הארגומנטים הנכונים, הקשר בין מקום הקריאה להגדרה שקרא קודם עושה את העבודה. שום דבר מזה אינו מאוחזר — כל היחסים מחושבים מחדש בכל בקשה לספק המודל, לכל זוג.
כדאי להתעכב על הנתון N², משום שהוא גדל מהר יותר מכפי שהאינטואיציה מצפה:
| גודל ההקשר | זוגות (~N²) |
|---|
| 1,000 אסימונים | ~1 מיליון |
| 10,000 אסימונים | ~100 מיליון |
| 100,000 אסימונים | ~10 מיליארד |
כל זוג מחושב גם יותר מפעם אחת. למודלים יש כמה ראשי קשב — המספרים המדויקים במודלי חזית אינם מפורסמים, אך חמישים עד מאה הם ניחוש סביר — וכל ראש מחשב גרסה משלו של כל יחס. לכן כל זוג שמופיע בטבלה לעיל משוכפל בכל ראש. מדובר בהרבה זוגות.
רק מספר קטן מהיחסים האלה חשוב למשימה נתונה. הזוג שבין ההוראה שלך לקוד שעליו היא חלה הוא אחד מקומץ שחשובים; כמעט כל השאר במאגר הם רעש. וגם שני הגדלים האלה גדלים בקצב שונה: מספר היחסים החשובים נשאר בערך קבוע, בעוד המאגר הכולל גדל ריבועית עם גודל ההקשר. ב-1,000 אסימונים, הזוג שחשוב לך הוא אחד למיליון; ב-100,000 אסימונים, הוא אחד לעשרה מיליארד. זה החשבון שמאחורי תקציב הקשב, והידרדרות הקשב היא התחושה שנוצרת כשהיחסים החשובים מקבלים חלק קטן מדי.
שימוש:
״הוא כל הזמן מבלבל בין שני סמלי `user` בהבדלים — נשמע שאנחנו באזור הטיפשות.״
״כן, יחס הקשב בין כל מקום קריאה להצהרה שלו מתחרה ביחס האחר — אותה צורת אסימון, קישור אחר. שנה שם לאחד מהם והזוגות יתחדדו.״
תקציב קשב
לכל token יש כמות סופית של השפעה שאפשר לחלק לשאר ה-context. השפעה חזקה על קשר אחד משאירה פחות לאחרים. התקציב הוא לכל token ואינו גדל כשה-context גדל, ולכן sessions ארוכים מדללים אותו.
חשבו על כך במונחי אות ורעש. ההנחיה שלכם היא אות בעוצמה קבועה; כל token אחר ב-חלון ה-context הוא צליל מתחרה. ההנחיה לעולם אינה נחלשת — היא עדיין שם, תו אחר תו — אבל ככל שה-context גדל, החדר סביבה נעשה רועש יותר ויחס האות לרעש יורד. הנחיה שהייתה הדבר החזק ביותר ב-10k tokens של context הופכת לזמזום רקע ב-150k. זהו המנגנון שמאחורי התדרדרות קשב: ה-model אינו שוכח; האות הולך לאיבוד בתוך הרעש.
התסמין נראה כאי־ציות — ה-agent הסכים למגבלה בתחילת הדרך ואחר כך סוטה ממנה, והדבקה מחדש של המגבלה מועילה רק לזמן קצר. הסיבה אינה ההנחיה; היא כל שאר הדברים בחלון שמתחרים איתה.
אפשר לשלוט במה שנכנס ל-context. תוכן שאינו משרת את המשימה אינו ניטרלי — הוא מוסיף רעש מעל כל מה שכן משרת אותה. שמרו על חלון קטן, בצעו ניקוי כשה-context המצטבר מפסיק להצדיק את עלותו, וחזרו על המגבלות החשובות במקום לסמוך על אזכור מוקדם שלהן.
שימוש:
«למה הוא ממשיך להתעלם מהסכמה שהדבקתי בראש המסמך?»
«אנחנו עמוק בתוך אזור הטיפשות — תקציב הקשב של כל token קבוע, אבל ה-context המשיך לגדול. האות של הסכמה מתחרה עכשיו באלפי tokens חדשים יותר.»
התדרדרות קשב
ככל ש-session גדל, תקציב הקשב של כל token מתחלק בין יותר מתחרים. האות של כל קשר משמעותי נחלש; רעש מ-context לא רלוונטי מצטבר. אותו model, אותם פרמטרים — פשוט יותר פיות להאכיל מאותה צלחת. זו הסיבה לאפקט אזור היעילות/אזור הטיפשות של אזור.
הדבר נראה כאילו ה-model נעשה גרוע באמצע ה-session: מגבלות ששמר עליהן במשך שעה מתחילות להתפספס, הוא שואל שוב דברים שכבר נאמרו לו וכותב קוד שמתעלם מקובץ שקרא קודם. שום דבר ב-model לא השתנה — המשתנה היחיד הוא כמות ה-context שהוא קשוב לה כעת.
ההתדרדרות הדרגתית, ולכן קשה לזהות אותה מתוך ה-session. אין שגיאה ואין סף; כל תור גרוע רק מעט מקודמו, וכשההחלקות נעשות ברורות כבר שהיתם זמן מה באזור הטיפשות.
מתאוששים באמצעות הסרת context, לא הוספת עוד. הדבקה מחדש של ההנחיה שהוזנחה מוסיפה מתחרה נוסף לאותו חלון צפוף ומועילה רק לזמן קצר. מה כן עובד: לבצע ניקוי ולטעון רק את מה שהמשימה צריכה, או לבצע compact, או להעביר ל-session חדש. התייחסו לירידה בציות להנחיות כסימן לאורך ה-context, לא לבעיה ב-model.
שימוש:
«הוא עמוק באזור הטיפשות — ממציא generics שלא קיימים בקובץ הטיפוסים.»
«התדרדרות קשב. הגדרות הטיפוסים עדיין ב-context, אבל האות שלהן קבור מתחת לכל מה שהוספנו מאז. נקו וטענו מחדש.»
אזור חכם
בתחילת session, ה-agent נמצא ב«אזור חכם» — חד, ממוקד וזוכר היטב. ככל שה-session מתארך, הוא נסחף ל«אזור טיפשי»: מרושל יותר, שוכח יותר, טועה יותר — וגם מייצר יותר הזיות נאמנות. אותו model, אותו harness — פשוט יותר context. זו התחושה של התדרדרות קשב. במודלים המתקדמים, אזור הטיפשות מתחיל לעיתים קרובות סביב 125K–150K tokens, אם כי על כך יש ויכוח. בצעו ניקוי או compaction כשה-session מתנפח; אל תנסו לדחוף הלאה.
הירידה הדרגתית, ולכן קל להחמיץ אותה. אין הודעת שגיאה ואין גבול נראה לעין; ה-agent פשוט מתחיל לפעול מעט פחות טוב, ואז באופן מורגש פחות טוב. סימנים נפוצים: הוא שוכח הנחיה שניתנה לפני עשרים תורות, חוזר על טעות שכבר תיקן או טוען בביטחון דבר שה-context סותר. מכיוון שההחלקה חלקה, התגובה הרגילה היא להמשיך ולהסביר מחדש — מה שמוסיף עוד context ומחמיר את הבעיה.
האזורים אינם קשורים למגבלת חלון ה-context. Session יכול להיות עמוק באזור הטיפשות כשרוב החלון עדיין פנוי: המגבלה היא הנקודה שבה ה-harness מסרב להמשיך, אך האיכות יורדת הרבה קודם. תכננו סביב האזור החכם, לא סביב החלון — התקציב המעשי למשימה הוא כמות ה-tokens שבתוכה ה-agent עובד היטב, לא כמות ה-tokens שהוא יכול להחזיק טכנית.
האזור החכם הוא תקציב, ועבודה שאינה קשורה למשימה צורכת ממנו. כל משימה ב-session משתמשת ב-tokens, ולכן התחלת משימה שנייה באותו session מתחילה קרוב יותר לאזור הטיפשות. משימה אחת בכל session מעניקה לכל משימה את החלק החד ביותר של ה-session. אם משימה אחת גדולה מאזור חכם אחד, חלקו אותה: בצעו העברת עבודה או compaction בגבול טבעי, ותנו ל-session חדש לבצע את החלק הבא.
שימוש:
«הוא הצליח בשלושת הרכיבים הראשונים ופשוט הרס את הרביעי.»
«יצאת מאזור היעילות — אותו model, פשוט עמוק עכשיו באזור הטיפשות. בצע compaction וטען מחדש את התוכנית; הרכיב הבא יצליח.»