Почему наши студенты завалили ИИ-репетитора
В сентябре 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
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" - это одно и то же.
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-графику.
Готовый пайплайн для запуска
Если хотите повторить без их ошибок:
- Соберите датасет: 30% теории, 40% решений с объяснениями, 30% разборов ошибок
- Выберите три модели: для поиска (RuBERT), для объяснений (Qwen 2.5), для проверки (TinyLlama)
- Настройте RAG с двойным эмбеддингом (текст + формулы)
- Сделайте LoRA fine-tuning на объяснениях (не на решениях!)
- Добавьте классификатор ошибок и систему обратной связи
- Протестируйте на реальных школьниках, спросите, что непонятно
Не пытайтесь сделать одну модель, которая всё умеет. Это главная ошибка всех образовательных ИИ-стартапов. Три простые модели, каждая со своей задачей, работают в 10 раз лучше одной сложной.
Что изменилось к 2026 году
По сравнению с 2023-2024 годами:
- Модели стали меньше, но качественнее. Llama 3.2 3B работает лучше, чем Llama 2 7B
- Появились специализированные математические энкодеры (MathBERT, SciBERT)
- Fine-tuning требует в 10 раз меньше данных благодаря улучшенным LoRA-методикам
- RAG-системы научились работать с формулами и графиками, а не только с текстом
И главное - теперь есть понимание, что ИИ-репетитор должен объяснять, а не решать. Разница фундаментальная. Решение можно найти в учебнике. Объяснение, которое поймёт конкретный школьник - это искусство. ИИ только учится ему.
Если хотите глубже разобраться в архитектуре RAG-систем, посмотрите наш практический гайд по созданию RAG с нуля. Там всё без академических сложностей, только рабочий код.