Tokenizer Mono: فونتی که توکنهای LLM رو رنگی نشون میده
خلاصهٔ کاملتر
جورج مندیس تو این مقاله یه پروژهٔ عجیب ولی جالب رو معرفی میکنه: Tokenizer Mono، فونتی که توکنها (یعنی تیکههای متنی که مدل زبانی واقعاً میخونه و تولید میکنه) رو همون موقع تایپ رنگی نشون میده. ابزارهای معمولی مثل tokenizer خود OpenAI متن رو از یه tokenizer واقعی رد میکنن و بعد مرزها رو تو مرورگر هایلایت میکنن. اینجا ولی هیچ tokenizerی اجرا نمیشه و همهٔ رنگها رو خود فونت میکشه.
بیشتر tokenizerها از BPE یا byte-pair encoding استفاده میکنن، یعنی از تکحرفها شروع میکنن و پرتکرارترین جفتهای کنار هم رو هزاران بار با هم ادغام میکنن. ترتیب این ادغامها ذخیره میشه و موقع توکنسازی به همون ترتیب دوباره اجرا میشه. واژگان مدلها هم داره بزرگتر میشه: GPT-2 حدود ۵۰ هزار توکن داشت، GPT-4 حدود ۱۰۰ هزار و GPT-4o حدود ۲۰۰ هزار. یه قاعدهٔ سرانگشتی هم میگه هر توکن تقریباً ۰.۷۵ کلمهست.
ترفند اصلی، جدول GSUB فونتهای OpenType هست، یعنی بخشی که قواعد عوض کردن یه glyph (شکل کشیدهشدهٔ حرف) با glyph دیگه رو نگه میداره. Tokenizer Mono از نوع ۶ یعنی chained contextual substitution استفاده میکنه که مثل lookbehind و lookahead تو regex، به حرفهای قبل و بعد هم نگاه میکنه. برای هر توکن واژگان یه قاعده ساخته شده، اول طولانیترها، و حرفها به نسخههای شروع، وسط و پایان تبدیل میشن. نویسنده برای گرم شدن یه فونت ساده ساخته که فقط کلمهٔ کامل fire رو قرمز میکنه:
feature calt {
ignore sub @letter f' i' r' e'; # not "misfire"
ignore sub f' i' r' e' @letter; # not "fired"
sub f' lookup toRed i' lookup toRed r' lookup toRed e' lookup toRed;
} calt;رنگها از دو جدول COLR و CPAL میان: COLR میگه هر glyph از چه لایههایی ساخته شده و CPAL پالت رنگها رو نگه میداره. هر حرف رنگی دو لایه داره، یه جعبهٔ گرد رنگی و خود حرف روش. فونت دو پالت داره، یکی برای تم روشن و یکی برای تاریک، که با پراپرتی CSS به اسم font-palette عوض میشه. هر جا COLR پشتیبانی نشه، مثل بیشتر ترمینالها، فونت بیدردسر به یه IBM Plex Mono ساده برمیگرده.
مشکل اصلی اینه که فونت نمیتونه BPE رو واقعاً اجرا کنه و فقط greedy longest-match داره، یعنی طولانیترین توکنی که جا بشه رو برمیداره. برای جبرانش ۶۰ هزار کلمهٔ پرکاربرد انگلیسی از wordfreq با tokenizer واقعی چک شدن و هر جا نتیجه فرق داشت یه قاعدهٔ کلکلمه اضافه شد. همین کار حجم فونت cl100k رو از ۴.۴ به ۱۰.۹ مگابایت رسوند. اجرای کامل ادغامها هم شدنی نیست، چون OpenType حداکثر ۶۵,۵۳۵ lookup قبول میکنه ولی cl100k حدود ۱۰۰ هزار merge داره.
دقت با مقایسهٔ مرز توکنها روی یه متن ۲۰۰ خطی از نثر و کد سنجیده شده و بیشتر فونتها بین ۹۷ تا ۹۹ درصد precision دارن. BERT با ۹۹.۵ درصد اوله، چون WordPiece خودش greedy هست، و T5 با ۸۵.۷ درصد آخره. فونت برای هر کاراکتر حدود ۳۴ میکروثانیه وقت میگیره که حدود ۳۰۰ برابر کندتر از tiktoken محلیه. ولی چون مرورگر فقط پاراگرافِ در حال ویرایش رو دوباره شکل میده، هزینهٔ هر کلید حدود ۱۷ میلیثانیهست و عملاً حس نمیشه.
نکات کلیدی:
- Tokenizer Mono بر پایهٔ IBM Plex ساخته شده و ۲۸ استایل داره، هر کدوم برای یه tokenizer مثل cl100k، o200k، llama3 یا gemma3.
- Claude و Gemini فیس ندارن، چون tokenizer اونا عمومی نیست.
- فونت فقط ۱,۰۰۱ کاراکتری که Plex Mono داره رو هایلایت میکنه.
- مرورگرها سر شکستن خط دوباره شکلدهی میکنن، پس کلمهای که به اول خط بره ممکنه جور دیگهای توکن بشه.
- حجم فونتها از ۵ تا ۱۵.۴ مگابایت TTF هست و WOFF2 حدود یکدهم اونه.




