Files
Learn_System/plans/ct-math/DIGITIZATION_SPEC.md
T
Maxim Dolgolyov 055a6cd1a4 docs(ct-math): пивот плана на существующий банк questions (1753 задания ЦЭ/ЦТ)
Контент ЦЭ/ЦТ по математике уже в БД (questions, subject_id=3, 1753 задания
2011–2025, seed_math_ct*.js) — курс строим на нём через tests/assignments
(готовый mode='ct') и courses, а не через exam-prep/exam_tasks.

- plans/ct-math/BUILD_ON_QUESTIONS.md — новый основной тех-документ: схема
  questions/topics/tests/assignments, режимы ct/topic, таксономия и её доведение,
  каркас курса, диагностика из реальных вопросов, прогресс, порядок работ
- примечания-пивот в PLAN (§6/§8), TOPICS_SEED, DIGITIZATION_SPEC (помечены
  вторичными: exam-prep — опция, оцифровка уже сделана), пилотах, README
- difficulty приведён к шкале банка 1–3

Миграция 077 оставлена как опция exam-prep, в БД не применяется.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 21:56:33 +03:00

198 lines
14 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.
# Спецификация оцифровки заданий РТ/ЦТ → `exam_tasks` + диагностика
> ⚠️ **БОЛЬШЕЙ ЧАСТЬЮ УЖЕ СДЕЛАНО / ВТОРИЧНО.** Оцифровка ЦЭ/ЦТ по математике **уже выполнена** —
> 1753 задания в банке `questions` (скрипты `backend/scripts/seed_math_ct*.js`, 20112025). Поэтому
> этот документ (перенос в `exam_tasks` exam-prep) **не основной**. Сборка курса и диагностики — на
> существующем банке: **[BUILD_ON_QUESTIONS.md](BUILD_ON_QUESTIONS.md)**. Текст ниже актуален лишь
> для (а) будущей добивки годов в формате `seed_math_ct*` (правило: 1 вариант из сборника, без
> повторов — см. память `project_ct_seeded`), либо (б) если перейдём на exam-prep.
> Как переносить задания из PDF (РТ 20062025, ЦТ/ЦЭ 20042024) в банк `exam_tasks` трека `ctmath`,
> как их классифицировать (тема/сложность/тип) и как собрать входной диагностический тест.
> Опирается на реальные конвейеры платформы: `backend/scripts/import-exam-tasks.js` (импорт),
> `tag-exam-tasks.js` (классификатор темы), формат вариантов `frontend/js/exam9/variants/v*.js`.
---
## 1. Схема целевой таблицы (напоминание)
```sql
exam_tasks(
id, exam_key, variant, task_idx,
task_type TEXT CHECK (task_type IN ('mc','open','long')),
text_html, figure_html, opts_json, answer, solution_html,
topic, subtopic, difficulty,
UNIQUE(exam_key, variant, task_idx)
)
```
Для трека: `exam_key='ctmath'`, `variant` = номер варианта (сквозная нумерация по источникам, см. §6), `task_idx` = 1..30.
---
## 2. Маппинг номера задания → тип и подтема
Позиция в ЦЭ/ЦТ почти жёстко задаёт тему (карта §1.2 PLAN.md). Это **дефолт классификатора** — экономит ручную разметку; правится точечно, если конкретный вариант отклонился.
| task_idx | task_type | topic (раздел) | subtopic (по умолчанию) | difficulty |
|---|---|---|---|---|
| 1 (А1) | mc | numbers | `num-real` | 1 |
| 2 (А2) | mc | stereometry | `ster-basics` | 2 |
| 3 (А3) | mc | trigonometry | `trig-circle` | 1 |
| 4 (А4) | mc | numbers | `num-divisibility` | 1 |
| 5 (А5) | mc | equations | `eq-quadratic` | 1 |
| 6 (А6) | mc | equations | `eq-linear` | 2 |
| 7 (А7) | mc | word-sequences | `word-problems` | 2 |
| 8 (А8) | mc | trigonometry | `trig-identities` | 2 |
| 9 (А9) | mc | stereometry | `ster-rotation` | 3 |
| 10 (А10) | mc | expressions | `expr-powers-roots` | 2 |
| 11 (В1) | open | stereometry | `ster-angles-distances` | 3 |
| 12 (В2) | open | functions | `fn-properties` | 2 |
| 13 (В3) | open | word-sequences | `seq-progressions` | 2 |
| 14 (В4) | open | trigonometry | `trig-identities` | 3 |
| 15 (В5) | open | planimetry | `plan-triangles` | 3 |
| 16 (В6) | open | word-sequences | `seq-progressions` | 3 |
| 17 (В7) | open | word-sequences | `word-problems` | 3 |
| 18 (В8) | open | equations | `eq-linear` | 2 |
| 19 (В9) | open | functions | `fn-properties` | 3 |
| 20 (В10) | open | planimetry | `plan-quadrilaterals` | 3 |
| 21 (В11) | open | equations | `eq-logarithmic` | 3 |
| 22 (В12) | open | numbers | `num-divisibility` | 4 |
| 23 (В13) | open | stereometry | `ster-rotation` | 4 |
| 24 (В14) | open | equations | `eq-exponential` | 4 |
| 25 (В15) | open | trigonometry | `trig-equations` | 5 |
| 26 (В16) | open | equations | `eq-logarithmic` | 5 |
| 27 (В17) | open | stereometry | `ster-polyhedra` | 5 |
| 28 (В18) | open | equations | `eq-irrational` | 4 |
| 29 (В19) | open | functions | `fn-derivative` | 5 |
| 30 (В20) | open | stereometry | `ster-angles-distances` | 5 |
> Часть А = `mc` (всегда 5 вариантов ответа). Часть В = `open` (число/слово/комбинация цифр).
> `long` использовать только если ответ не авто-проверяем (в ЦЭ/ЦТ почти не встречается — там всё с коротким ответом).
> ⚠️ Маппинг — стартовый; при оцифровке КАЖДОГО варианта проверять реальную тему задания и при отклонении менять `subtopic`/`difficulty` вручную.
---
## 3. Форматы полей
### 3.1. `text_html`
Условие задания с формулами в KaTeX-разметке (`$...$` инлайн). HTML допустим (списки, `<br>`). Картинки/чертежи — в `figure_html`.
### 3.2. `figure_html`
Чертёж: предпочтительно inline `<svg>` (масштабируемо, тема). Допустимо `<img src="/img/ct/math/...">` (как уже практикуется в репозитории — см. `frontend/img/ct/math/`). NULL, если рисунка нет.
### 3.3. `opts_json` (только `mc`)
Массив пар `[метка, html]`, как в `exam9`:
```json
[["1","$-16$"],["2","$-12$"],["3","$12$"],["4","$26$"],["5","$-26$"]]
```
(В ЦЭ/ЦТ метки — цифры 1–5.)
### 3.4. `answer`
- `mc`: метка верного варианта, напр. `"5"`.
- `open`: строка-эталон ответа. Форматы части В:
- число: `"-26"`, `"24"`, `"153"`;
- комбинация цифр (В1-тип «выберите верные», порядок не важен): хранить нормализованно, напр. отсортированные цифры `"124"`; проверку делать как множество цифр;
- комбинация буква-цифра (В2-тип сопоставление): `"А5Б1В4"` (как в реальном бланке).
- ⚠️ Договориться о нормализации ответа на клиенте (тримминг, запятая/точка в дробях, регистр) — это логика проверки, не данные. В части В реального ЦТ ответ — целое/конечная десятичная дробь; условие часто просит «увеличьте в N раз», чтобы ответ стал целым (учитывать при вводе эталона).
### 3.5. `solution_html`
Полное решение в HTML+KaTeX. Рекомендуется завершать блоком ответа в стиле exam9:
```html
<div class="sol-ans">Ответ: $-26$</div>
```
(`import-exam-tasks.js` умеет парсить `answer` из такого блока — переиспользовать конвейер.)
### 3.6. `topic` / `subtopic` / `difficulty`
- `topic` = slug раздела, `subtopic` = slug подтемы (из [TOPICS_SEED.md](TOPICS_SEED.md)).
- Дефолт — по таблице §2; правка вручную при отклонении.
- `difficulty` 1–5: 1–2 = часть А и лёгкая В; 3 = средняя В; 45 = В12+, В14–В20. Рубрика — §4.
---
## 4. Рубрика сложности (difficulty 15)
| Балл | Признак | Где |
|---|---|---|
| 1 | одно действие/определение, устно | А1, А3, А4, А5 |
| 2 | 2–3 шага, базовая формула | А-часть, В2, В3, В8 |
| 3 | несколько шагов, выбор метода | В4–В11, А9 |
| 4 | многошаговое + ОДЗ/отбор/подобие | В12–В14, В18 |
| 5 | сложный метод (рационализация, отбор корней, координатный метод в 3D) | В15–В17, В19, В20 |
---
## 5. Конвейер оцифровки (рекомендуемый порядок шагов)
1. **Источник → структура.** Один вариант = 30 задач. Удобный промежуточный формат — JS-объект как в `frontend/js/exam9/variants/vNN.js` (`text`, `opts`, `sol` с `sol-ans`).
2. **Импорт.** Прогнать через `backend/scripts/import-exam-tasks.js` (автоопределение `mc`/`open` по наличию `opts`, парс `answer` из `sol-ans`).
3. **Классификация.** Проставить `topic`/`subtopic`/`difficulty` по §2 (можно скриптом по `task_idx`), затем выборочно проверить отклонения (по аналогии с `tag-exam-tasks.js`).
4. **Чертежи.** Для задач с рисунком — добавить `figure_html` (SVG/`<img>`); часть А2/А9/В1/В13/В17/В20 почти всегда с чертежом.
5. **Верификация.** Сверить `answer` с официальными ответами (папки `…\Ответы…`, DJVU-исходники) — критично для авто-проверки.
6. **Сборка вариантов.** Полные варианты доступны как `exam_mock_sessions` (пробники на 180 мин) автоматически — нужна только заполненность 30 задач варианта.
> OCR кириллицы+формул из PDF/DJVU ненадёжен на математике — формулы почти всегда перенабираются вручную в KaTeX. Это основной объём работы; приоритет источников — §6.
---
## 6. Приоритет источников для оцифровки
| Очередь | Источник | Почему |
|---|---|---|
| 1 | `ЦТ-ЦЭ\ЦЭ-ЦТ-2024 МАТ.pdf` | эталон текущего формата, есть ответы |
| 2 | `РТ\2022-2023 … 2024-2025` | свежие, формат совпадает, 3 этапа × 2 варианта |
| 3 | `ЦТ-ЦЭ\20172021` + DJVU-ответы | большой банк реальных заданий с ответами |
| 4 | `РТ\20162021` | расширение банка |
| 5 | `ДРТ\` | доп. варианты + разборы консультаций |
| 6 | старые `РТ/ЦТ 20042015` | архив, по мере необходимости |
Нумерация `variant`: сквозная, с префиксом-меткой источника в `solution_html`/комментарии (напр. «ЦЭ-2024», «РТ-2024 этап 2 в1»), чтобы не терять происхождение.
---
## 7. Входной диагностический тест
Цель: за ~30–40 минут определить уровень по каждому разделу → назначить трек и приоритетные модули.
### Состав (1 задание на ключевую подтему, смесь А и В, 12–15 задач)
| # | Подтема | Уровень-зонд | Источник-позиция |
|---|---|---|---|
| 1 | `num-real` | 🟢 | А1 |
| 2 | `eq-quadratic` | 🟢 | А5 |
| 3 | `trig-circle` | 🟢 | А3 |
| 4 | `expr-powers-roots` | 🟢 | А10 |
| 5 | `word-problems` | 🟡 | А7 / В7 |
| 6 | `seq-progressions` | 🟡 | В3 / В6 |
| 7 | `fn-properties` | 🟡 | В2 / В9 |
| 8 | `trig-identities` | 🟡 | В4 |
| 9 | `plan-triangles` | 🟡 | В5 |
| 10 | `ster-basics` | 🟡 | А2 / В1 |
| 11 | `eq-logarithmic` | 🔴 | В11 → В16 |
| 12 | `trig-equations` | 🔴 | В15 |
| 13 | `fn-derivative` | 🔴 | В19 |
| 14 | `ster-angles-distances` | 🔴 | В20 |
### Логика назначения трека (по результату)
- Доля верных среди 🟢-зондов < 75% **или** «проваленные» базовые разделы → стартовый трек **База**; провальные разделы проходятся с нуля.
- 🟢 уверенно, 🟡 ≥ ~50% → трек **Ядро**.
- 🟢+🟡 уверенно и хотя бы часть 🔴 решена → трек **Продвинутый**.
- Любой раздел с диагностикой < 50% → этот раздел всегда с уровня База, независимо от общего трека (правило ветвления §4.3 PLAN.md).
### Реализация на платформе
- Диагностика = `exam_mock_sessions` с `source='random'`/спец-набор `task_ids_json` из перечисленных подтем, либо practice-набор `strategy=weak`.
- Результаты пишутся в `exam_attempts` (по подтемам) → дашборд/детектор слабых тем сразу строит heatmap и список приоритетов.
- `exam_user_plan.weak_focus=1` — включить фокус на слабых темах (опционально).
---
## 8. Чек-лист «задание готово»
- [ ] `text_html` набран, формулы в KaTeX, читается;
- [ ] `figure_html` добавлен (если есть чертёж);
- [ ] `opts_json` для `mc` (5 вариантов) / отсутствует для `open`;
- [ ] `answer` сверен с официальным ключом, нормализован;
- [ ] `solution_html` с `sol-ans`;
- [ ] `topic`/`subtopic`/`difficulty` проставлены и проверены против реальной темы;
- [ ] `UNIQUE(exam_key, variant, task_idx)` не нарушен.