- rag: MATH_4 / MATH_5 textbooks (TOC and page offsets read from the PDFs) - content: grades 4 and 5 in the seed files: 7 units / 28 nodes each, 204 + 194 questions (every node >= 4), all re-solved blind once - subscription: Plan.bazaar_sku (admin); POST /api/subscription/purchase accepts paymentMethod=bazaar for packs, rejects unknown methods (was ignored) - payment: idempotency key cannot switch provider; discount codes refused on Bazaar orders (Bazaar charges the fixed SKU price) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
6.2 KiB
Markdown
98 lines
6.2 KiB
Markdown
# کتابهای درسی (PDF)
|
||
|
||
فایلهای PDF کتابهای درسی را در همین پوشه بگذارید. خودِ PDFها در گیت
|
||
ذخیره نمیشوند (حجمشان زیاد است) — فقط همین فایل راهنما ردیابی میشود.
|
||
|
||
## منبع
|
||
|
||
نسخهی رسمی و بهروزِ کتابها: <https://irtextbook.ir>
|
||
(از خارج ایران در دسترس نیست؛ دانلود باید از داخل ایران انجام شود.)
|
||
|
||
## اولویت (بهروزشده ۱۴۰۵/۰۶/۲۱)
|
||
|
||
سینیور اولویت را عوض کرد: **از پایه ششم به بالا**، با تمرکز روی پایههای
|
||
ترانزیشنی ۶، ۷، ۹ و ۱۰. کتابهای ابتدایی (اول/دوم/چهارم/پنجم) که قبلاً
|
||
دانلود شدهاند فعلاً در نوبت نیستند.
|
||
|
||
| پایه | وضعیت |
|
||
|---|---|
|
||
| سوم، ششم، هفتم | روی Qdrant هست (ساختهی تیم دیگر) — PDF نداریم جز هفتم |
|
||
| هشتم، نهم، دهم | ingest شده؛ بازخوانیِ صفحههای شکلدار مانده |
|
||
| یازدهم، دوازدهم | در نوبتِ ingest (۱۴۰۵/۰۶/۲۸) |
|
||
| چهارم، پنجم | ingest شد ۲۰۲۶-۱۰-۰۳ (درخواستِ دکتر: «از سوم به بعد»)؛ پنجم چاپِ ۱۴۰۵ است |
|
||
| اول، دوم | PDF موجود است، خارج از اولویتِ فعلی |
|
||
|
||
⚠️ کتابِ ریاضیِ یازدهم و دوازدهم چند رشته دارد (تجربی، ریاضیفیزیک، انسانی).
|
||
نامِ فایل و `Textbook.grade` باید رشته را مشخص کند، وگرنه دو کتابِ متفاوت
|
||
سرِ یک collection دعوا میکنند.
|
||
|
||
## نامگذاری
|
||
|
||
نامِ فایل باید دقیقاً با `filename` در `rag/services/textbooks.py` یکی باشد،
|
||
مثلاً `ریاضی نهم.pdf`.
|
||
|
||
## چطور ingest کنیم
|
||
|
||
```bash
|
||
# اول ببینید چه چیزی قرار است پردازش شود (رایگان، هیچ فراخوانیِ مدلی ندارد)
|
||
python manage.py rag_ingest_book --grade نهم --plan
|
||
|
||
# یک فصل، با سقفِ صفحه برای کنترلِ هزینه
|
||
python manage.py rag_ingest_book --grade نهم --chapters 1 --max-pages 5
|
||
|
||
# کلِ کتاب (از جایی که مانده ادامه میدهد)
|
||
python manage.py rag_ingest_book --grade نهم
|
||
```
|
||
|
||
هر اجرا صفحههایی را که قبلاً chunk ساختهاند رد میکند، پس قطع کردنش با
|
||
Ctrl-C بیخطر است و اجرای دوباره هزینهی رفته را دوباره نمیپردازد.
|
||
|
||
## بازخوانیِ صفحههای معیوب
|
||
|
||
کتابهایی که پیش از افزوده شدنِ قاعدهی «self-contained» به پرامپت ingest
|
||
شدهاند، مسئلههایی دارند که به «شکلِ زیر» یا «جدولِ روبهرو» ارجاع میدهند
|
||
بیآنکه محتوای آن شکل در متن آمده باشد. مدل آن شکل را **دیده بود**؛ فقط از او
|
||
خواسته نشده بود بنویسدش. پس با خواندنِ دوبارهی همان صفحهها جبران میشود.
|
||
|
||
```bash
|
||
# اول ببینید چند صفحه و چه هزینهای — رایگان، هیچ فراخوانیِ مدلی ندارد
|
||
python manage.py rag_ingest_book --grade نهم --refresh both --plan
|
||
|
||
# فقط صفحههای ارجاعدهنده به شکل/جدول
|
||
python manage.py rag_ingest_book --grade نهم --refresh figures
|
||
|
||
# صفحههای مشخص (وقتی خودتان فهرست دارید)
|
||
python manage.py rag_ingest_book --grade نهم --refresh-pages 18,44,60-65
|
||
```
|
||
|
||
سه نکته که باید بدانید:
|
||
|
||
- **بازخوانی پاک میکند.** واحدِ کار «صفحه» است نه chunk، چون vision یک صفحه را
|
||
یکجا میخواند. پس chunkهای سالمِ همان صفحه هم دور ریخته و از نو ساخته
|
||
میشوند و `solution_verdict`شان پاک میشود. فرمان پیش از خرج کردن نشان
|
||
میدهد چند تای آنها رأیِ «agrees» داشتهاند و تأیید میگیرد (`--yes` رد میکند).
|
||
- **بعدش `rag_verify_solutions` را دوباره اجرا کنید،** وگرنه chunkهای تازه
|
||
بیرأی میمانند و تولیدِ سؤال — که فقط `agrees` میخواند — نادیدهشان میگیرد.
|
||
- **پاکسازی صفحهبهصفحه است،** درست پیش از خواندنِ همان صفحه. پس قطعِ وسطِ کار
|
||
(Ctrl-C، تمام شدنِ اعتبار) فقط یک صفحه را خالی میگذارد، نه کلِ کتاب را.
|
||
|
||
## افزودنِ کتابِ جدید
|
||
|
||
در `rag/services/textbooks.py` یک `Textbook` بسازید با:
|
||
|
||
- `page_offset` — اختلافِ شمارهی صفحهی چاپشده با شمارهی صفحه در PDF
|
||
(جلد و فهرست جلوترند). از روی فهرستِ کتاب و بازبینیِ یک صفحهی مرزی درمیآید.
|
||
- `chapters` — بازهی صفحهی هر فصل بر اساسِ شمارهی چاپشده. بازهها باید
|
||
پشتِهم و بدونِ حفره باشند (تستِ `TextbookLayoutTests` همین را چک میکند).
|
||
- `grade_label` — همان رشتهای که در payloadِ `grade` مینشیند.
|
||
|
||
عنوانِ فصلها خودکار در `known_collections.MATH_CHAPTERS` ثبت میشود، پس
|
||
جستجو بلافاصله میتواند شمارهی فصل را به رشتهی دقیق تبدیل کند.
|
||
|
||
## بعدش چه اتفاقی میافتد
|
||
|
||
هر صفحه به تصویر تبدیل میشود، مدل vision انواع مسئله را استخراج میکند
|
||
(`type` / `keywords` / `generalSolution` / `problem` / `solution`)، نتیجه هم در
|
||
جدول `rag.LessonChunk` (منبع حقیقت، پیش خودمان) ذخیره میشود و هم بهصورت
|
||
نقطه در Qdrant ایندکس میشود — با همان قرارداد payloadی که تیم دیگر دارد.
|