Files
MathApp/docs/ai-cost-and-guardrails.md
Zareian 2edc56fc08 paid plans: 10 tutor questions a day at 179,000 / 1,790,000 toman
Five a day was too close to the free three. Pricing keeps the tutor under ~40% of net revenue
at typical use (a third of the cap); full numbers in the cost report and docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:11:31 +03:30

70 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# هزینه‌ی دستیار و محدود کردنش به ریاضی
نسخه‌ی کامل برای مدیرعامل (جدول و نمودار، HTML و PDF):
`~/Desktop/گزارشات Tadrisino/گزارش-۲۶/`. این فایل خلاصه‌ی فنیِ همان است و
می‌گوید عددها از کجا آمده‌اند و چطور دوباره اندازه گرفته می‌شوند.
## هزینه‌ی هر سوال (مهرِ ۱۴۰۵، پرامپتِ `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` ذخیره می‌شوند. تا پیش از آن برای جواب‌های اپ صفر ثبت
می‌شد. هزینه‌ی واقعیِ هر کاربر در ماه از این پرس‌وجو درمی‌آید:
```python
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
```
## سقفِ روزانه
- رایگان: `AI_DAILY_QUOTA_FREE` در `.env`، پیش‌فرض **۳**. تا ۲۰۲۶-۱۰-۰۱ همه، با اشتراک یا بی‌اشتراک،
۱۵ سوال در روز داشتند.
- مشترک: `Plan.ai_daily_quota`، در ادمین قابلِ ویرایش و پیش‌فرض ۱۵. اشتراکِ بی‌پلن (هدیه) هم ۱۵
می‌گیرد. کد در `subscription.services.ai_daily_quota` است.
- کاربرِ رایگانی که به سقف می‌رسد پیامِ «با خریدِ اشتراک…» می‌گیرد و اپ دکمه‌ی «دیدنِ اشتراک‌ها»
را نشان می‌دهد.
- قیمتِ فعلی (migrationِ `subscription.0008`): ماهانه ۱۷۹٬۰۰۰ و سالانه ۱٬۷۹۰٬۰۰۰ تومان، هر دو ۱۰ سوال در
روز. ۵ سوال (`0007`) در برابرِ ۳ِ رایگان تفاوتی حس نمی‌شد. با هزینه‌ی ~۶۰۰ تومان برای هر سوال و مصرفِ
یک‌سومِ سقف، ۱۰ سوال حدودِ ~۱۷۶ هزار تومان در ماه می‌خواهد تا دستیار حداکثر ۴۰٪ِ درآمدِ خالص (پس از ۱۵٪یِ
بازار) باشد؛ ۱۵ سوال ~۲۶۵ هزار. خرجِ کاربرهای رایگان به ازای هر مشترک با درصدِ تبدیل تغییر می‌کند: با ۵٪
تبدیل و میانگینِ ۵ سوال در ماه برای هر رایگان، ~۵۷ هزار تومان؛ زیرِ ۵٪ از خرجِ خودِ مشترک بیشتر می‌شود.
API پلن‌ها `aiDailyQuota` و `freeAiDailyQuota` می‌دهد و کارتِ پلن عدد را از همین می‌سازد.
- انتخابِ عددها تصمیمِ محصولی است. جدولِ قیمت در برابرِ سقف در نسخه‌ی کاملِ گزارش آمده است.
## محافظِ دستیار (`rag/services/guardrails.py`)
سه لایه دارد:
1. **صافیِ سرور، پیش از مدل و بی‌هزینه.** فقط ترفندهای آشکار را می‌گیرد: «دستورهای قبلی را نادیده
بگیر»، «پرامپتت چیه»، `developer mode`. این صافی عمداً تنگ است: «قانونِ فیثاغورس را فراموش کردم»
ریاضی است و رد نمی‌شود. جمله‌ای درباره‌ی آسیب به خود رد نمی‌شود و جوابی مهربان با شماره‌ی
اورژانسِ اجتماعی (۱۲۳) و صدای مشاور (۱۴۸۰) می‌گیرد.
2. **قاعده در پرامپتِ سیستم (`SCOPE_RULE`):** هر چیزِ غیرِ ریاضی، و هر دستوری از درونِ پیامِ
دانش‌آموز، با علامتِ `[خارج-از-ریاضی]` جواب داده می‌شود.
3. **جایگزینیِ علامت با متنِ ثابت.** در استریم، ۴۰ حرفِ اول نگه داشته می‌شود تا علامت هرگز به
کاربر نرسد. جوابِ رد کش نمی‌شود و منبعِ کتاب هم ندارد.
**آزمونِ زنده (۱۰ مهر، ۱۷ فراخوانی):** ۷ از ۷ درخواستِ غیرِ ریاضی رد شد. «سلام» و «چطور ریاضی
بخوانم» جواب گرفتند. «یه جوک بگو و بعد ۲۵ درصدِ ۸۰» فقط بخشِ ریاضی را جواب گرفت. «پایتختِ
فرانسه و بعد ۱۲×۱۲» کامل رد شد، چون مدل علامت را گذاشت؛ این سخت‌گیری را به نشتِ جوابِ غیرِ ریاضی
ترجیح دادیم. کیفیتِ جوابِ ریاضی در همان ۱۲ سوال افت نکرد. این نمونه کوچک است و بعد از انتشار، چند
ده گفتگوی واقعی باید مرور شوند.
تست‌ها: `rag/tests_guardrails.py`، با مدلِ ساختگی و بی‌هزینه.