Как создать ИИ-репетитора для ЕГЭ: RAG, Fine-tuning, промпты на 2026 | AiManual
AiManual Logo Ai / Manual.
26 Янв 2026 Гайд

Студенческий стартап провалился на ИИ-репетиторе для ЕГЭ: вот что мы накопили за 6 месяцев

Пошаговый разбор провального студенческого стартапа по созданию ИИ-репетитора для ЕГЭ на локальных моделях. RAG-система, fine-tuning под математику, промпты для

Почему наши студенты завалили ИИ-репетитора

В сентябре 2025 года команда из трёх студентов МФТИ решила сделать ИИ-репетитора для подготовки к ЕГЭ по математике. Бюджет - 150 тысяч рублей, срок - полгода. В январе 2026 они закрыли проект. Не потому что не получилось. Получилось слишком хорошо - их система выдавала такие сложные решения, что обычные школьники не понимали, что происходит.

Я получил доступ к их коду, промптам и датасетам. Собрал всё, что работает, и всё, что сломало им проект. Рассказываю, как создать работающего ИИ-репетитора, если знаешь все подводные камни заранее.

Важный момент на 2026 год: большинство статей про образовательные ИИ используют устаревшие подходы. Нельзя просто взять Llama и зафинтить её на задачах. Школьникам нужна не точность, а понятность объяснений.

1 Архитектура, которая не сломается на первом же школьнике

Студенты начали с классического RAG. Загрузили учебники, сборники задач, методички. Через месяц поняли проблему: модель находила правильные ответы, но объясняла их языком вузовского преподавателя.

Нужна трёхуровневая система:

  • Retriever ищет похожие задачи и теорию
  • Explainer (отдельная модель) переводит сложное объяснение на школьный язык
  • Checker проверяет, соответствует ли решение формату ЕГЭ

Вот как выглядит минимальная рабочая версия:

class EGETutor:
    def __init__(self):
        self.retriever = SentenceTransformerRetriever()
        self.explainer = FineTunedLlama()  # Отдельная модель
        self.checker = RuleBasedChecker()
    
    def solve_task(self, task_text: str) -> str:
        # 1. Найти похожие задачи
        similar = self.retriever.search(task_text)
        # 2. Объяснить решение как для школьника
        explanation = self.explainer.explain(task_text, similar)
        # 3. Проверить соответствие ЕГЭ
        if not self.checker.validate(explanation):
            explanation = self.simplify(explanation)
        return explanation
💡
Разделение на три компонента - не прихоть, а необходимость. Когда одна модель делает всё, она начинает экономить токены на объяснениях. Explainer должен быть обучен специально на диалогах "сложное → простое".

2 Какие модели реально работают в 2026 году (не реклама)

Студенты перепробовали 7 моделей. Вот что сработало, а что нет:

Модель Для чего Проблемы Ресурсы
Llama 3.2 3B Explainer Путает русский и английский 8 ГБ RAM
RuBERT 3.0 (2025) Retriever Только текст, не формулы 2 ГБ RAM
MathBERT-RU Поиск формул Своя токенизация 3 ГБ RAM
Qwen 2.5 1.5B Checker Слишком строгий 4 ГБ RAM

Главная ошибка: они взяли одну мощную модель вместо нескольких специализированных. Вот почему это провальная стратегия.

3 Fine-tuning, который не сломает модель

Самый болезненный этап. Студенты собрали 5000 пар "задача-решение" из открытых источников. Начали финтить. Через 3 эпохи модель перестала понимать вопросы.

Проблема: catastrophic forgetting. Модель забыла всё, что знала раньше.

Решение 2026 года - использовать LoRA (Low-Rank Adaptation) с очень маленьким rank:

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=8,  # Раньше ставили 32, это слишком много
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(base_model, config)
# Обучаем ТОЛЬКО на объяснениях, не на решениях
# Иначе модель начнёт выдавать ответ без объяснения

Датасет должен содержать не просто решения, а объяснения с ошибками. Модель должна учиться исправлять типичные школьные ошибки, а не генерировать идеальные решения.

Важно: не используйте готовые решения из интернета. Там всё решено правильно. В реальности школьники делают ошибки, и модель должна уметь их находить и объяснять.

4 Промпты, которые заставят модель говорить как учитель

Вот промпт, который сломал их проект на первой демонстрации:

# КАК НЕ НАДО
prompt = """
Реши задачу: {task}
Дай подробное решение.
"""

Модель выдала решение с использованием производных для задачи 7 класса.

Вот промпт, который работает:

prompt = """
Ты - репетитор по математике для школьника 11 класса.
Задача: {task}

Требования:
1. Объясни, как если бы школьник увидел такую задачу впервые
2. Разбей решение на шаги, каждый шаг - одно действие
3. После каждого шага спроси, понятно ли (но не жди ответа)
4. Не используй термины, которые не проходят в школе
5. В конце подведи итог: какая тема этой задачи

Начни с фразы: "Давай разберём эту задачу по шагам"
"""

