رفتن به محتوای اصلی
هوشوانا

توکن چیست و چرا متن فارسی گران‌تر است؟

· ۷ دقیقه مطالعه

توکنهزینهفارسیآموزش

توکن کوچک‌ترین واحدی است که یک مدل زبانی متن را با آن می‌خواند و تولید می‌کند و هزینه‌ی API هم بر اساس تعداد همین توکن‌ها حساب می‌شود. متن فارسی معمولاً گران‌تر تمام می‌شود چون توکنایزر بیشتر مدل‌ها عمدتاً با متن انگلیسی ساخته شده و کلمه‌های فارسی را اغلب به قطعه‌های بیشتری می‌شکند؛ در نتیجه یک پیام فارسی معمولاً توکن بیشتری از معادل انگلیسی‌اش مصرف می‌کند. مقدار دقیق این تفاوت به توکنایزر هر مدل و خود متن بستگی دارد، پس بهترین کار اندازه‌گیری روی متن واقعی خودتان است.

در ادامه می‌بینیم توکنایزر چطور کار می‌کند، چه عواملی تعداد توکن متن فارسی را بالا می‌برد و چطور می‌توانید مصرف را دقیق بسنجید و کم کنید.

توکن دقیقاً چیست؟

مدل زبانی نمی‌تواند مستقیم با حروف یا کلمه‌ها کار کند. پیش از هر چیز، متن به دنباله‌ای از توکن‌ها تبدیل می‌شود و هر توکن یک شماره در واژگان مدل دارد. مدل همین شماره‌ها را می‌خواند و در خروجی هم توکن‌به‌توکن متن تولید می‌کند. یک توکن ممکن است یک کلمه‌ی کامل باشد، بخشی از یک کلمه، یک فاصله به همراه چند حرف، یک عدد یا یک علامت نگارشی.

دو چیز مهم به تعداد توکن بستگی دارد:

  • هزینه: قیمت API به ازای هر یک میلیون توکن ورودی و خروجی اعلام می‌شود.
  • ظرفیت: طول context مدل، یعنی حداکثر متنی که در یک درخواست می‌خواند، بر حسب توکن است. متنی که توکن بیشتری بسازد، زودتر این ظرفیت را پر می‌کند.

توکنایزر چطور کار می‌کند؟

بیشتر مدل‌های امروزی از روشی به نام BPE یا Byte Pair Encoding یا نسخه‌های مشابه آن استفاده می‌کنند. ایده ساده است: الگوریتم روی حجم زیادی متن آموزش می‌بیند و قطعه‌هایی را که زیاد کنار هم تکرار می‌شوند به یک توکن واحد تبدیل می‌کند. نتیجه این است که کلمه‌ها و ترکیب‌های پرتکرار در داده‌ی آموزشی یک یا دو توکن می‌شوند و کلمه‌های کم‌تکرار به قطعه‌های کوچک‌تری شکسته می‌شوند.

چرا فارسی توکن بیشتری می‌سازد؟

داده‌ای که توکنایزرها با آن ساخته شده‌اند عمدتاً انگلیسی بوده است. پس واژگان توکنایزر برای کلمه‌های رایج انگلیسی توکن‌های کامل دارد، ولی برای فارسی سهم کمتری در واژگان وجود دارد. در عمل یعنی:

  • بسیاری از کلمه‌های فارسی، به‌خصوص کلمه‌های کم‌کاربردتر، به چند قطعه شکسته می‌شوند.
  • هر حرف فارسی در UTF-8 دو بایت جا می‌گیرد، در حالی که حروف انگلیسی یک بایت‌اند. توکنایزرهای بایت‌محور وقتی ترکیبی را در واژگان پیدا نکنند، به سطح بایت برمی‌گردند و این تعداد توکن را بالا می‌برد.
  • پیشوندها و پسوندهای فارسی مثل «می»، «ها» و «ترین» شکل کلمه را عوض می‌کنند و هر شکل تازه ممکن است جور دیگری شکسته شود.

