LLM فارسی

Tokenization فارسی

Tokenization فارسی — راهنمای فارسی از مجموعهٔ «LLM فارسی» در وبلاگ آیرا. بازنویسی‌شده با تمرکز روی کاربر ایرانی و روایت شناخت پیوسته.

نوشتهٔ به‌روزرسانی: ۳ دقیقه مطالعه
تصویر مقالهٔ Tokenization فارسی

وقتی یه متن فارسی می‌نویسی و یه LLM پردازشش می‌کنه، اولین قدم — قبل از هر چیز — اینه که متن به تکه‌های کوچک‌تری تبدیل بشه. این فرآیند tokenization نام داره. به نظر ساده میاد، اما برای فارسی پیچیدگی‌هایی داره که مستقیماً روی کیفیت مدل، هزینهٔ API، و حتی درک مدل از متن تأثیر می‌ذاره.

Tokenization چیه؟

به زبان ساده: قبل از اینکه یه مدل زبانی متن رو پردازش کنه، باید اون رو به واحدهای کوچک‌تری تقسیم کنه که بهشون «توکن» می‌گن. این توکن‌ها می‌تونن کلمه باشن، پیشوند/پسوند، یا حتی چند کاراکتر تنها.

مثال انگلیسی: جملهٔ «I'm learning» ممکنه به ["I", "'m", " learning"] تبدیل بشه.

حالا تصور کن همین کار رو برای فارسی انجام بدی — جایی که کلمات می‌تونن بچسبن، فاصلهٔ مجازی (ZWNJ) وجود داره، خط راست‌به‌چپه، و بعضی کاراکترها در عربی و فارسی از نظر یونیکد متفاوتن.

الگوریتم‌های رایج: BPE، WordPiece، SentencePiece

BPE (Byte Pair Encoding)

BPE از تکرارگرترین جفت کاراکترها شروع می‌کنه و اونا رو ادغام می‌کنه تا یه واژگان بهینه بسازه. مدل‌هایی مثل GPT خانواده از BPE استفاده می‌کنن. وقتی BPE رو روی فارسی اعمال کنی، اگه کرپوس فارسی کافی نداشته باشی، کلمات فارسی رو به تکه‌های بی‌معنی می‌شکونه — مثلاً کلمهٔ «می‌خواهم» ممکنه به ۵-۶ توکن مجزا تقسیم بشه در حالی که معادل انگلیسیش یه-دو توکنه.

SentencePiece

این کتابخانهٔ گوگل یه رویکرد متفاوت داره: قبلاً متن رو کلمه‌به‌کلمه تقسیم نمی‌کنه، بلکه مستقیم روی توالی خام کاراکترهای یونیکد کار می‌کنه. این باعث می‌شه به خط راست‌به‌چپ یا بدون فاصله بودن ژاپنی و فارسی بی‌تفاوت باشه — یه pipeline یکپارچه برای همه. PersianMind و بعضی مدل‌های فارسی از این روش استفاده می‌کنن.

WordPiece

روشی که BERT و مدل‌های Google استفاده می‌کنن. مشابه BPE اما با معیار ادغام کمی متفاوت‌تر.

مشکلات خاص فارسی

۱. کاراکترهای مشابه عربی-فارسی

«ک» عربی (U+0643) و «ک» فارسی (U+06A9) از نظر چشم یه‌جورن، اما در یونیکد دو کد مجزان. اگه normalization انجام نشه، یه مدل این دو رو به‌عنوان دو توکن مختلف یاد می‌گیره. خیلی از متن‌های ایرانی روی وب این دو رو قاطی می‌کنن، که باعث می‌شه توکنایزر در عمل ضعیف‌تر کار کنه.

۲. فاصلهٔ مجازی (Zero Width Non-Joiner — ZWNJ)

در فارسی از ZWNJ استفاده می‌کنیم تا بین بخش‌های یه کلمه فاصلهٔ نیم‌فاصله بذاریم — مثل «می‌خواهم» در مقابل «میخواهم». خیلی از توکنایزرهای عمومی این کاراکتر رو نمی‌شناسن و رفتار یکنواختی در مقابلش ندارن. نتیجه: همون کلمه در دو فرم نوشتاری به توکن‌های کاملاً متفاوت تبدیل می‌شه.

۳. پیوندی بودن زبان

فارسی یه زبان پیوندی‌ست: پیشوندها و پسوندها می‌تونن به کلمه بچسبن. «کتاب‌هایمان» یه کلمهٔ واحده اما از چند تکیهٔ معنایی ساخته شده. توکنایزر بدون آگاهی از دستور زبان فارسی نمی‌تونه این تقسیم‌بندی رو درست انجام بده.

۴. اعداد فارسی و عربی

فارسی هم اعداد ۰-۹ لاتین و هم اعداد فارسی (۰-۹) داره. «قیمت: 1000 تومان» و «قیمت: ۱۰۰۰ تومان» از نظر معنایی یکسانن اما توکنایزر باید هر دو رو بشناسه.

چرا تعداد توکن‌ها مهمه؟

یه جملهٔ ۱۰ کلمه‌ای فارسی در GPT-4 ممکنه ۲۵-۴۰ توکن بشه، در حالی که معادل انگلیسیش ۱۰-۱۵ توکن باشه. این یعنی:

  • هزینهٔ API بیشتر: چون API های OpenAI و Anthropic بر اساس توکن محاسبه می‌کنن
  • Context window کمتر: اگه ۱۲۸K توکن context داری، متن فارسی حدود نصف انگلیسی در اون جا می‌گیره
  • کیفیت پایین‌تر: مدل اگه یه کلمهٔ فارسی رو به تکه‌های معنایی بی‌ربط بشکونه، فهم اون رو از دست می‌ده

راه‌حل: توکنایزرهای اختصاصی فارسی

روش رایج اینه که یه توکنایزر BPE جداگانه روی کرپوس فارسی آموزش بدن و vocabulary اون رو به مدل اضافه کنن. PersianMind این کار رو کرد: ۱۰,۰۰۰ توکن فارسی روی Wikipedia فارسی آموزش دادن و به واژگان LLaMA2 اضافه کردن. نتیجه اینه که کلمات رایج فارسی به‌جای شکستن به بایت‌ها، به‌عنوان یه توکن واحد شناخته می‌شن.

این روش باعث می‌شه:

  • متن فارسی با توکن‌های کمتری نمایش داده بشه
  • مدل روابط معنایی بین کلمات فارسی رو بهتر یاد بگیره
  • کیفیت تولید متن فارسی بالا بره

وضعیت عملی برای کاربر ایرانی

اگه از Claude، ChatGPT یا Gemini استفاده می‌کنی، باید بدونی که این مدل‌ها tokenizer اختصاصی فارسی ندارن و فارسی رو با توکن‌های بیشتری نمایش می‌دن. هنوز خوب کار می‌کنن — چون با حجم زیادی فارسی دیدن — اما کارآمدی پردازش انگلیسی رو ندارن.

مدل‌هایی که با توکنایزر فارسی اختصاصی آموزش دیدن، مثل ParsiBERT یا PersianMind، در بعضی وظایف خاص زبانی نتایج بهتری می‌دن، هرچند در دسترس بودنشون برای کاربر عادی کمتره.

همچنین بخوان

#LLM فارسی

ادامهٔ مسیر

همهٔ مقاله‌ها ←

بیشتر در «LLM فارسی»