Ключевое отличие: промпт задаёт роль и структуру ответа. Без этого модель выбирает самый короткий путь к ответу.

Для разных типов задач нужны разные промпты:

  • Геометрия: "Нарисуй мысленно..."
  • Алгебра: "Представь, что это не x, а количество яблок..."
  • Текстовые задачи: "Выдели главные числа из текста..."

Больше работающих промптов для RAG-систем.

5 RAG для математики: как искать не текст, а смысл

Обычный RAG ищет по тексту. Но "решить уравнение x^2 = 4" и "найти корни квадратного уравнения x² = 4" - это одна и та же задача, но разный текст.

Решение 2026 года - использовать двойное эмбеддинг:

class MathRetriever:
    def __init__(self):
        self.text_encoder = SentenceTransformer('rubert-base')
        self.math_encoder = MathBERT()  # Специальная модель для формул
    
    def encode(self, text: str):
        # Разделяем текст и формулы
        text_part, math_part = extract_math(text)
        
        # Получаем два эмбеддинга
        text_emb = self.text_encoder.encode(text_part)
        math_emb = self.math_encoder.encode(math_part)
        
        # Объединяем с весами
        return 0.7 * text_emb + 0.3 * math_emb

MathBERT - это BERT, дообученный на математических текстах. Он понимает, что "x²" и "x^2" - это одно и то же.

💡
Не храните формулы как текст. Конвертируйте в LaTeX или MathML перед индексацией. Иначе поиск по "квадратному уравнению" не найдёт задачу с "x в квадрате".

6 Обработка ошибок: что делать, когда школьник не прав

Самая сложная часть. Модель должна не просто сказать "неправильно", а понять, где ошибка и почему она возникла.

Студенты сделали классификатор ошибок:

ERROR_TYPES = {
    'algebra_mistake': 'Ошибка в преобразованиях',
    'concept_miss': 'Непонимание концепции',
    'calculation': 'Арифметическая ошибка',
    'misreading': 'Неверное прочтение условия',
    'procedure': 'Неправильный порядок действий'
}

class ErrorDetector:
    def detect(self, student_solution: str, correct_solution: str):
        # Сравниваем шаги
        student_steps = split_steps(student_solution)
        correct_steps = split_steps(correct_solution)
        
        for i, (s_step, c_step) in enumerate(zip(student_steps, correct_steps)):
            if not self.steps_equal(s_step, c_step):
                error_type = self.classify_error(s_step, c_step)
                return {
                    'step': i + 1,
                    'type': error_type,
                    'student_step': s_step,
                    'correct_step': c_step
                }
        return None

После классификации ошибки, модель генерирует объяснение. Не "ты ошибся", а "здесь нужно было раскрыть скобки, давай попробуем вместе".

Что сломалось в их проекте и как это исправить

1. Слишком сложные объяснения. Модель использовала университетские термины. Решение: добавить в датасет упрощённые объяснения, сделанные реальными учителями.

2. Игнорирование типичных ошибок. Модель не знала, где школьники чаще всего ошибаются. Решение: собрать датасет из реальных работ ЕГЭ прошлых лет с пометками ошибок.

3. Отсутствие прогрессии сложности. Модель давала одинаково подробные объяснения для простых и сложных задач. Решение: добавить параметр "уровень понимания ученика" и адаптировать объяснения.

4. Неумение рисовать. В геометрии важно показывать чертежи. Решение: подключить генератор диаграмм или использовать ASCII-графику.

Готовый пайплайн для запуска

Если хотите повторить без их ошибок:

  1. Соберите датасет: 30% теории, 40% решений с объяснениями, 30% разборов ошибок
  2. Выберите три модели: для поиска (RuBERT), для объяснений (Qwen 2.5), для проверки (TinyLlama)
  3. Настройте RAG с двойным эмбеддингом (текст + формулы)
  4. Сделайте LoRA fine-tuning на объяснениях (не на решениях!)
  5. Добавьте классификатор ошибок и систему обратной связи
  6. Протестируйте на реальных школьниках, спросите, что непонятно

Не пытайтесь сделать одну модель, которая всё умеет. Это главная ошибка всех образовательных ИИ-стартапов. Три простые модели, каждая со своей задачей, работают в 10 раз лучше одной сложной.

Что изменилось к 2026 году

По сравнению с 2023-2024 годами:

  • Модели стали меньше, но качественнее. Llama 3.2 3B работает лучше, чем Llama 2 7B
  • Появились специализированные математические энкодеры (MathBERT, SciBERT)
  • Fine-tuning требует в 10 раз меньше данных благодаря улучшенным LoRA-методикам
  • RAG-системы научились работать с формулами и графиками, а не только с текстом

И главное - теперь есть понимание, что ИИ-репетитор должен объяснять, а не решать. Разница фундаментальная. Решение можно найти в учебнике. Объяснение, которое поймёт конкретный школьник - это искусство. ИИ только учится ему.

Если хотите глубже разобраться в архитектуре RAG-систем, посмотрите наш практический гайд по созданию RAG с нуля. Там всё без академических сложностей, только рабочий код.