פוסט

טוקנים וחלון ההקשר

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

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

העובדות והקוד מבוססים על התיעוד הרשמי של חלונות הקשר ושל ספירת טוקנים. הקוד לא הורץ, ולכן בלוקי הפלט הם פלט לדוגמה.

מה זה טוקן

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

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

ספירת טוקנים

ב-API יש endpoint שסופר את הטוקנים של בקשה בלי להריץ אותה. הוא מקבל את אותו קלט כמו קריאה אמיתית:

import anthropic

client = anthropic.Anthropic()

count = client.messages.count_tokens(
    model="claude-opus-5-5",
    system="You are a scientist",
    messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(count.input_tokens)
14

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

חלון ההקשר

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

חלון ההקשר מכיל את ה-system prompt, הגדרות הכלים, תורות קודמים, ההודעה החדשה והתשובה

למודל אין זיכרון בין בקשות. בצ’אט, האפליקציה שלכם שולחת מחדש את כל השיחה בכל תור, ולכן החלון מתמלא ככל שהשיחה מתארכת. בזמן הכתיבה, למודלים הנוכחיים של Claude יש חלון של מיליון טוקנים, והם יכולים לכתוב עד 128 אלף טוקנים בתשובה אחת. את המספרים העדכניים בדקו ב-סקירת המודלים.

גדול יותר זה לא בהכרח טוב יותר

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

בפועל זה אומר:

  • שלחו את מה שהמשימה צריכה, לא את כל מה שיש לכם. בחירת החלקים הנכונים היא התפקיד של RAG, שמוסבר בהמשך הסדרה.
  • שימו מסמכים ארוכים בראש ה-prompt ואת השאלה בסוף. מדריך ה-prompting ממליץ על הסדר הזה לקלט ארוך.
  • בשיחות ארוכות ובסוכנים, סכמו או הסירו תוכן ישן. הפוסט על זיכרון וניהול הקשר מסביר את הכלים לזה.

כשהחלון נגמר

יכולים לקרות שני דברים. אם הקלט לבדו גדול מהחלון, ה-API דוחה את הבקשה עם שגיאת 400 (“prompt is too long”). אם הקלט נכנס, אבל התשובה מגיעה לגבול תוך כדי כתיבה, התשובה נעצרת והתגובה אומרת למה:

message = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=128000,
    messages=[{"role": "user", "content": very_long_text}],
)
print(message.stop_reason)
model_context_window_exceeded

stop_reason עם הערך max_tokens הוא המקרה הנפוץ יותר: התשובה הגיעה למגבלת max_tokens שהגדרתם. בשני המקרים התשובה קטועה, אז בדקו את stop_reason לפני שאתם סומכים על הטקסט.