خبر خوب این است که توکنایزرهای نسل‌های جدیدتر واژگان بزرگ‌تری دارند و زبان‌های غیرانگلیسی را بهتر پوشش می‌دهند. به همین دلیل یک متن فارسی ثابت ممکن است در دو مدل مختلف تعداد توکن کاملاً متفاوتی داشته باشد. هر عددی که به‌عنوان «نسبت ثابت فارسی به انگلیسی» ببینید، فقط برای همان توکنایزر و همان نمونه‌متن درست است.

اثر نیم‌فاصله و کاراکترهای یونیکد

چند جزئیات یونیکدی هم روی تعداد توکن اثر دارند:

  • نیم‌فاصله (ZWNJ): کاراکتری نامرئی است که در کلمه‌هایی مثل «می‌شود» و «درخواست‌ها» به کار می‌رود. این کاراکتر هم بایت دارد و ممکن است توکن جداگانه یا بخشی از یک توکن شود. حذف نیم‌فاصله برای صرفه‌جویی توصیه نمی‌شود، چون متن را نادرست می‌کند و ممکن است فهم مدل را هم کم کند.
  • ی و ک عربی: اگر متن شما ترکیبی از «ي» و «ك» عربی و «ی» و «ک» فارسی باشد، کلمه‌های یکسان شکل‌های متفاوتی پیدا می‌کنند. یکسان‌سازی این حروف پیش از ارسال، متن را تمیزتر می‌کند.
  • اعداد: ارقام فارسی و انگلیسی کاراکترهای متفاوتی‌اند و ممکن است جور متفاوتی توکن شوند. برای داده‌های عددی که مدل باید پردازش کند، یک قالب ثابت انتخاب کنید.
  • فاصله‌ها و خط‌های خالی اضافه: فاصله‌ی تکراری، تب و خط خالی زیاد هم توکن مصرف می‌کنند.

قیمت ورودی و خروجی چطور حساب می‌شود؟

هر مدل دو قیمت جدا دارد: یکی برای توکن‌های ورودی (هر چیزی که شما می‌فرستید) و یکی برای توکن‌های خروجی (هر چیزی که مدل تولید می‌کند). در بیشتر مدل‌ها قیمت خروجی چند برابر ورودی است. پس هزینه‌ی یک درخواست برابر است با تعداد توکن ورودی ضرب در قیمت ورودی، به‌علاوه‌ی تعداد توکن خروجی ضرب در قیمت خروجی، هر دو تقسیم بر یک میلیون.

این موضوع دو نتیجه‌ی مهم برای متن فارسی دارد. اول اینکه اگر پاسخ را به فارسی می‌خواهید، توکن بیشتر در سمت خروجی یعنی همان سمت گران‌تر مصرف می‌شود. دوم اینکه در چت‌بات‌ها کل تاریخچه‌ی گفت‌وگو در هر پیام دوباره فرستاده می‌شود، پس هر توکن اضافه در پیام‌های قبلی بارها هزینه دارد. قیمت به‌روز هر مدل به تومان در صفحه‌ی قیمت‌ها آمده است.

چطور تعداد توکن را اندازه بگیریم؟

تخمین پیش از ارسال

برای اینکه پیش از نوشتن کد بدانید یک متن تقریباً چند توکن است، از شمارنده‌ی توکن هوشوانا استفاده کنید. متن را وارد کنید تا تخمینی از تعداد توکن و هزینه‌ی تقریبی ببینید. دقت کنید که این عدد یک تخمین است، چون هر مدل توکنایزر خودش را دارد.

عدد دقیق در پاسخ API

عدد قطعی را خود API در فیلد usage هر پاسخ برمی‌گرداند:

Python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://hooshvana.ir/api/v1",
    api_key=os.environ["HOOSHVANA_API_KEY"],
)

response = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "در دو جمله توضیح بده توکن چیست."}],
)

print(response.usage.prompt_tokens)      # توکن‌های ورودی
print(response.usage.completion_tokens)  # توکن‌های خروجی

یک روش خوب برای فهم رفتار توکنایزر این است که یک متن را یک بار به فارسی و یک بار به انگلیسی بفرستید و prompt_tokens را مقایسه کنید. این کار را با چند مدل مختلف تکرار کنید تا ببینید کدام برای متن شما به‌صرفه‌تر است.

