المستوى: مبتدئ — المقال ده مناسب لأي حد بيستخدم ChatGPT أو Claude API، شايف الفاتورة بتطلع أعلى من المتوقع، ومش فاهم التوكنز (tokens) دي بتتحسب إزاي. مش محتاج خلفية رياضيات، بس محتاج تعرف تشغّل أمر Python واحد.
Tokenization: إزاي الذكاء الاصطناعي بيقرأ كلامك فعلاً
النص العربي بياخد تقريبًا ضعف إلى تلات أضعاف التوكنز اللي بياخدها نفس المعنى بالإنجليزي. يعني نفس الرسالة، نفس النموذج، بتدفع فيها أكتر لمجرد إنها بالعربي. المقال ده هيوريك ليه بيحصل كده، وإزاي تقيسه بنفسك في دقيقتين، وإمتى الموضوع يستاهل تتعب فيه أصلًا.
المشكلة باختصار
النموذج زي Claude أو GPT مابيشوفش حروف ولا كلمات. بيشوف أرقام. علشان يحوّل كلامك لأرقام، بيقطّع النص لقطع صغيرة اسمها "توكنز". وانت بتدفع بالتوكن: توكنز الدخل + توكنز الخرج. هنا بالظبط بتظهر المشكلة: العربي بيتقطّع لعدد توكنز أكتر بكتير من الإنجليزي لنفس الجملة.
النتيجة العملية: chatbot عربي بيكلّفك أكتر من نفس chatbot إنجليزي، وكمان بيوصل أسرع لحد الـ context window (الحد الأقصى للنص اللي النموذج يقدر يشيله في المرة الواحدة).
يعني إيه "توكن"؟ خلينا نقطّع بيتزا الأول
تخيّل إنك طلبت بيتزا واحدة، بس صاحب المحل مابيبيعش بيتزا كاملة — بيبيع بالقطعة. البيتزا الإنجليزي بيقطّعها 4 قطع كبيرة، فتدفع 4 وحدات. نفس البيتزا بالظبط لما تكون "عربي" بيقطّعها 10 قطع صغيرة، فتدفع 10 وحدات. أكلت نفس الكمية، بس دفعت أكتر، عشان السكينة بتقطّع العربي أنعم.
السكينة دي اسمها الـ Tokenizer. القطعة الواحدة اسمها token. الفاتورة بتتحسب على عدد القطع، مش على "كمية المعنى".
دلوقتي بعد ما المثال وضّح الفكرة، نرجع للتعريف الدقيق: الـ token هو أصغر وحدة نصية بيتعامل معاها النموذج. ممكن تكون كلمة كاملة، أو جزء من كلمة، أو حتى حرف واحد. كل token بيتحول لرقم (id) موجود في "قاموس" النموذج اسمه الـ vocabulary.
ليه العربي بياخد قطع أكتر؟ الشرح العلمي
أغلب النماذج بتستخدم خوارزمية اسمها Byte Pair Encoding (BPE). الفكرة باختصار: الخوارزمية بتتدرّب على كميات ضخمة من النصوص، وبتكوّن قاموس من أكتر تتابعات الحروف تكرارًا. التتابع اللي بيتكرر كتير بياخد token واحد. التتابع النادر بيتقطّع لحروف أو بايتات.
وهنا المشكلة: أغلب بيانات التدريب إنجليزي. فكلمات إنجليزية شائعة زي "information" ممكن تبقى token أو اتنين. لكن كلمة عربية زي "المعلومات" مش متكررة بنفس الكثافة في بيانات التدريب، وكمان العربي بيتكتب بحروف Unicode بتاخد عدة بايتات لكل حرف. فبتتقطّع لكذا token. أضف على ده التشكيل والهمزات والتاء المربوطة اللي بتزوّد التقطيع.
الافتراض هنا: ده بيختلف حسب النموذج. الـ tokenizer القديم من OpenAI (cl100k_base المستخدم مع GPT-4) كان أسوأ مع العربي. الأحدث (o200k_base مع GPT-4o) حسّن الموضوع لكن الفجوة لسه موجودة.
قيسها بنفسك في 12 سطر Python
مش محتاج تصدّقني. الكود ده بيحسب التوكنز الفعلية لنفس الجملة بالعربي والإنجليزي: