החלפת מודל באמצע שיחה: ההקשר נשמר, אבל משלמים עליו מחדש
מאת ירון דויטשר עודכן לאחרונה:
הרגע מוכר: אתם באמצע משימה, קלוד מדשדש, ומעלים רמת מאמץ. או מחליפים לפייבל 5 כי הבאג התברר כקשה מהצפוי. השיחה נשמרת, ההקשר נשמר — וזה בדיוק מה שכתוב בכל מקום, כולל בכמה עמודים כאן באתר.
מה שלא כתוב: הבקשה הבאה תקרא את כל השיחה מחדש, במחיר מלא.
הכלל: מפתח ה-cache כולל את המודל ואת רמת המאמץ. משנים אחד מהם באמצע שיחה, והבקשה הבאה מעבדת את כל ההיסטוריה מאפס, בלי אף פגיעה ב-cache — גם אם לא הקלדתם מילה נוספת.
למה זה קורה
קלוד קוד שולח בכל תור את השיחה כולה: הנחיות המערכת, קובצי ההנחיות, כל הודעה וכל פלט של כלי. המודל אינו זוכר דבר בין בקשה לבקשה. מה שמוזיל את זה הוא ה-cache: ה-API משווה את תחילת הבקשה למה שכבר עיבד לאחרונה, ומעבד באמת רק את מה שהשתנה בסוף. ההשוואה מדויקת, ולכן שינוי אחד בהתחלה מבטל את כל מה שבא אחריו.
המודל ורמת המאמץ אינם חלק מהטקסט של הבקשה, אבל הם כן חלק ממפתח ה-cache: לכל מודל יש cache משלו, ולכל רמת מאמץ באותו מודל יש cache משלה. לכן החלפה אינה “אותה שיחה עם מוח אחר” מבחינת החשבון. מבחינת החשבון זו בקשה חדשה לגמרי.
בקלוד קוד יש לזה סימן גלוי: שינוי רמת מאמץ בשיחה שכבר התחילה מציג דיאלוג אישור לפני שהוא נכנס לתוקף. הדיאלוג הזה אינו טרחה — הוא מודיע לכם על החשבון.
מתי זה זול ומתי זה יקר
העלות של ההחלפה תלויה לגמרי במתי עושים אותה. בתור השלישי של שיחה טרייה כמעט אין מה לקרוא מחדש. בשעה השלישית של שיחה ארוכה, אותה פקודה בדיוק היא הבקשה היקרה ביותר ששלחתם באותו יום.
זה גם מה שהופך את הדפוס לתכנן עם פייבל ולבצע עם אופוס ליקר יותר ממה שהוא נראה: הוא כולל שתי החלפות, והשנייה מגיעה אחרי שהתוכנית כבר תפחה בהקשר. הדפוס עדיין משתלם — פשוט לא בחינם, וכדאי לדעת את שני צדי המאזן.
מה עוד מאפס את ה-cache
- מצב מהיר: ההדלקה מוסיפה כותרת שנכללת במפתח. זו הסיבה שחסכוני ביותר להדליק אותו בתחילת שיחה, ולא באמצע ויכוח ארוך עם באג
- דחיסה: /compact מחליף את ההיסטוריה בתקציר, כלומר בונה תחילית חדשה. בתוך שיחה חמה זה עולה פחות ממה שנדמה, כי בקשת הסיכום עצמה עדיין קוראת מה-cache
- חיבור או ניתוק של שרת MCP: רק כשהכלים שלו נטענים לתחילית במקום להידחות, שזו אינה ברירת המחדל במודלים הנתמכים
- שדרוג גרסה: הנחיות המערכת משתנות, ולכן התור הראשון אחרי הפעלה מחדש תמיד קר
- חסימה של כלי שלם בכלל הרשאות, למשל שם כלי חשוף בלי סוגריים: הכלי יורד מההקשר, וההקשר השתנה
ומה דווקא בטוח
- /rewind: חוזר אחורה לתחילית שכבר יושבת ב-cache, ולכן אינו עולה דבר. הלכתם לכיוון שגוי? זו הדרך הזולה לחזור, לא דחיסה
- סקילים ופקודות: נכנסים כהודעה בנקודת ההפעלה ואינם נוגעים במה שלפניהם
- מעבר בין מצבי הרשאה: בטוח, למעט מצב תכנון בהגדרת opusplan — שם כל כניסה ויציאה היא החלפת מודל ממש
- החלפת סגנון פלט: בטוחה מסיבה מפתיעה — הסגנון נטען פעם אחת בתחילת הסשן, ולכן שינוי באמצע אינו עולה כלום וגם אינו נכנס לתוקף עד הניקוי הבא
- עריכת קבצים בפרויקט: תוכן נכנס להקשר רק כשקלוד קורא אותו, והקריאה מתווספת בסוף
ולמה המכסה יורדת אחרי הפסקה
ה-cache פג אחרי חוסר פעילות. במנוי, קלוד קוד מבקש אוטומטית תוקף של שעה, וכל בקשה שפוגעת ב-cache מאפסת את השעון — כך שכל עוד עובדים ברצף הוא נשאר חם. חוזרים אחרי הפסקה ארוכה יותר, והבקשה הראשונה מעבדת את כל ההיסטוריה מחדש. זו התשובה לשאלה למה המכסה קפצה אחרי ארוחת צהריים שבה לא נגעתם במקלדת.
שני סייגים ששווה להכיר. כשחורגים מהמכסה ועוברים לקרדיטים, קלוד קוד יורד לתוקף הקצר, כי כתיבה ל-cache ארוך יקרה יותר. ומי שעובד מול מפתח API או מול ספק ענן מקבל את התוקף הקצר כברירת מחדל. בשני המקרים אפשר לבקש את השעה בחזרה:
ENABLE_PROMPT_CACHING_1H=1
איך יודעים שזה קורה לכם
הפקודה /usage מסמנת התנהגות שאחראית ל-10% ומעלה מהשימוש האחרון, והחטאות cache
הן אחת מהן במפורש. מי שרוצה מד חי מגדיר שורת סטטוס שקוראת שני שדות:
cache_read_input_tokens מול cache_creation_input_tokens. יחס קריאה גבוה
פירושו שה-cache עובד; יצירה שנשארת גבוהה תור אחרי תור אומרת שמשהו בתחילית משתנה
כל הזמן.
שורה תחתונה
בוחרים מודל ורמת מאמץ בתחילת השיחה, ונשארים איתם עד הפסקה טבעית. כשבאמת צריך להחליף, ויש רגעים כאלה — שני כישלונות על אותה משימה הוא הברור שבהם — עושים את זה מיד אחרי ניקוי או דחיסה, כשההיסטוריה קצרה ממילא.
ההקשר באמת נשמר בהחלפה. פשוט אין צורך לשלם עליו פעמיים באמצע יום עבודה.
התמונה המלאה של שני הכפתורים: מודל ורמת מאמץ בקלוד קוד. ואיך שומרים על החלון עצמו נקי: ניהול הקשר בקלוד קוד.