Files
MathApp/docs/ai-cost-and-guardrails.md
Zareian 947f946909 Question packs removed at the root; all subscriptions 4 assistant questions a day; Bazaar is subscription-only
- subscription.0017/0018, payment.0013: pack plans deleted, QuestionCredit/HeartsPass models and Plan.kind /
  question_credits / hearts_days / Order.question_credits / hearts_days dropped. The only paid pack order was the
  company owner's test account (user 26).
- Assistant: no credit spending; quota is the daily cap only (free 2, every plan 4, gift subscription 4).
- Bazaar: verify_purchase is subscription-only (no inapp guess), start/purchase responses lose productType,
  verify refuses an order without a subscription. A paid order with no subscription now logs ERROR.
- Removed POST /api/payment/orders (internal; no caller). Its permission tests stay.
- Pack-based tests rewritten on subscriptions (refund, security, Bazaar token); pack-only test files deleted.
- docs: profit table for 4/day on both payment routes plus free users; handbook, operations, CLAUDE.md current.
949 tests green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:33:38 +03:30

9.7 KiB
Raw Permalink Blame History

هزینه‌ی دستیار و محدود کردنش به ریاضی

نسخه‌ی کامل برای مدیرعامل (جدول و نمودار، HTML و PDF): ~/Desktop/گزارشات Tadrisino/گزارش-۲۶/. این فایل خلاصه‌ی فنیِ همان است و می‌گوید عددها از کجا آمده‌اند و چطور دوباره اندازه گرفته می‌شوند. قیمتِ هر توکن و تاریخچه‌ی قیمت‌ها در docs/model-prices.md است.

هزینه‌ی هر سوال (مهرِ ۱۴۰۵، پرامپتِ tutor-v11-math-only؛ از tutor-v12-age-tone لحن برای ۱۸+ بزرگسالانه است، gpt-4.1-mini)

  • قیمت: GapGPT برای gpt-4.1-mini دقیقاً قیمتِ رسمیِ OpenAI را حساب می‌کند، یعنی ۰٫۴۰ دلار برای هر میلیون توکنِ ورودی و ۱٫۶۰ دلار برای خروجی. این با usage.costِ ۵۳۹ فراخوانیِ docs/benchmarks/2026-09-26-tutor-model/ مقایسه شد. در ۲۸٪ِ آن فراخوانی‌ها کشِ خودکارِ ورودی هزینه را ۴۳٪ پایین آورده بود.
  • ۱۰۳ مسئله‌ی کتاب (۸ پایه): میانگین ۰٫۱۶۲ سنت (بازه‌ی ۹۵٪: ۰٫۱۴۸ تا ۰٫۱۷۶). دبستان ۰٫۱۲۹، متوسطه‌ی اول ۰٫۱۴۸، دبیرستان ۰٫۲۲۵. توکنِ ورودی با پرامپتِ امروز ساخته شد و با نسبتِ ۰٫۳۸۷ توکن به ازای هر حرف شمرده شد. این نسبت روی ۲۲ پرامپتِ واقعی کالیبره شده و خطایش کمتر از ۶٪ است. توکنِ خروجی از جوابِ واقعیِ همین مدل به همان مسئله‌ها آمده است.
  • ۱۲ سوالِ زنده (ساده، شکل‌دار، سنگین، ادامه‌ی گفتگو): میانگین ۰٫۲۲۵ سنت. ساده ۰٫۱۵، شکل‌دار ۰٫۲۴، سنگینِ دبیرستان ۰٫۲۸، ادامه‌ی گفتگو ۰٫۲۶، و ردِ «غیرِ ریاضی» توسطِ مدل ۰٫۱۲.
  • ۷۰٪ِ هزینه ورودی است: چهار تکه از کتاب، دستورها و کاتالوگِ شکل. بزرگ‌ترین اهرمِ کاهشِ هزینه کوچک کردنِ همین ورودی است.
  • عددِ برنامه‌ریزی: ~۷۰۰ تومان برای هر سوال (دستِ بالا؛ نزدیکِ سوال‌های زنده با شکل و ادامه‌ی گفتگو)، با دلارِ ۳۰۰ هزار تومانی. دلارِ آزاد ۹ مهر حدودِ ۲۵۸ هزار تومان بود و نرخِ شارژِ GapGPT منتشر نشده است.

