חלון ההקשר: למה צ'אט ארוך עם המודל פתאום "מאבד את החוט"
בדקתי שוב ושוב למה שיחות ארוכות עם מודלים מתחילות לשכוח דברים מההתחלה. התשובה היא מושג אחד ששווה להבין: חלון ההקשר. בואו נפרק אותו לגמרי.
מאת Yuval Avidaniקריאה בת 5 דק׳
"למה המודל זוכר מצוין את ההודעה האחרונה אבל שכח מה ביקשתי בהתחלה?" — את השאלה הזו אני שומע יותר מכל שאלה אחרת על מודלי שפה, והתשובה תמיד מובילה לאותו מקום: חלון ההקשר. מסתבר שברגע שמבינים את המושג הזה, פתאום המון התנהגויות מוזרות של המודל מקבלות הגיון מושלם.
בעיניי זה אחד המושגים שכל מי שעובד עם AI חייב להחזיק בראש, ולא בגלל שהוא מסובך — אלא בגלל שהוא מסביר את הגבולות. בואו נפרק את זה לאט.
אז מה זה בכלל "חלון הקשר"
נתחיל מהגדרה נקייה. חלון ההקשר (context window) הוא כמות הטקסט שהמודל "רואה" בבת אחת, שמחזיקה את כל מה שצריך כדי לייצר תשובה — עבור כל מי שמשתמש במודל.
ו"כל הטקסט" זה באמת הכל: הפרומפט שכתבנו (כלומר ההוראה ששלחנו), כל ההיסטוריה של השיחה עד עכשיו, וגם התשובה שהמודל מייצר ברגע זה ממש. הכל נדחס לאותו חלון אחד.
תחשבו על זה כמו שולחן עבודה. שולחן גדול = אנחנו רואים יותר מסמכים פרושים בבת אחת ויכולים להצליב ביניהם. שולחן קטן = רק כמה דפים נכנסים, והשאר חייב לרדת לרצפה. החלון הזה הוא בדיוק השולחן של המודל — וכל מה שלא נכנס עליו, פשוט לא קיים מבחינתו באותו רגע.
רגע, מה זה טוקן? כי בזה מודדים את החלון
לפני שנמשיך, חייבים להבין יחידת מידה אחת: טוקן. כי את גודל החלון לא מודדים במילים ולא בתווים — מודדים אותו בטוקנים.
המודל לא רואה אותיות כמו שאנחנו רואים. טוקן הוא פיסת מילה — לפעמים מילה שלמה, לפעמים חצי מילה, לפעמים רק סימן פיסוק — וזו היחידה הבסיסית שהמודל באמת קורא. המילה "שלום" יכולה להיות טוקן אחד, אבל מילה ארוכה או נדירה עשויה להישבר לשניים או שלושה טוקנים. בעברית, אגב, מילים נשברות ליותר טוקנים מאשר באנגלית — וזו אחת הסיבות שטקסט עברי "אוכל" יותר מהחלון.
הנה מנוע אמיתי. שחקו איתו: הקלידו משפט, ותראו בעיניים שלכם איך הוא נשבר לטוקנים. זו בדיוק הזווית שהמודל רואה ממנה את העולם.
מנוע אמיתי · נסו בעצמכם
הטוקנייזר: איך טקסט הופך לטוקנים
זה לא סרטון. כתבו כאן מה שתרצו — בעברית, באנגלית, מספרים, סימנים — ותראו איך הטקסט מתפרק לטוקנים, הפיסות הקטנות שהמודל באמת רואה. ==שימו לב: עברית מתפרקת לצפוף יותר מאנגלית — ולכן עולה יותר טוקנים.==
17 טוקנים42 תווים~2.5 תווים לטוקן
שלום!␣אני␣בונה␣סוכן␣AI␣עם␣Claude␣Sonnet␣5.
זה טוקנייזר להמחשה: מודלים אמיתיים משתמשים בשיטה ששמה BPE (Byte-Pair Encoding) שמאחדת צמדי אותיות נפוצים, אז החלוקה המדויקת שונה. אבל האינטואיציה זהה — מילה נפוצה = טוקן אחד, מילה נדירה מתפרקת לכמה, ורווחים וסימנים נספרים גם הם. בדיוק לפי המספר הזה משלמים על כל בקשה.
הקטע המדליק הוא שברגע שמבינים את זה, מבינים גם למה ספירת המילים שלנו לא תמיד מסתדרת עם מה שהמודל "מרגיש". הוא לא סופר מילים — הוא סופר טוקנים.
למה בכלל יש מגבלה? כאן נכנס ה-Transformer
עכשיו השאלה האמיתית: למה לא פשוט לתת לחלון להיות אינסופי? למה יש תקרה בכלל?
כדי לענות צריך להכיר שני מושגים. הראשון הוא Transformer — וזו הארכיטקטורה (כלומר המבנה ההנדסי) שעליה בנויים כמעט כל מודלי השפה המודרניים. תחשבו עליה כמו על תוכנית הקומות של בניין: היא קובעת איך המידע זורם בפנים.
המושג השני הוא הלב של ה-Transformer: מנגנון ה-attention. attention הוא המנגנון שבו כל טוקן "מסתכל" על כל שאר הטוקנים בחלון כדי להחליט מה רלוונטי עבורו. זו בעצם היכולת של המודל לשקלל הקשר — להבין שהמילה "הוא" בסוף המשפט מתייחסת לדמות שהוזכרה בהתחלה.
ופה טמונה הבעיה. אם כל טוקן צריך להסתכל על כל טוקן אחר, אז כשמכפילים את אורך החלון פי 2 — מספר ההצלבות לא גדל פי 2, הוא גדל פי 4. זה מה שקוראים לו גדילה ריבועית. כשמכפילים את אורך ההקשר פי 2, העלות בזיכרון ובחישוב גדלה בערך פי 4 — וזו הסיבה הפיזית שיש תקרה.
תחשבו על זה כמו שולחן עגול במסיבה. עם 4 אנשים יש קומץ שיחות אפשריות. עם 8 אנשים מספר השיחות מזנק הרבה מעבר לכפול. תוסיפו עוד כמה — וזה כבר בלגן בלתי נשלט. ה-attention הוא בדיוק זה: כל טוקן מנהל "שיחה" עם כל שאר הטוקנים, ולכן ההכפלה יקרה בטירוף.
נעצור רגע לבדוק שהבנו, כי זו הנקודה הכי חשובה בכתבה.
בדקו את עצמכם
למה כשמכפילים את אורך חלון ההקשר פי 2, העלות בחישוב ובזיכרון גדלה בערך פי 4?
מה קורה כשחורגים מהחלון
נניח שהשיחה ארוכה, ועברנו את התקרה. מה קורה אז? המודל לא קורס ולא מחזיר שגיאה אדומה — הוא עושה משהו שקט וערמומי יותר: הוא גוזר.
המונח המקצועי הוא truncation. truncation הוא גזירה — כשהשיחה חורגת מהחלון, החלקים הישנים ביותר (בדרך כלל ההתחלה) פשוט נחתכים החוצה כדי לפנות מקום לחדש. זה כמו שולחן עבודה מלא: כדי לשים דף חדש, אנחנו דוחפים דף ישן מהקצה והוא נופל לרצפה.
וזו בדיוק התשובה לשאלה שפתחתי בה. כשצ'אט ארוך "מאבד את החוט" ופתאום שוכח הנחיה שנתנו בהתחלה — לרוב לא קרה שום באג. פשוט ההתחלה נגזרה החוצה מהחלון. המודל לא "שכח" במובן האנושי — הוא פשוט כבר לא רואה את החלק הזה על השולחן.
בעיניי זו אחת התובנות הכי משחררות בעבודה עם AI: רוב ה"שכחות" המסתוריות הן לא תקלה — הן ניהול מקום.
מודלים מודרניים: שולחנות ענק (וגם להם יש מחיר)
הבשורה הטובה: החלונות גדלו דרמטית בשנים האחרונות. אם פעם דיברנו על אלפי טוקנים בודדים, היום מודלים מודרניים מחזיקים חלונות של מאות אלפי טוקנים, ויש כבר כאלה שמגיעים לסדר גודל של מיליון טוקנים. זה מספיק כדי להכניס ספר שלם, או בסיס קוד רחב, פנימה בבת אחת.
אבל — ופה אני נזהר — שולחן ענק הוא לא תמיד בחינם. חלון גדול עולה יותר בזמן ובכסף, ולפעמים מידע קריטי שקבור באמצע חלון ענק מקבל פחות "תשומת לב" ממידע שיושב בקצוות. זה לא שדוחפים מיליון טוקנים ומקבלים קסם. גדול יותר זה לא תמיד טוב יותר — זו פשוט גישה אחרת עם איזונים אחרים.
אז איך עובדים עם זה נכון? שלושה טריקים
עכשיו לחלק הפרקטי, כי הבנה בלי יישום זה בזבוז. הנה שלושה דברים שאני עושה כל הזמן.
צעד אחר צעד
לעבוד נכון עם חלון הקשר
1
לתמצת
כשהשיחה מתארכת, מבקשים מהמודל סיכום, פותחים צ'אט חדש ומדביקים רק אותו למעלה.
1 / 3
הראשון: לתמצת. כשהשיחה מתארכת, אני מבקש מהמודל לסכם את מה שסיכמנו עד כה, פותח צ'אט חדש ומדביק את הסיכום למעלה. ככה אני נושא איתי את המהות בלי לגרור את כל ההיסטוריה הכבדה.
השני: להתחיל צ'אט חדש כשמחליפים נושא. כל הודעה ישנה ש"יושבת" על השולחן עולה לנו במקום ובכסף, וגם מבלבלת את המודל. שולחן נקי = מודל ממוקד.
השלישי, וזה החזק: RAG. RAG (אחזור-מועצם-יצירה) הוא שיטה שבה במקום לדחוף את כל המידע לחלון, שולפים בדיוק את הקטעים הרלוונטיים מתוך מאגר חיצוני ומכניסים רק אותם. תחשבו על זה כמו עוזר שרץ לארכיון, מביא רק את שלושת הדפים הנכונים ומניח אותם על השולחן — במקום לערום עליו את כל הארכיון. ככה החלון נשאר קטן וממוקד, והתשובות מדויקות יותר.
שורה תחתונה
חלון ההקשר הוא לא מגבלה שרירותית שמישהו המציא כדי לעצבן אותנו — הוא תוצאה ישירה של איך ה-Transformer וה-attention בנויים, ושל העובדה שהעלות גדלה בערך ריבועית. ברגע שמבינים את זה, מפסיקים להילחם במודל ומתחילים לעבוד איתו: מתמצתים, פותחים צ'אטים נקיים, ומשתמשים ב-RAG כשצריך.
המגבלה שלי בכתבה הזו: דיברתי במספרים כלליים בכוונה, כי גדלי החלונות זזים מהר וכל מודל שונה. הרעיון יציב — המספרים זזים.
אז בפעם הבאה שמודל "שוכח" משהו באמצע שיחה ארוכה — מה אתם מנחשים שקרה: נגזר החלון, או שבאמת היה כאן באג?
אמ;לק
5 הדברים שצריך לדעת
כמות הטקסט בטוקנים שהמודל רואה בבת אחת — פרומפט + היסטוריית השיחה + התשובה הנוכחית. מה שלא נכנס, לא קיים מבחינתו.
טוקן הוא פיסת מילה — היחידה שהמודל באמת קורא. עברית נשברת ליותר טוקנים, ולכן 'אוכלת' יותר מהחלון.
מנגנון ה-attention ב-Transformer גדל בערך ריבועי: מכפילים את ההקשר פי 2, העלות גדלה פי 4. לכן יש תקרה.
כשעוברים את התקרה, ההתחלה נחתכת החוצה. זו הסיבה שצ'אט ארוך 'מאבד את החוט' — לא באג, ניהול מקום.
לתמצת ולהתחיל צ'אט נקי, ולהשתמש ב-RAG כדי לשלוף רק את הקטעים הרלוונטיים במקום לדחוף הכל לחלון.