stop losing the pages that matter most to a stray backslash

مدلِ vision در متنِ ریاضی LaTeX می‌نویسد (\frac، \sqrt، \vec) و بک‌اسلشِ تنها
در JSON نامعتبر است، پس json.loads کلِ صفحه را دور می‌ریخت — دقیقاً صفحه‌های
پرفرمول، یعنی باارزش‌ترین‌ها. روی حسابان یازدهم/دوازدهم چهار صفحه هرچه تلاش
شد «خطادار» ماندند تا همین‌جا پیدا شد.

⚠️ نسخه‌ی اولِ تعمیر خودش تله داشت: \f، \t، \b، \r و \n از نظرِ JSON معتبرند،
پس «سالم» رد می‌شدند و \frac به formfeed+«rac» و \theta به tab+«heta» تبدیل
می‌شد — خرابیِ بی‌صدا به‌جای خطای بلند. قاعده‌ی تفکیک: دستورِ LaTeX همیشه با
حرفِ ASCII ادامه می‌یابد، ولی escapeِ واقعی با رقم، فارسی یا پایانِ رشته.

کنارش: پایه‌های یازدهم و دوازدهم به persona و تشخیصِ پایه اضافه شدند («دوازدهم»
پیش از «دهم» بررسی می‌شود چون زیررشته‌اش را دارد)، سقفِ max_tokens از ۳۰۰۰ به
۶۰۰۰ رفت چون قاعده‌ی self-contained خروجی را بلندتر کرده، و حسابان یازدهم و
دوازدهم با نگاشتِ فصل‌به‌صفحه ثبت شدند.

«حسابان» به MATH_SUBJECTS اضافه شد: بدونِ آن retrieval این کتاب‌ها را «درسِ
متنی» می‌دید و به‌جای chapter روی lesson_number فیلتر می‌کرد — بی‌هیچ خطایی
همیشه صفر نتیجه.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-20 12:35:46 +03:30
parent 8eedbdeac0
commit b115ccd37a
3 changed files with 156 additions and 7 deletions

View File

@@ -286,8 +286,87 @@ MATH_7 = Textbook(
),
)
# ── حسابان ─────────────────────────────────────────────────────────────
# «حسابان» کتابِ رشته‌ی ریاضی‌فیزیک است، نه «ریاضی» عمومی. subject عمداً
# «حسابان» است تا collection جدا بماند: هم‌نامیِ آن با «ریاضی یازدهم»
# (کتابِ تجربی) دو کتابِ متفاوت را سرِ یک collection می‌انداخت.
# ⚠️ هر subjectِ تازه‌ی ریاضی‌وار باید به known_collections.MATH_SUBJECTS هم
# اضافه شود، وگرنه retrieval آن را «درسِ متنی» می‌بیند و به‌جای `chapter`
# روی `lesson_number` فیلتر می‌کند — یعنی بی‌سروصدا هیچ‌وقت چیزی برنمی‌گرداند.
#
# بازه‌ها از فهرستِ خودِ کتاب (PDF صفحه‌ی ۵) درآمده‌اند و page_offset با
# تطبیقِ صفحه‌ی ۱ کتاب روی صفحه‌ی ۷ PDF تأیید شده است.
CALCULUS_11 = Textbook(
subject='حسابان', grade='یازدهم', grade_label='یازدهم',
filename='حسابان یازدهم.pdf', page_offset=6,
chapters=_ch(
(1, 'فصل ۱: جبر و معادله', 1, 36, (
(1, 'مجموع جمله‌های دنباله‌های حسابی و هندسی', 2),
(2, 'معادله‌های درجه دوم', 7),
(3, 'معادله‌های گویا و گنگ', 17),
(4, 'قدر مطلق و ویژگی‌های آن', 23),
(5, 'آشنایی با هندسه تحلیلی', 29),
)),
(2, 'فصل ۲: تابع', 37, 70, (
(1, 'آشنایی بیشتر با تابع', 38),
(2, 'انواع توابع', 44),
(3, 'وارون تابع', 54),
(4, 'اعمال روی توابع', 63),
)),
(3, 'فصل ۳: توابع نمایی و لگاریتمی', 71, 90, (
(1, 'تابع نمایی', 72),
(2, 'تابع لگاریتمی و لگاریتم', 80),
(3, 'ویژگی‌های لگاریتم و حل معادله‌های لگاریتمی', 86),
)),
(4, 'فصل ۴: مثلثات', 91, 112, (
(1, 'رادیان', 92),
(2, 'نسبت‌های مثلثاتی برخی زوایا', 98),
(3, 'توابع مثلثاتی', 105),
(4, 'روابط مثلثاتی مجموع و تفاضل زوایا', 110),
)),
(5, 'فصل ۵: حد و پیوستگی', 113, 151, (
(1, 'مفهوم حد و فرایندهای حدی', 114),
(2, 'حدهای یک‌طرفه (حد چپ و حد راست)', 123),
(3, 'قضایای حد', 130),
(4, 'محاسبه حد توابع کسری', 141),
(5, 'پیوستگی', 145),
)),
),
)
CALCULUS_12 = Textbook(
subject='حسابان', grade='دوازدهم', grade_label='دوازدهم',
filename='حسابان دوازدهم.pdf', page_offset=6,
chapters=_ch(
(1, 'فصل ۱: تابع', 1, 22, (
(1, 'تبدیل نمودار توابع', 2),
(2, 'تابع درجه سوم، توابع یکنوا و بخش‌پذیری و تقسیم', 13),
)),
(2, 'فصل ۲: مثلثات', 23, 44, (
(1, 'تناوب و تانژانت', 24),
(2, 'معادله‌های مثلثاتی', 35),
)),
(3, 'فصل ۳: حدهای نامتناهی ـ حد در بی‌نهایت', 45, 70, (
(1, 'حدهای نامتناهی', 46),
(2, 'حد در بی‌نهایت', 59),
)),
(4, 'فصل ۴: مشتق', 71, 110, (
(1, 'آشنایی با مفهوم مشتق', 72),
(2, 'مشتق‌پذیری و پیوستگی', 84),
(3, 'آهنگ متوسط تغییر و آهنگ لحظه‌ای تغییر', 102),
)),
(5, 'فصل ۵: کاربردهای مشتق', 111, 146, (
(1, 'اکسترمم‌های یک تابع و توابع صعودی و نزولی', 112),
(2, 'جهت تقعر نمودار یک تابع و نقطه‌ی عطف آن', 127),
(3, 'رسم نمودار تابع', 137),
)),
),
)
TEXTBOOKS: dict[str, Textbook] = {
b.key: b for b in (MATH_3, MATH_6, MATH_7, MATH_8, MATH_9, MATH_10)
b.key: b for b in (MATH_3, MATH_6, MATH_7, MATH_8, MATH_9, MATH_10,
CALCULUS_11, CALCULUS_12)
}
# کتاب‌هایی که واقعاً فایلِ PDF دارند و `rag_ingest_book` رویشان کار می‌کند.