מודלי שפה של AI לא קוראים אותיות או מילים. הם קוראים טוקנים: פיסות טקסט קטנות, לעתים קרובות מילה שלמה, לפעמים חלק ממילה. והם יכולים לקלוט רק מספר מוגבל של טוקנים בכל פעם, מגבלה שנקראת context window (חלון ההקשר). שני הרעיונות האלה מסבירים למה כלי AI מתומחרים כמו שהם מתומחרים, למה צ'אטים ארוכים מתחילים לשכוח הוראות מההתחלה, ולמה למודל יכול להיות קשה לספור את האותיות במילה שהוא בדיוק איית נכון.
מה זה טוקן ב-AI?
לפני שמודל רואה את הפרומפט שלכם, תוכנה שנקראת tokenizer מפצלת את הטקסט לחלקים מתוך אוצר מילים קבוע והופכת כל חלק למספר. המודל עובד כולו עם המספרים האלה, והוא כותב את התשובה שלו באותה דרך, טוקן אחד בכל פעם, והאפליקציה הופכת אותם בחזרה לטקסט.
אוצר המילים נלמד מכמויות גדולות של טקסט, ולכן מילים נפוצות נוטות להיות טוקן יחיד ומילים נדירות יותר מתפצלות לכמה חלקים מוכרים. רווח מוצמד לעתים קרובות לתחילת המילה שאחריו. משפט באנגלית עשוי להתפצל בערך כך:
Token ization isn 't magic .
הפיצול הזה להמחשה בלבד. לכל משפחת מודלים יש tokenizer משלה, ואותו משפט יכול לצאת במספר שונה של חלקים בכל אחד. ספקים רבים מפרסמים כלי tokenizer או API לספירת טוקנים כדי שתוכלו לבדוק ספירות אמיתיות.
גם תמונות, אודיו וקבצים מומרים לטוקנים כשמודל מקבל אותם, ובגלל זה צילום מסך מצורף צורך חלק מאותו תקציב כמו הטקסט שלכם.
כמה טוקנים זו מילה?
בטקסט באנגלית, כלל אצבע נפוץ הוא כארבעה תווים לטוקן, או בערך שלושה רבעים של מילה. לפי ההערכה הזו, 1,000 טוקנים הם כ-750 מילים באנגלית, ומאמר של 3,000 מילים הוא כ-4,000 טוקנים.
היחס משתנה לפי התוכן:
- שפות אחרות דורשות לעתים קרובות יותר טוקנים לאותה משמעות. tokenizers מאומנים על נתונים שבהם לאנגלית ייצוג גבוה, ולכן מילים באנגלית מקבלות טוקנים קומפקטיים, בעוד שטקסט ביפנית, בקוריאנית, בערבית, בהינדי ובשפות רבות אחרות, כולל עברית, מתפצל ליותר חלקים. הפער תלוי ב-tokenizer והצטמצם בחדשים יותר, אבל הוא לא נעלם.
- קוד צורך טוקנים על הזחות, סוגריים, אופרטורים ומזהים ארוכים, ולכן קובץ עולה לעתים קרובות יותר טוקנים ממה שמספר המילים שלו מרמז.
- מספרים, כתובות URL ומחרוזות לא שגרתיות כמו מזהים ו-hashes נוטים להתפצל להרבה טוקנים קטנים.
למה טוקנים חשובים
עלות. ממשקי API גובים לפי טוקן, עם מחירים נפרדים לטוקנים שאתם שולחים ולטוקנים שהמודל כותב. בצ'אט, כל השיחה נשלחת שוב עם כל הודעה חדשה, ולכן שיחה ארוכה עולה יותר לכל הודעה מאשר שיחה קצרה.
מגבלות. למודל יש חלון הקשר לכל מה שהוא קורא וכותב בבקשה אחת, ולעתים קרובות גם תקרה נפרדת לאורך של תשובה בודדת. ב-API אפשר לקבוע את התקרה הזו בעצמכם, וב-API של Anthropic חייבים: max_tokens הוא פרמטר חובה.
מהירות. התשובה מופקת טוקן אחרי טוקן, ולכן תשובה ארוכה יותר לוקחת זמן רב יותר באופן יחסי.
משימות איות. מכיוון שמודל רואה מילה כמו magic כיחידה אחת או שתיים ולא כחמש אותיות, משימות שתלויות בתווים בודדים, כמו ספירת אותיות, היפוך מילה או מציאת מילים באורך מדויק, קשות לו יותר ממה שהן נראות. מודלים חדשים יותר מתמודדים עם רבות מהן טוב יותר, אבל כשהתווים חשובים, בדקו את התשובה או בקשו מהמודל לכתוב קודם את המילה אות אחר אות.
מה זה context window?
ה-context window הוא המספר המרבי של טוקנים שמודל יכול לקחת בחשבון בבקשה אחת. חשבו עליו כעל זיכרון העבודה של המודל: כל מה שהמודל יכול להשתמש בו כדי לכתוב את התשובה צריך להיכנס לתוכו בבת אחת, כולל:
- ה-system prompt, ההוראות של האפליקציה עצמה ושלכם
- השיחה עד עכשיו, כל הודעת משתמש וכל תשובה
- קבצים מצורפים, מסמכים מודבקים ותוצאות חיפוש או כלים
- התשובה שנכתבת
כל מה שמחוץ לחלון לא קיים מבחינת המודל. אין זיכרון רקע שבו הוא יכול לחפש דברים. גודלי חלון ההקשר משתנים מאוד בין מודלים וממשיכים לגדול, ולכן בדקו בתיעוד של הספק שלכם את הגודל של המודל שבו אתם משתמשים, במקום לסמוך על מספר ממאמר.
המודל גם לא שומר כלום בין בקשות. מה שנראה כמו זיכרון בצ'אט הוא האפליקציה ששולחת את כל השיחה מחדש בכל פעם. תכונות זיכרון באפליקציות צ'אט עובדות באותה צורה: האפליקציה שומרת הערות עליכם, או מחפשת בצ'אטים הקודמים שלכם, ומכניסה את מה שהיא מוצאת להקשר של צ'אטים חדשים.
מה קורה כשצ'אט מתארך
כששיחה גדלה מעבר לחלון ההקשר, משהו צריך לוותר. תלוי באפליקציה, ההודעות הוותיקות ביותר נמחקות, חלקים ישנים מוחלפים בסיכום, או שמודיעים לכם שהצ'אט הגיע למגבלה ושכדאי להתחיל חדש. בכל מקרה, פרטים מההתחלה, כולל הוראות שנתתם בהודעה הראשונה, עלולים להפסיק להשפיע על התשובות.
חלון מלא הוא לא הבעיה היחידה. ככל שיש מול המודל יותר חומר, יש יותר דברים לפספס, ובצ'אט ארוך ההחלטות המוקדמות מתחרות בכל מה שנאמר מאז. התסמינים כוללים תשובות שמתעלמות ממגבלה שקבעתם קודם, קוד שחוזר לגרסה שכבר תיקנתם, או מודל שחוזר על רעיון שדחיתם.
לעבוד בתוך חלון ההקשר
פתחו צ'אט חדש לכל משימה. צ'אט חדש עם הודעה ראשונה ברורה בדרך כלל עדיף על צ'אט ארוך שנסחף בין כמה נושאים.
העבירו סיכום הלאה. כשצ'אט צבר החלטות שימושיות, בקשו סיכום שנכתב כדי להדביק אותו בצ'אט חדש, ואז המשיכו שם. מלאו את השדות שלמטה כך שיתאימו לעבודה שלכם.
מטרה: מסד נתונים לאפליקציית ספרייה קטנה, שנשמר ב-SQLite.
החלטות:
- להשאלות יש טבלה משלהן, כך שכל היסטוריית ההשאלות נשמרת.
- ספר נחשב זמין כשאין לו השאלה עם
returned_atריק.
הסכמה הנוכחית:
CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT NOT NULL, author TEXT NOT NULL);
CREATE TABLE members (id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE);
CREATE TABLE loans (
id INTEGER PRIMARY KEY,
book_id INTEGER NOT NULL REFERENCES books(id),
member_id INTEGER NOT NULL REFERENCES members(id),
loaned_at TEXT NOT NULL,
returned_at TEXT
);
שאלות פתוחות:
- האם צריך קנסות איחור?
- האם הספרייה צריכה לעקוב אחרי כמה עותקים של אותו ספר?
הדביקו רק את מה שהמשימה צריכה. את הפונקציה עם הבאג ואת הקוד שקורא לה, לא את כל ה-repository. את הסעיף הרלוונטי בחוזה, לא את כל ארבעים העמודים. פחות חומר משאיר פחות לפספס.
שימו את השאלה אחרי חומר ארוך, וחזרו על מה שחשוב. כשאתם מדביקים מסמך ארוך, שאלו את השאלה בסוף, אחריו, וחזרו שם על המגבלות העיקריות. ההוראה יושבת אז ליד הנקודה שבה המודל מתחיל לכתוב.
פצלו מסמך שארוך מדי להודעה אחת. חלק מהאפליקציות מגבילות כמה אפשר להדביק בהודעה בודדת גם כשחלון המודל יכול להכיל יותר. שליחת המסמך בחלקים עוקפת את מגבלת ההודעה, אבל לא את חלון ההקשר: כל חלק עדיין נספר בו. אמרו למודל מראש לא להגיב עד ששלחתם הכול.
התקבל חלק 1 מתוך 3
ספרו טוקנים כשזה חשוב. אם אתם בונים עם API, ספרו לפני שאתם שולחים. ספריית הקוד הפתוח tiktoken של OpenAI מפצלת טקסט לטוקנים עם ה-tokenizers של OpenAI, וב-API של Anthropic יש endpoint לספירת טוקנים. ספירות מה-tokenizer של ספק אחד הן רק הערכה עבור ספק אחר.
import tiktoken
enc = tiktoken.get_encoding("o200k_base") # one of OpenAI's tokenizers
tokens = enc.encode("Tokenization isn't magic.")
print(len(tokens))
print([enc.decode([t]) for t in tokens])
כשבונים אפליקציה סביב מודל, ההחלטה מה נכנס לחלון ובאיזה סדר הופכת לבעיית תכנון בפני עצמה. Context engineering עוסק בזה, ו-prompt chaining מראה איך לפצל עבודה גדולה לשלבים שכל אחד מהם נכנס בנוחות. כדי להבין איך הודעה בודדת משתלבת בכל הקלט, ראו מה זה פרומפט.
שאלות נפוצות
מה זה טוקן ב-AI?
טוקן הוא יחידת הטקסט שמודל שפה קורא וכותב. הוא יכול להיות מילה נפוצה שלמה, חלק ממילה ארוכה יותר, סימן פיסוק או קטע של רווח. לפני שמודל רואה את הפרומפט שלכם, tokenizer מפצל אותו לטוקנים והופך כל אחד מהם למספר, והמודל מייצר את התשובה שלו טוקן אחד בכל פעם.
כמה מילים הם 1,000 טוקנים?
באנגלית, כלל אצבע נפוץ הוא כארבעה תווים לטוקן, כלומר בערך 750 מילים לכל 1,000 טוקנים. המספר האמיתי תלוי ב-tokenizer של המודל ובטקסט. קוד, מספרים ושפות רבות מלבד אנגלית, כולל עברית, משתמשים ביותר טוקנים לאותה כמות תוכן.
מה זה context window?
ה-context window (חלון ההקשר) הוא המספר המרבי של טוקנים שמודל יכול לקחת בחשבון בבקשה אחת. הוא צריך להכיל את ה-system prompt, את השיחה עד עכשיו, קבצים מצורפים או תוצאות של כלים, ואת התשובה שהמודל כותב. כל מה שמחוצה לו לא קיים מבחינת המודל.
מה קורה כשצ'אט חורג מחלון ההקשר?
האפליקציה צריכה לפנות מקום. תלוי באפליקציה, היא מוחקת את ההודעות הוותיקות ביותר, מחליפה אותן בסיכום, או מודיעה שהשיחה הגיעה למגבלה שלה. בכל מקרה, הוראות ופרטים מתחילת הצ'אט עלולים להפסיק להשפיע על התשובות, ובגלל זה צ'אטים ארוכים נראים לפעמים כאילו הם שוכחים דברים.
האם ChatGPT או Claude זוכרים את הצ'אטים הקודמים שלי?
המודל עצמו לא. כל תשובה נוצרת ממה שנמצא בחלון ההקשר של אותה בקשה. לחלק מהאפליקציות יש תכונות זיכרון ששומרות הערות עליכם או מחפשות בצ'אטים הקודמים שלכם ומוסיפות את מה שהן מוצאות לצ'אטים חדשים, ופרויקטים יכולים לכלול קבצים והוראות משותפים, אבל זו האפליקציה שמכניסה טקסט להקשר, לא המודל שזוכר.