- 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>
6.2 KiB
کتابهای درسی (PDF)
فایلهای PDF کتابهای درسی را در همین پوشه بگذارید. خودِ PDFها در گیت ذخیره نمیشوند (حجمشان زیاد است) — فقط همین فایل راهنما ردیابی میشود.
منبع
نسخهی رسمی و بهروزِ کتابها: https://irtextbook.ir (از خارج ایران در دسترس نیست؛ دانلود باید از داخل ایران انجام شود.)
اولویت (بهروزشده ۱۴۰۵/۰۶/۲۱)
سینیور اولویت را عوض کرد: از پایه ششم به بالا، با تمرکز روی پایههای ترانزیشنی ۶، ۷، ۹ و ۱۰. کتابهای ابتدایی (اول/دوم/چهارم/پنجم) که قبلاً دانلود شدهاند فعلاً در نوبت نیستند.
| پایه | وضعیت |
|---|---|
| سوم، ششم، هفتم | روی Qdrant هست (ساختهی تیم دیگر) — PDF نداریم جز هفتم |
| هشتم، نهم، دهم | ingest شده؛ بازخوانیِ صفحههای شکلدار مانده |
| یازدهم، دوازدهم | در نوبتِ ingest (۱۴۰۵/۰۶/۲۸) |
| چهارم، پنجم | ingest شد ۲۰۲۶-۱۰-۰۳ (درخواستِ دکتر: «از سوم به بعد»)؛ پنجم چاپِ ۱۴۰۵ است |
| اول، دوم | PDF موجود است، خارج از اولویتِ فعلی |
⚠️ کتابِ ریاضیِ یازدهم و دوازدهم چند رشته دارد (تجربی، ریاضیفیزیک، انسانی).
نامِ فایل و Textbook.grade باید رشته را مشخص کند، وگرنه دو کتابِ متفاوت
سرِ یک collection دعوا میکنند.
نامگذاری
نامِ فایل باید دقیقاً با filename در rag/services/textbooks.py یکی باشد،
مثلاً ریاضی نهم.pdf.
چطور ingest کنیم
# اول ببینید چه چیزی قرار است پردازش شود (رایگان، هیچ فراخوانیِ مدلی ندارد)
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 شدهاند، مسئلههایی دارند که به «شکلِ زیر» یا «جدولِ روبهرو» ارجاع میدهند بیآنکه محتوای آن شکل در متن آمده باشد. مدل آن شکل را دیده بود؛ فقط از او خواسته نشده بود بنویسدش. پس با خواندنِ دوبارهی همان صفحهها جبران میشود.
# اول ببینید چند صفحه و چه هزینهای — رایگان، هیچ فراخوانیِ مدلی ندارد
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ی که تیم دیگر دارد.