نصف مدلها در آزمون ما رد شدند — و تقصیر مدلها نبود
دوازده مدل زبانی را روی یک جستوجوی واقعی سنجیدیم و هشتتایشان خروجی ناخوانا دادند. علت، ناتوانی مدلها نبود؛ سقف ۵۱۲ توکنی خودمان بود که مدلهای استدلالی تمامش را صرف فکر کردن میکردند و به جواب نمیرسیدند.
سه ماه پیش یک فیلتر هوش مصنوعی نوشتیم که از میان آگهیهای خام فروشگاهها فقط همان کالایی را نگه دارد که کاربر واقعاً دنبالش بوده. این هفته دوازده مدل زبانی را روی همان تکلیف سنجیدیم تا ببینیم کدام را باید به کار بگیریم. هشت مدل خروجی خراب دادند. حدس اول ما این بود که آن هشت مدل ضعیفاند. اشتباه بود.
- ۱۲
- مدل، روی یک جستوجوی واقعی و یک پرامپت یکسان
- ۸
- مدلی که دستکم یک پاسخ ناخوانا داد
- ۱۵٪
- نرخ خرابی همین اشکال در زنجیره پشتیبان خودمان
- ۰٪
- همان نرخ، بعد از یک تغییر یکخطی
نشانهها: پاسخ خالی، بدون هیچ خطایی
مدلهای خراب پیام خطا نمیدادند. اتصال برقرار بود، توکن مصرف میشد، هزینه ثبت میشد — و محتوای پاسخ کاملاً خالی برمیگشت. برای برنامه ما این یعنی «فیلتر جواب نداد»، و در آن حالت کل فهرست خام فروشگاهها را به کاربر نشان میدهیم. یعنی خرابی بهجای پیام خطا، خودش را به شکل یک نتیجه شلوغ نشان میداد.
وقتی جزئیات فراخوانیها را از لاگ سرویسدهنده بیرون کشیدیم، الگو در سه عدد کاملاً روشن بود: تعداد توکن خروجی دقیقاً برابر سقف مجاز، تعداد «توکن استدلال» هم تقریباً همان عدد، و دلیل پایان پاسخ بهجای «تمام شد» نوشته بود «به سقف رسید».
یعنی مدل تمام بودجهای را که به او داده بودیم صرف فکر کردن کرده بود و وقتی نوبت نوشتن جواب رسید، دیگر جایی نمانده بود. مدلهای نسل جدید پیش از پاسخ برای خودشان استدلال مینویسند و آن استدلال هم از همان سهمیه خروجی کم میشود. سقف ما ۵۱۲ توکن بود — برای یک پاسخ کوتاه JSON کاملاً کافی، برای یک پاسخ کوتاه بهعلاوه چند صد توکن فکر کردن، نه.
آزمون: همان فراخوانیها با سقف چهار برابر
دقیقاً همان درخواستها را با سقف ۲۰۴۸ توکن تکرار کردیم. چیز دیگری تغییر نکرد: همان پرامپت، همان فهرست کالاها، همان دمای صفر.
| مدل | سقف ۵۱۲ | سقف ۲۰۴۸ | سقف ۵۰۰۰ | توکن استدلال |
|---|---|---|---|---|
| gemini-3.5-flash-lite | سالم | سالم | سالم | ۰ |
| gemma-4-31b | سالم | سالم | سالم | ۰ |
| gpt-5.4-nano | سالم | سالم | سالم | ۰ |
| gpt-5.6-luna | نیمی خراب | سالم | سالم | ~۳۸۰ |
| deepseek-v4-flash | نیمی خراب | سالم | سالم | ۰ تا ۵۶۵ |
| deepseek-v4-flash-0731 | خراب | سالم | سالم | ~۸۹۰ |
| ling-3.0-flash | خراب | نیمی خراب | سالم | ~۱۰۰۰ |
| qwen3.7-flash | خراب | خراب | سالم | ~۲۹۰۰ |
| hy3-preview | خراب | خراب | خراب | تا سقف، هر چه باشد |
| mimo-v2.5 | خراب | خراب | خراب | تا سقف، هر چه باشد |
| nemotron-3.5-lightning | خراب | خراب | خراب | تا سقف، هر چه باشد |
چهار مدل از آن هشت مدل «ضعیف»، با یک عدد در فایل تنظیمات درست شدند. سقف ۵۰۰۰ دو مدل دیگر را هم نجات داد و در نهایت همان را انتخاب کردیم — چون سنجیدیم و معلوم شد سقف بلندتر برای مدلی که به آن نیاز ندارد **هیچ هزینهای ندارد**: luna روی هر ۱۵۲ جستوجو با سقف ۲۰۴۸ و ۵۰۰۰ دقیقاً یکی است (۲۵۱ در برابر ۲۵۰ توکن استدلال، ۰٫۰۰۰۶۰۷ در برابر ۰٫۰۰۰۶۰۶ دلار). سقف یک «حداکثر» است، نه یک خرج. سه مدل باقیمانده با هیچ بودجهای درست نمیشوند.
بخش ناخوشایند: این اشکال در سامانه خودمان زنده بود
مدل اصلی ما استدلال نمیکند، پس این اشکال هرگز روی مسیر اصلی دیده نشد. اما زنجیره پشتیبان — همان که وقتی مدل اصلی از دسترس خارج میشود کار را دست میگیرد — با مدلی شروع میشد که استدلال میکند. یعنی این اشکال دقیقاً برای زمانی ذخیره شده بود که اوضاع از قبل خراب است.
برای اندازهگیری، ۱۵۲ جستوجوی واقعی ثبتشده را از لاگ خودمان دوباره از همان مدل گذراندیم:
- با سقف ۵۱۲: از هر هفت پاسخ، یکی ناخوانا برمیگشت (۱۵٪) و کاربر فهرست فیلترنشده میدید.
- با سقف ۲۰۴۸: صفر درصد.
این یعنی گزارش قبلی ما هم تا حدی اشتباه بوده است. در آن سنجش نوشتیم بهترین مدل ۷۸٪ از جستوجوهای خالی را نجات میدهد؛ آن عدد هم با همین سقف ۵۱۲ گرفته شده بود. با سقف درست، عدد واقعی ۹۶٪ است. ۱۸ واحد درصدی که فکر میکردیم محدودیت مدل است، محدودیت تنظیمات ما بود.
نرخ نجات، بعد از اصلاح
- gpt-5.6-luna۰٫۰۰۰۶ دلار هر فراخوانی۹۶
- gemma-4-31b (پولی)۰٫۰۰۰۳ دلار۷۱
- gemma-4-31b (رایگان)رایگان۶۹
- deepseek-v4-flash۰٫۰۰۰۶ دلار۵۸
- gemini-3.5-flash-lite۰٫۰۰۰۹ دلار — گرانترین۲۶
- سه مدل استدلالی بیمرزهیچ خروجی معتبری در هیچ سقفی۰
نکتهای که برای ما بیشترین ارزش را داشت: گرانترین گزینه فهرست، ضعیفترین نتیجه را هم داد. gemini-3.5-flash-lite سه برابر gemma هزینه دارد و یکسوم آن نجات میدهد. تنها برگ برندهاش سرعت است — و سرعت را میشود جای دیگری در زنجیره خرید، نه در جایی که کیفیت نتیجه تعیین میشود.
درس دوم: خروجی درست، عدد غلط
یک مدل در همه آزمونهای قالب خروجی نمره کامل گرفت و بعد در متن فارسیاش نوشت ارزانترین قیمت «۷۴,۵۰۰,۰۰۰ تومان» است و اسم فروشگاه را هم آورد. قیمت واقعی همان فروشگاه در همان فهرست ۷۵,۴۵۰,۰۰۰ تومان بود — رقمها جابهجا شده بودند. یک فروشنده دیگر را هم ۷۷,۹۹۰,۰۰۰ نوشت که عدد واقعیاش ۷۷,۹۹۹,۰۰۰ بود.
برای یک سایت مقایسه قیمت، این بدترین نوع خطاست: پاسخ کاملاً معتبر به نظر میرسد، قالبش درست است، اسم فروشگاه واقعی است و فقط عدد غلط است. آن مدل را کنار گذاشتیم. از آن به بعد هر عددی که مدل در متن مینویسد را بهطور خودکار با قیمتهای واقعی همان جستوجو مقایسه میکنیم.
اگر خودتان چنین چیزی میسازید
- سقف توکن خروجی شامل توکنهای استدلال هم میشود. اگر مدل استدلالی است، بودجهای که برای جواب در نظر گرفتهاید عملاً به آن نمیرسد.
- پاسخ خالی را مثل خطا رسیدگی کنید، نه مثل «مدل چیزی نگفت». ما دو حالت کاملاً متفاوت را در لاگ یکی ثبت میکردیم و به همین دلیل ماهها ندیدیمش.
- قیمت هر میلیون توکن، هزینه واقعی یک درخواست را پیشبینی نمیکند. یک مدل با تعرفه یکدهم بقیه، چون پیش از هر جواب صدها توکن فکر میکند، در عمل چند برابر خرج برمیدارد.
- قالب درست را با جواب درست اشتباه نگیرید. اعتبارسنجی JSON میگوید ساختار سالم است؛ درباره درستی عددهای داخلش چیزی نمیگوید.
روش سنجش و دادههای این گزارش ادامه بنچمارک قبلی ما روی ۱۱۲ جستوجوی فارسی است. همین فیلتر پشت نتایجی است که در قیمتهای زنده میبینید.