Разработка AI-тьютора для индивидуального обучения

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-тьютора для индивидуального обучения
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

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

Персонализированное обучение — одна из наиболее сильных практических применений LLM. Традиционные курсы предполагают одинаковый темп и формат для всех; AI-тьютор адаптируется к уровню знаний, предпочтительному стилю объяснений, темпу усвоения и конкретным пробелам знаний каждого студента.

Архитектура 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:]  # Максимум 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

        # Если скор > 80% — предлагаем переход на следующий уровень
        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])

Практический кейс: онлайн-курс программирования

Контекст: EdTech платформа, курс Python для начинающих, 2400 студентов. Проблемы: 68% дропаут rate, студенты застревают на разных темах, один ментор не справлялся.

Внедрение AI-тьютора:

  • Персональный профиль для каждого студента
  • Адаптивные объяснения (4 стиля обучения)
  • Автоматические квизы после каждой темы
  • Обновление профиля по ошибкам

Результаты за 3 месяца:

  • Дропаут rate: 68% → 41%
  • Среднее время на тему: 45 мин → 28 мин (студенты получали нужный формат сразу)
  • NPS платформы: 34 → 67
  • Средний скор финального теста: 63% → 78%

Ключевое наблюдение: студенты с "socratic" стилем обучения показали наибольший рост — вопросно-ответный формат удерживал вовлечённость лучше пассивного чтения.

Сроки

  • Базовый тьютор (объяснение + квиз): 3–5 дней
  • Персонализированный профиль + адаптивный контент: 2 недели
  • Адаптивный учебный путь + обновление профиля: 1 неделя
  • Полная система с дашбордом прогресса: 4–6 недель