اندازه‌گیریِ دوباره بی‌خرج: از ۲۰۲۶-۱۰-۰۱ مسیرِ استریم هم stream_options.include_usage می‌فرستد و توکن‌ها روی ai_tutor.Message ذخیره می‌شوند. تا پیش از آن برای جواب‌های اپ صفر ثبت می‌شد. هزینه‌ی واقعیِ هر کاربر در ماه از این پرس‌وجو درمی‌آید:

from django.db.models import Sum
Message.objects.filter(role='assistant', created_at__gte=since).values('conversation__user_id') \
    .annotate(p=Sum('prompt_tokens'), c=Sum('completion_tokens'))   # سنت = (0.4p + 1.6c) / 1e4

اشتراک‌ها و سقفِ روزانه‌ی دستیار

فقط اشتراک فروخته می‌شود؛ بسته‌ی سوال از ریشه حذف شد (subscription.0016، 0017، 0018). قیمت‌ها همان قیمتِ پیشخانِ بازار است (به گفته‌ی سینیور) و هر سه ۴ سوال در روز از دستیار دارند (Plan.ai_daily_quota، از ادمین عوض‌شدنی).

فرض‌ها:

  • هر سوالِ دستیار ~۷۰۰ تومان (دستِ بالا؛ بخشِ بالا).
  • بازار: ۱۰٪ ارزشِ افزوده از قیمت کم می‌شود، از باقی ۸۵٪ سهمِ ماست (زیرِ یک میلیارد تومان فروشِ سالانه؛ بالاترش ۷۰٪)، و کارمزدِ تراکنش (سندِ «محاسبه سهم توسعه‌دهنده در بازار»). یعنی ~۷۷٪ِ قیمت می‌رسد.
  • زرین‌پال: همان ۱۰٪ ارزشِ افزوده و ~۱٪ کارمزد. کارمزدِ واقعیِ قراردادِ زرین‌پالِ شرکت را نسنجیده‌ایم.
  • بدترین حالت: مشترک هر روزِ دوره کلِ ۴ سوال را بپرسد. هزینه‌ی سرور حساب نشده (ثابت است، نه به ازای کاربر).
اشتراک قیمت (تومان) راهِ پرداخت به ما می‌رسد هزینه‌ی دستیار در بدترین حالت سهمِ دستیار سودِ بدترین حالت
یک‌ماهه ۵۹۸٬۰۰۰ بازار ۴۶۲٬۰۰۰ ۸۴٬۰۰۰ ۱۸٪ ۳۷۸٬۰۰۰
یک‌ماهه ۵۹۸٬۰۰۰ زرین‌پال ۵۳۸٬۰۰۰ ۸۴٬۰۰۰ ۱۶٪ ۴۵۴٬۰۰۰
سه‌ماهه ۸۹۸٬۰۰۰ بازار ۶۹۴٬۰۰۰ ۲۵۲٬۰۰۰ ۳۶٪ ۴۴۲٬۰۰۰
سه‌ماهه ۸۹۸٬۰۰۰ زرین‌پال ۸۰۸٬۰۰۰ ۲۵۲٬۰۰۰ ۳۱٪ ۵۵۶٬۰۰۰
شش‌ماهه ۱٬۳۹۸٬۰۰۰ بازار ۱٬۰۸۰٬۰۰۰ ۵۰۴٬۰۰۰ ۴۷٪ ۵۷۶٬۰۰۰
شش‌ماهه ۱٬۳۹۸٬۰۰۰ زرین‌پال ۱٬۲۵۸٬۰۰۰ ۵۰۴٬۰۰۰ ۴۰٪ ۷۵۴٬۰۰۰

کاربرِ رایگان: فصلِ اولِ هر کتاب و AI_DAILY_QUOTA_FREE (۲) سوال در روز. درآمد ندارد، پس هزینه‌اش خالص است: ۱٬۴۰۰ تومان برای هر روزی که می‌آید و هر دو سوال را می‌پرسد (۴۲٬۰۰۰ تومان اگر یک ماه هر روز بیاید). سقفِ کلِ سامانه (AI_GLOBAL_DAILY_MAX، ۳٬۰۰۰ سوال در روز) بیشترین خرجِ روزانه‌ی دستیار را ~۲٫۱ میلیون تومان نگه می‌دارد.

