یک ویرگول ساده میتواند مرز بین یک پاسخ ریاضی دقیق و یک شکست خاموش در GPT-4 یا Claude 3.5 باشد. باید بدانید که اکثر مدلهای زبانی بزرگ (Large Language Model) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب میدهد — در اعداد بیش از سه رقم میلنگند؛ نه چون نمیتوانند «فکر کنند»، بلکه چون نمیتوانند اعداد را درست «ببینند».
این مشکل از نحوه توکنسازی (Tokenization) — یعنی برشهای کوچکی از متن، شبیه تکههای یک کیک طولانی که مدل تکهتکه میخورد — نشأت میگیرد. در دنیای فعلی هوش مصنوعی، روشی که مدل یک رشته عدد را به توکنها تبدیل میکند، تعیین میکند که آیا میتواند عملیات «دهبر-یک» (carry-over) را انجام دهد یا صرفاً نتیجه را حدس بزند. همانطور که در تحلیلهای قبلی ما دربارهی زیرساختهای مدلها اشاره کردیم، این مسئله نشاندهنده یک بدهی ساختاری در لایهی توکنسازی است.
مشکل چپ-به-راست
به نقل از مستندات فنی، توکنسازهای مدرن BPE مانند tiktoken که توسط OpenAI استفاده میشود، اعداد را به صورت تکتک نمیبینند. این سیستمها ابتدا یک عبارت منظم (regex) را اجرا میکنند که متن را به قطعات کوچک میشکند و سپس ادغامها را انجام میدهد.
الگوی مورد استفاده در cl100k_base و o200k_base به این صورت است که اعداد را در دستههای یک تا سه رقمی گروهبندی میکند. چون این اسکن از چپ به راست است، طول کل عدد تعیین میکند که مرزهای توکن کجا قرار بگیرند.
برای مثال، عدد ۱۲۳۴۵۶۷ به صورت ۱۲۳|۴۵۶|۷ تکه میشود. اما اگر رقم اول را حذف کنیم و عدد ۲۳۴۵۶۷ را بنویسیم، توکنساز همهچیز را جابهجا کرده و آن را به صورت ۲۳۴|۵۶۷ میبیند. در این حالت، هیچکدام از مرزهای توکن با حالت قبلی همراستا نیستند.
در حالت اول، «۴۵۶» نشاندهنده مرتبه هزارگان است، اما در حالت دوم، همان توکن نشاندهنده مرتبه یکان و دهگان است. مدل باید برای هر طول عدد، دوباره یاد بگیرد که کدام ارقام مربوط به کدام مرتبه هستند. این فشار محاسباتی باعث میشود مدل در تشخیص جایگاه ارقام دچار خطا شود.
ریشههای تاریخی و تکامل
این رویکرد تلاشی برای بهبود مدل GPT-2 بود که هیچ قاعده مشخصی برای اعداد نداشت و ارقام را بر اساس تکرار در دادههای آموزشی ادغام میکرد؛ مثلاً «۲۰۱۷» چون زیاد تکرار شده بود، یک توکن واحد بود اما اعداد تصادفی بهطور نامنظم تکه میشدند.
بر اساس بررسیهای فنی با کتابخانه tiktoken در پایتون، میتوان دید که عدد «۱،۲۳۴،۵۶۷» به دلیل وجود ویرگول، مدل را مجبور میکند توکنها را به صورت ۱، ویرگول، ۲۳۴، ویرگول و ۵۶۷ تولید کند. ویرگول چون عدد نیست، باعث شکستن اجباری رشته میشود.
مکانیسم شکست در محاسبات
الگوریتم جمع-زنی همواره از راست به چپ است، اما tiktoken از چپ به راست عمل میکند. وقتی مدل میخواهد ۷۶۵۴۳۲۱ را با ۶۵۴۳۲۱ جمع کند، اعداد اینگونه توکنسازی میشوند:
- ۷۶۵۴۳۲۱ ← ۷۶۵ | ۴۳۲ | ۱
- ۶۵۴۳۲۱ ← ۶۵۴ | ۳۲۱
رقم یکان عدد اول در یک توکن تکرقمی است، اما رقم یکان عدد دوم درون یک توکن سهرقمی محبوس شده است. مدل باید در لایههای میانی خود، ابتدا ۴۳۲ و ۳۲۱ را به اجزای صدگان، دهگان و یکان تجزیه کند و سپس بفهمد که این دو در جایگاههای متفاوتی قرار دارند.
از آنجا که انتقال رقم (Carry) یک عملیات غیرمحلی است، انتقال از توکن ۳۲۱ باید دقیقاً به جایگاه خاصی در توکن ۴۳۲ برسد. این پردازش باید در لایههای MLP رخ دهد و ترنسفورمرها معمولاً در این نوع همراستاسازیهای متغیر ضعیف هستند.
چالشهای همراستاسازی متغیر
دقت مدل با افزایش تعداد ارقام بهشدت افت میکند و زمانی که دو عدد طولهای متفاوتی دارند، این افت شدیدتر میشود. اگر خطاهای مدل شما بیشتر در اعدادی با طول متفاوت متمرکز است، بدانید که مشکل از توکنسازی است، نه ضعف در استدلال.
راهکار ویرگول
استفاده از جداکنندههای هزارگان (۱,۲۳۴,۵۶۷) با معرفی یک نویسه غیرعددی، توکنساز را مجبور میکند گروهبندی را از راست به چپ انجام دهد. در این حالت، توکن «۵۶۷» همیشه نشاندهنده صدگان، دهگان و یکان است، چه عدد ۱,۲۳۴,۵۶۷ باشد و چه ۲۳۴,۵۶۷.
این نظم دادهای، ثباتی را ایجاد میکند که مدل برای محاسبه به آن نیاز دارد. حتی در مدلهای Claude که توکنساز آنها منتشر نشده، با بررسی تعداد توکنها میبینیم که فرمتهای مختلف، تعداد توکنهای متفاوتی مصرف میکنند و این تأیید میکند که مرزهای برش تغییر کرده است.
ریسکهای عملیاتی در تولید
طبق گزارشی که در ۲۰ ژوئیه ۲۰۲۶ در وبسایت dev.to منتشر شد، این جابهجایی توکنها منجر به ۵ باگ جدی در محیط عملیاتی میشود:
- خطای استخراج: شناسههای طولانی (مثل شماره حسابها) هنگام کپی شدن، اغلب یک رقم گم میکنند چون مرزهای برش ورودی و خروجی متفاوت است.
- انحراف تجمیعی: هنگام جمع ستونی از اعداد بدون فرمت، خطاها با اختلاف طول اعداد رابطه دارند، نه با بزرگی آنها.
- شکست در بازیابی: یک سامانه تولید بازیابیافزا (RAG) — مثل دانشآموزی که قبل از جواب دادن، اول کتاب درسی را باز میکند و از آن نقل میآورد — ممکن است عدد «۱۲۳۴۵۶۷» را با «۱,۲۳۴,۵۶۷» تطبیق ندهد.
- مشکلات اعتماد: احتمال خطا (logprobs) روی توکنهای سهرقمی محاسبه میشود، بنابراین عدم قطعیت سه رقم در یک عدد واحد ادغام شده و کالیبراسیون تکرقم غیرممکن میشود.
- تخلیه حافظه کش: فرمتهای متفاوت اعداد در هر نوبت گفتگو، تطابق پیشوندی (prefix match) در حافظه کش پرامپت را میشکند و مدل مجبور میشود بستر متن را دوباره پردازش کند.
جایگزینها و موازنهها
خانوادههای دیگر مانند Llama 2، Gemma و DeepSeek هر رقم را به صورت یک توکن جداگانه میشکنند. این روش برای ریاضیات عالی است چون جایگاه هر رقم دقیقاً همان ایندکس توکن است.
اما هزینه آن زیاد است. یک عدد ۱۲ رقمی به جای ۴ توکن، ۱۲ توکن مصرف میکند. در اسناد مالی یا لاگهای سیستمی، این کار هزینه پردازش و حافظه را ۲ تا ۳ برابر میکند. به همین دلیل است که محدودیت ۳ رقمی tiktoken несмотря بر نقصهای ریاضی، همچنان رایج است. بهینهسازی این هزینهها در مقیاس بزرگ، موضوعی است که رویکردهای جدیدی مانند مدلهای Request-Based برای کاهش هزینههای پردازش در متون طولانی سعی در حل آن دارند.
دستورالعملهای پیادهسازی
توسعهدهندگان باید فرمت اعداد را در مرحله ساخت پرامپت نرمالسازی کنند. برای مقادیر عددی، استفاده از کتابخانه Decimal توصیه میشود تا از خطاهای عدد اعشاری (مثل ۰.۳۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۴) جلوگیری شود.
قواعد فرمتبندی دادهها:
- مقادیر: همیشه از جداکننده هزارگان و تعداد ثابت ارقام اعشاری استفاده کنید (۱,۲۳۴.۵۰).
- شناسهها: برای شماره سفارش از ویرگول استفاده نکنید چون معنای مقدار میدهد؛ بهجای آن از خط تیره با عرض ثابت استفاده کنید (
S-1234-5678). - واحدها: واحدها را به عنوان توکن جداگانه بنویسید (مثلاً «۱,۲۳۴ ms» نه «1234ms»).
- ثبات: فرمت دادههای ورودی و کوئریها را یکسان نگه دارید تا بازیابی دادهها مختل نشود.
سلسلهمراتب صحت
فرمتبندی تنها یک اقدام برای کاهش خسارت است، نه یک ماشینحساب. برای هر محاسبه حساس، تنها راه مطمئن ارجاع تکلیف به یک ابزار خارجی مثل مفسر پایتون یا API ماشینحساب است.
در جریانهای کاری «استفاده از ابزار» (Tool Use)، وظیفه مدل از محاسبه به استخراج تغییر میکند. در اینجا، فرمت سهرقمی tiktoken تبدیل به یک مزیت میشود چون تعداد توکنهای خروجی را کم کرده و احتمال گم شدن ارقام را کاهش میدهد.
گام بعدی شما
- تمام اعداد حساس در پرامپتهای خود را با جداکننده هزارگان (ویرگول) فرمت کنید.
- اگر از RAG استفاده میکنید، در مرحله اینجست (Ingest) تمام اعداد را به یک فرمت واحد نرمال کنید.
- برای محاسبات دقیق، بهجای تکیه بر مدل، از قابلیت Function Calling برای اجرای کدهای پایتون استفاده کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو