AI-тьютор для персоналізованого навчання на LLM

AI-тьютор: система індивідуального навчання

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1302
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1006

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-тьютора

  1. Аудит даних — аналізуємо структуру курсу, профілі студентів та існуючу LMS.
  2. Проектування — налаштовуємо curriculum, стилі навчання та систему prompt-інжинірингу.
  3. Розробка прототипу — збираємо базового тьютора з поясненнями та квізами.
  4. Персоналізація — впроваджуємо адаптивний профіль та динамічне оновлення слабких тем.
  5. Інтеграція — підключаємо REST API до вашої платформи.
  6. Запуск та моніторинг — розгортаємо систему, відстежуємо метрики та доопрацьовуємо.

Кейс з нашої практики: онлайн-курс програмування

Контекст: 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.