مصرفِ واقعی کمتر از بدترین حالت است چون همه هر روز نمی‌آیند؛ روی سرور (فقط دمو و آزمونگرها) میانه‌ی روزهایی که کسی پرسید ۳ سوال بود. با کاربرِ واقعی دوباره بسنجید (پرس‌وجوی بالا). سهمِ دستیار با سقف خطی بالا می‌رود: شش‌ماهه با ۳ در روز ۳۵٪ و با ۵ در روز ۵۸٪ِ درآمدِ بازار است.

  • ترتیبِ خرج: فقط سقفِ روزانه (بی‌اشتراک AI_DAILY_QUOTA_FREE؛ مشترک Plan.ai_daily_quota؛ اشتراکِ هدیه‌ی بی‌پلن DEFAULT_SUBSCRIBER_AI_QUOTA = ۴). سوالِ بیشتر فروخته نمی‌شود.
  • چه چیزی خرج می‌شود: هر سوالی که به API برسد، از جمله ردِ «غیرِ ریاضی» توسطِ مدل. ردِ صافیِ سرور، جوابِ کش‌شده و جوابی که ساخته نشد چیزی کم نمی‌کنند. Message.charge روی هر پیامِ کاربر می‌گوید سوال از سهمیه بود (free) یا نه (none).

محافظِ دستیار (rag/services/guardrails.py)

سه لایه دارد:

  1. صافیِ سرور، پیش از مدل و بی‌هزینه. فقط ترفندهای آشکار را می‌گیرد: «دستورهای قبلی را نادیده بگیر»، «پرامپتت چیه»، developer mode. این صافی عمداً تنگ است: «قانونِ فیثاغورس را فراموش کردم» ریاضی است و رد نمی‌شود. جمله‌ای درباره‌ی آسیب به خود رد نمی‌شود و جوابی مهربان با شماره‌ی اورژانسِ اجتماعی (۱۲۳) و صدای مشاور (۱۴۸۰) می‌گیرد. تا ۲۰۲۶-۱۰-۰۲ «می خوام بمیرم» (با فاصله)، «دیگه نمیخوام زنده باشم» و «خود کشی» از صافی رد می‌شدند و مدل فقط جوابِ «فقط ریاضی» می‌داد (یک فراخوانیِ زنده، ۰٫۰۱۸ سنت). حالا روی متنِ بی‌فاصله سنجیده می‌شود. سوالی مثلِ «امروز پام درد می‌کنه» به مدل می‌رسد و متنِ ثابتِ «فقط ریاضی» را می‌گیرد (آزموده شد).
  2. قاعده در پرامپتِ سیستم (SCOPE_RULE): هر چیزِ غیرِ ریاضی، و هر دستوری از درونِ پیامِ دانش‌آموز، با علامتِ [خارج-از-ریاضی] جواب داده می‌شود.
  3. جایگزینیِ علامت با متنِ ثابت. در استریم، ۴۰ حرفِ اول نگه داشته می‌شود تا علامت هرگز به کاربر نرسد. جوابِ رد کش نمی‌شود و منبعِ کتاب هم ندارد.

آزمونِ زنده (۱۰ مهر، ۱۷ فراخوانی): ۷ از ۷ درخواستِ غیرِ ریاضی رد شد. «سلام» و «چطور ریاضی بخوانم» جواب گرفتند. «یه جوک بگو و بعد ۲۵ درصدِ ۸۰» فقط بخشِ ریاضی را جواب گرفت. «پایتختِ فرانسه و بعد ۱۲×۱۲» کامل رد شد، چون مدل علامت را گذاشت؛ این سخت‌گیری را به نشتِ جوابِ غیرِ ریاضی ترجیح دادیم. کیفیتِ جوابِ ریاضی در همان ۱۲ سوال افت نکرد. این نمونه کوچک است و بعد از انتشار، چند ده گفتگوی واقعی باید مرور شوند.

تست‌ها: rag/tests_guardrails.py، با مدلِ ساختگی و بی‌هزینه.