AI-тьютор: система індивідуального навчання
Онлайн-курси з програмування з тисячами студентів стикаються з проблемою відтоку: до 68% кидають навчання через відсутність персоналізації. Традиційні курси пропонують всім однаковий темп і стиль, хоча у студентів різні рівні підготовки та способи сприйняття. AI-тьютор на базі LLM адаптує темп, складність і формат під кожного. Система аналізує профіль студента, його слабкі місця та вподобаний стиль — візуальний, практичний або сократичний — і підлаштовує пояснення на льоту. Це знижує dropout rate до 40% і скорочує час на вивчення теми в середньому на 30%.
Наша команда розробляє такі системи більше п'яти років і накопичила досвід понад 50 проектів в EdTech. Ми гарантуємо зниження dropout rate щонайменше на 30% порівняно з традиційними курсами. Економія бюджету при впровадженні AI-тьютора сягає 40% за рахунок скорочення витрат на менторів.
Які проблеми вирішує AI-тьютор?
- Високий відтік — студенти кидають курс, тому що темп не підходить. AI-тьютор підлаштовує темп і складність.
- Нестача менторів — один викладач не може приділити час кожному. AI-тьютор працює 24/7.
- Різні стилі навчання — візуали, практики, концептуалісти — всім потрібен різний підхід. Ми реалізували 4 стилі: візуальний, концептуальний, практичний та сократичний.
- Прогалини в знаннях — система виявляє слабкі теми та повертається до них, поки студент не засвоїть матеріал.
Чому LLM, а не готові rule-based системи?
Rule-based тьютори (наприклад, експертні системи) вимагають ручного опису всіх гілок діалогу і не справляються з несподіваними питаннями. LLM, навпаки, генерують пояснення на льоту, адаптуючи контент під контекст студента. Ми використовуємо Claude 3.5 Sonnet та GPT-4o для генерації пояснень, а для локального розгортання — LLaMA 3 через vLLM. Це дає латентність p99 нижче 2 секунд при батчі.
Архітектура AI-тьютора
from anthropic import Anthropic
from pydantic import BaseModel
from typing import Literal, Optional
import json
from datetime import datetime
client = Anthropic()
class StudentProfile(BaseModel):
student_id: str
subject: str
level: Literal["beginner", "intermediate", "advanced"]
learning_style: Literal["visual", "conceptual", "practical", "socratic"]
known_topics: list[str] = []
weak_topics: list[str] = []
session_count: int = 0
last_assessment_score: Optional[float] = None
class LearningSession(BaseModel):
session_id: str
student_id: str
topic: str
messages: list[dict] = []
quiz_results: list[dict] = []
started_at: datetime
class AITutor:
def __init__(self, subject: str, curriculum: dict):
self.subject = subject
self.curriculum = curriculum # {topic: {subtopics, prerequisites, content}}
def _build_system_prompt(self, profile: StudentProfile) -> str:
"""Формирует персонализированный system prompt"""
style_instructions = {
"visual": "Используй много примеров, аналогий, схем (текстовых). Структурируй информацию визуально через списки и таблицы.",
"conceptual": "Сначала объясняй концепцию целиком, потом детали. Связывай с другими концепциями.",
"practical": "Начинай с примера кода/задачи, потом объясняй почему. Давай практические упражнения.",
"socratic": "Задавай наводящие вопросы вместо прямых объяснений. Веди студента к пониманию через диалог.",
}
weak_topics_context = ""
if profile.weak_topics:
weak_topics_context = f"\nСтудент испытывает затруднения с: {', '.join(profile.weak_topics)}. Обращай особое внимание при связанных темах."
known_context = ""
if profile.known_topics:
known_context = f"\nСтудент уже хорошо знает: {', '.join(profile.known_topics[-5:])}. Можешь опираться на эти знания."
return f"""Ты — персональный тьютор по {self.subject}.
Уровень студента: {profile.level}
Стиль обучения: {style_instructions[profile.learning_style]}
{known_context}{weak_topics_context}
Правила:
- Никогда не давай ответ сразу на учебные вопросы — сначала проверь понимание наводящим вопросом
- Хвали за правильные ответы конкретно: "Правильно, именно потому что..."
- При ошибке — не говори "неправильно", спрашивай "А что если рассмотреть с другой стороны?"
- Адаптируй сложность объяснений к уровню {profile.level}
- После объяснения темы предлагай проверочный вопрос"""
def explain_topic(
self,
topic: str,
profile: StudentProfile,
session: LearningSession,
student_question: str = None,
) -> str:
"""Объясняет тему с учётом профиля студента"""
topic_content = self.curriculum.get(topic, {})
messages = session.messages.copy()
if not messages:
user_content = f"Давай изучим тему: {topic}"
if topic_content.get("prerequisites"):
user_content += f"\n(Предпосылки: {', '.join(topic_content['prerequisites'])})"
else:
user_content = student_question or "Продолжим"
messages.append({"role": "user", "content": user_content})
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
system=self._build_system_prompt(profile),
messages=messages,
)
assistant_message = response.content[0].text
session.messages.append({"role": "user", "content": user_content})
session.messages.append({"role": "assistant", "content": assistant_message})
return assistant_message
def generate_quiz(self, topic: str, profile: StudentProfile, num_questions: int = 5) -> list[dict]:
"""Генерирует персонализированные вопросы для проверки знаний"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
messages=[{
"role": "user",
"content": f"""Создай {num_questions} вопросов для проверки знания темы "{topic}".
Уровень студента: {profile.level}
Слабые места: {profile.weak_topics}
Верни JSON:
[{{
"question": "...",
"type": "multiple_choice|open|true_false",
"options": ["A: ...", "B: ...", "C: ...", "D: ..."] (для multiple_choice),
"correct_answer": "...",
"explanation": "Почему этот ответ правильный",
"difficulty": "easy|medium|hard"
}}]
Распредели сложность: {{"easy": 2, "medium": 2, "hard": 1}} для intermediate уровня."""
}]
)
text = response.content[0].text
start = text.find("[")
end = text.rfind("]") + 1
return json.loads(text[start:end])
def check_answer(
self,
question: dict,
student_answer: str,
profile: StudentProfile,
) -> dict:
"""Проверяет ответ и генерирует обратную связь"""
is_correct = student_answer.strip().lower() == question["correct_answer"].strip().lower()
if is_correct:
feedback = f"Верно! {question['explanation']}"
else:
response = client.messages.create(
model="claude-claude-haiku-4-5",
max_tokens=512,
messages=[{
"role": "user",
"content": f"""Студент ответил на вопрос неправильно.
Вопрос: {question['question']}
Правильный ответ: {question['correct_answer']}
Ответ студента: {student_answer}
Объяснение: {question['explanation']}
Уровень студента: {profile.level}
Напиши краткую, не унижающую обратную связь на 2-3 предложения, объясняющую почему правильный ответ верный."""
}]
)
feedback = response.content[0].text
return {
"is_correct": is_correct,
"feedback": feedback,
"correct_answer": question["correct_answer"],
}
def update_profile(self, profile: StudentProfile, quiz_results: list[dict]) -> StudentProfile:
"""Обновляет профиль студента на основе результатов"""
errors_by_topic = {}
for result in quiz_results:
if not result.get("is_correct"):
topic = result.get("topic", "general")
errors_by_topic[topic] = errors_by_topic.get(topic, 0) + 1
new_weak = [topic for topic, errors in errors_by_topic.items() if errors >= 2]
profile.weak_topics = list(set(profile.weak_topics + new_weak))[-10:]
correct_count = sum(1 for r in quiz_results if r.get("is_correct"))
profile.last_assessment_score = correct_count / len(quiz_results) if quiz_results else None
if profile.last_assessment_score and profile.last_assessment_score > 0.8:
if profile.level == "beginner":
profile.level = "intermediate"
elif profile.level == "intermediate":
profile.level = "advanced"
return profile
Адаптивний навчальний шлях
class AdaptiveLearningPath:
"""Строит и корректирует учебный путь под студента"""
def generate_path(self, goal: str, profile: StudentProfile, curriculum: dict) -> list[str]:
"""Генерирует последовательность тем для достижения цели"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": f"""Составь учебный путь.
Цель студента: {goal}
Уровень: {profile.level}
Уже знает: {profile.known_topics}
Учебная программа (доступные темы): {list(curriculum.keys())}
Верни JSON: {{"topics": ["topic1", "topic2", ...], "estimated_weeks": <число>}}
Порядок от простого к сложному, с учётом уже изученных тем."""
}]
)
text = response.content[0].text
start = text.find("{")
end = text.rfind("}") + 1
return json.loads(text[start:end])
Як AI-тьютор адаптується під кожного студента?
Адаптація відбувається на трьох рівнях:
- StudentProfile — фіксує початковий рівень, стиль навчання, відомі та слабкі теми.
- Сесія — кожна взаємодія збагачує контекст, дозволяючи тьютору точніше підбирати пояснення.
- Оновлення профілю — після кожного квізу система коригує список слабких тем і при необхідності підвищує рівень.
| Компонент | Опис | Частота оновлення |
|---|---|---|
| StudentProfile | Рівень, стиль, known/weak topics | Після кожного квізу |
| System prompt | Персоналізовані інструкції моделі | Кожна сесія |
| Learning path | Послідовність тем | Після завершення теми |
| Quiz results | Оцінка та аналіз помилок | Кожна відповідь |
Як впровадити AI-тьютора
- Аудит даних — аналізуємо структуру курсу, профілі студентів та існуючу LMS.
- Проектування — налаштовуємо curriculum, стилі навчання та систему prompt-інжинірингу.
- Розробка прототипу — збираємо базового тьютора з поясненнями та квізами.
- Персоналізація — впроваджуємо адаптивний профіль та динамічне оновлення слабких тем.
- Інтеграція — підключаємо REST API до вашої платформи.
- Запуск та моніторинг — розгортаємо систему, відстежуємо метрики та доопрацьовуємо.
Кейс з нашої практики: онлайн-курс програмування
Контекст: EdTech платформа, курс Python для початківців, 2400 студентів. Проблеми: 68% dropout rate, студенти застрягають на різних темах, один ментор не справлявся. Платформа шукала рішення для системи навчання AI.
Впровадження AI-тьютора:
- Персональний профіль для кожного студента
- Адаптивні пояснення (4 стилі навчання)
- Автоматичні квізи після кожної теми
- Оновлення профілю за помилками
- Використання RAG навчання для генерації контекстних підказок
Результати за 3 місяці:
- Dropout rate: 68% → 41%
- Середній час на тему: 45 хв → 28 хв
- NPS платформи: 34 → 67
- Середній скор фінального тесту: 63% → 78%
Ключове спостереження: студенти з сократичним стилем навчання показали найбільший ріст — питання-відповідь формат утримував залученість краще пасивного читання. Ми використали Claude 3.5 Sonnet для генерації пояснень та локальну LLaMA 3 для квізів, що знизило витрати на API. Економія бюджету склала до 40% порівняно з наймом додаткових менторів.
Що входить в результат?
- Готовий AI-тьютор з інтеграцією через API
- Персоналізовані профілі для кожного студента
- Система адаптивних квізів та трекінг прогресу
- Дашборд для викладачів з аналітикою
- Документація та навчання команди
- Підтримка на 3 місяці після запуску
Терміни
| Етап | Тривалість |
|---|---|
| Базовий тьютор (пояснення + квіз) | 3–5 днів |
| Персоналізований профіль + адаптивний контент | 2 тижні |
| Адаптивний навчальний шлях + оновлення профілю | 1 тиждень |
| Повна система з дашбордом прогресу | 4–6 тижнів |
Зв'яжіться з нами для оцінки ваших даних. Замовте демо-версію інтелектуального тьютора вже сьогодні. Отримайте консультацію по впровадженню AI-тьютора у ваш курс.
Адаптивні навчальні системи показали зниження dropout rate до 40% Wikipedia.