لاگ‌های داشبورد

در بخش لاگ درخواست‌های داشبورد هوشوانا، برای هر درخواست مدل، توکن ورودی، توکن خروجی و هزینه‌ی نهایی به تومان ثبت می‌شود. با مرور این لاگ‌ها می‌فهمید کدام بخش برنامه بیشترین توکن را مصرف می‌کند.

روش‌های کاهش مصرف توکن

۱. پرامپت سیستمی را کوتاه و دقیق بنویسید

پرامپت سیستمی در هر درخواست فرستاده می‌شود. جمله‌های تکراری، تعارف و توضیح‌های غیرضروری را حذف کنید. دستورالعمل کوتاه و روشن معمولاً هم نتیجه‌ی بهتری می‌دهد و هم ارزان‌تر است.

۲. تاریخچه‌ی گفت‌وگو را خلاصه کنید

به‌جای فرستادن همه‌ی پیام‌های قبلی، پس از چند پیام، بخش قدیمی را با یک مدل ارزان خلاصه کنید و فقط خلاصه و چند پیام آخر را بفرستید.

۳. از کش پرامپت استفاده کنید

بعضی مدل‌ها برای بخش تکراری ابتدای پرامپت کش دارند و توکن‌های کش‌شده را ارزان‌تر حساب می‌کنند. اگر مدل شما از این قابلیت پشتیبانی می‌کند، بخش ثابت (دستورالعمل‌ها و اسناد) را اول و بخش متغیر را آخر بگذارید تا کش بهتر کار کند.

۴. طول خروجی را کنترل کنید

با تنظیم max_tokens و درخواست صریح پاسخ کوتاه، جلوی تولید متن طولانی و غیرضروری را بگیرید. برای خروجی ماشینی، JSON بخواهید نه توضیح متنی.

۵. مدل مناسب را انتخاب کنید

برای کارهای ساده لازم نیست از گران‌ترین مدل استفاده کنید. مدل‌هایی مثل GPT-4o Mini برای بسیاری از کارهای روزمره کافی‌اند. چون توکنایزرها متفاوت‌اند، ارزیابی مدل‌ها را روی متن فارسی خودتان انجام دهید، نه فقط بر اساس قیمت اعلام‌شده. روش‌های بیشتر را در مقاله‌ی کاهش هزینه‌ی API هوش مصنوعی بخوانید.

سؤال‌های رایج

آیا نوشتن پرامپت به انگلیسی ارزان‌تر است؟

معمولاً بله، چون متن انگلیسی در بیشتر توکنایزرها توکن کمتری می‌سازد. می‌توانید دستورالعمل سیستمی را به انگلیسی بنویسید و از مدل بخواهید پاسخ را به فارسی بدهد. ولی کیفیت پاسخ را هم بسنجید؛ گاهی دستورالعمل فارسی نتیجه‌ی طبیعی‌تری می‌دهد.

چرا عدد شمارنده‌ی توکن با عدد API فرق دارد؟

شمارنده یک تخمین کلی است و هر مدل توکنایزر خودش را دارد. علاوه بر این، API چند توکن هم برای ساختار پیام‌ها (نقش‌ها و جداکننده‌ها) حساب می‌کند. عدد قطعی همان مقدار usage در پاسخ است.

آیا حذف نیم‌فاصله توکن را کم می‌کند؟

ممکن است تفاوت کوچکی ایجاد کند، ولی متن را از نظر نگارشی نادرست می‌کند و ارزشش را ندارد. صرفه‌جویی واقعی از کوتاه کردن پرامپت و تاریخچه به دست می‌آید.

توکن‌های خروجی را چطور کم کنم؟

مقدار max_tokens را محدود کنید، در پرامپت طول پاسخ را مشخص کنید و در مدل‌های استدلالی سطح reasoning را برای کارهای ساده پایین بیاورید.

اولین درخواستتان را تا پنج دقیقه‌ی دیگر بفرستید