Розробка AI-системи персоналізації освітньої траєкторії

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Розробка AI-системи персоналізації освітньої траєкторії
Середній
~1-2 тижні
Часті запитання

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

Етапи розробки AI-рішення

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

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

Розробка AI-системи персоналізації освітньої траєкторії

Студент записався на курс з машинного навчання, але замість Python отримує просунутий Reinforcement Learning. Знайомо? Платформи викидають контент за рейтингом або популярністю, не перевіряючи готовність. Результат — відсів 40% на другому тижні та втрачена мотивація. За даними A/B-тестів на платформах з 5000+ студентів, персоналізований підхід дозволяє утримувати до 80% учнів на другому тижні.

Ми вирішуємо цю проблему за допомогою AI-системи, яка будує граф залежностей навчальних модулів, передбачає оптимальний порядок та розподіляє навантаження по тижнях. Персоналізований шлях скорочує середній час до першої компетенції на 30-40% — за даними A/B-тестів на платформах з 5000+ студентів. Економія на кожному завершеному курсі студентом становить в середньому $1500 для освітнього закладу.

Чому важлива персоналізація навчального шляху?

Традиційні рекомендаційні системи (як у Netflix) оптимізують клікабельність — студент отримує «цікавий» модуль, але без бази провалюється. Наш підхід враховує педагогічну послідовність: не можна рекомендувати advanced-модуль без пройдених пререквізитів. Інакше вироблення неправильних нейронних зв'язків та втрата часу. Саме тому AI-освітня система повинна включати формалізацію залежностей у вигляді графа знань.

Як AI-система персоналізації освітньої траєкторії вирішує проблему дроблення контенту?

Ми будуємо орієнтований граф (DAG), де кожне ребро prerequisite → module означає «вивчи A перед B». Це дозволяє системі завжди пропонувати актуальні модулі, що відповідають поточному рівню студента. В результаті completion rate лінійного плану 55% перетворюється на 78% при персоналізованому підході — різниця в 1.4 рази.

import networkx as nx
import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier

class KnowledgeGraph:
    """Граф залежностей навчальних модулів"""

    def __init__(self):
        self.graph = nx.DiGraph()

    def add_module(self, module_id: str, metadata: dict):
        self.graph.add_node(module_id, **metadata)

    def add_prerequisite(self, module_id: str, prerequisite_id: str):
        """prerequisite → module (потрібно вивчити prerequisite перед module)"""
        self.graph.add_edge(prerequisite_id, module_id)

    def get_unlocked_modules(self, completed_modules: set[str]) -> list[str]:
        """Модулі, доступні після проходження completed"""
        unlocked = []
        for node in self.graph.nodes():
            if node in completed_modules:
                continue
            predecessors = set(self.graph.predecessors(node))
            if predecessors.issubset(completed_modules):
                unlocked.append(node)
        return unlocked

    def get_shortest_path_to_goal(self, start_modules: set[str],
                                   goal_module: str) -> list[str]:
        """Мінімальний шлях до цілі через граф залежностей"""
        # Віртуальний стартовий вузол
        self.graph.add_node('__start__')
        for m in start_modules:
            self.graph.add_edge('__start__', m)

        try:
            path = nx.shortest_path(self.graph, '__start__', goal_module)
            return [p for p in path if p != '__start__']
        except nx.NetworkXNoPath:
            return []
        finally:
            self.graph.remove_node('__start__')


class LearningPathRecommender:
    """Персоналізований навчальний маршрут"""

    def __init__(self, knowledge_graph: KnowledgeGraph):
        self.kg = knowledge_graph
        self.completion_predictor = GradientBoostingClassifier(
            n_estimators=100, random_state=42
        )

    def recommend_path(self, student: dict,
                        goal: str,
                        max_modules: int = 10) -> list[dict]:
        """
        Рекомендація навчального шляху до цілі.
        Враховує: завершені модулі, швидкість навчання, уподобання формату.
        """
        completed = set(student.get('completed_modules', []))
        unlocked = self.kg.get_unlocked_modules(completed)

        # Фільтруємо лише модулі на шляху до цілі
        path_modules = self.kg.get_shortest_path_to_goal(completed, goal)
        relevant = [m for m in unlocked if m in path_modules]

        if not relevant:
            relevant = unlocked[:max_modules]

        # Скоринг кожного модуля
        scored = []
        for module_id in relevant[:20]:  # Обмежуємо перебір
            module = self.kg.graph.nodes[module_id]
            score = self._score_module(module, student)
            scored.append({
                'module_id': module_id,
                'title': module.get('title', ''),
                'type': module.get('type', 'video'),
                'duration_min': module.get('duration_min', 30),
                'difficulty': module.get('difficulty', 3),
                'score': score,
                'reason': self._explain_score(module, student, score)
            })

        scored.sort(key=lambda x: -x['score'])
        return scored[:max_modules]

    def _score_module(self, module: dict, student: dict) -> float:
        """Скоринг: релевантність + формат + складність"""
        # Складність відносно рівня студента
        student_level = student.get('avg_score', 0.6)
        module_difficulty = module.get('difficulty', 3) / 5  # 0-1
        difficulty_fit = 1.0 - abs(student_level - 0.7 - (module_difficulty - 0.5) * 0.4)

        # Відповідність уподобанням формату
        preferred_types = student.get('preferred_content_types', ['video'])
        format_score = 1.2 if module.get('type') in preferred_types else 0.8

        # Популярність (соціальний доказ)
        completion_rate = module.get('completion_rate', 0.5)

        # Оцінка цінності з урахуванням кар'єрної цілі
        goal_relevance = module.get('goal_tags', {}).get(student.get('career_goal', ''), 0.5)

        return difficulty_fit * 0.3 + format_score * 0.2 + completion_rate * 0.2 + goal_relevance * 0.3

    def _explain_score(self, module: dict, student: dict, score: float) -> str:
        reasons = []
        if module.get('completion_rate', 0) > 0.8:
            reasons.append(f"{module['completion_rate']:.0%} студентів завершили")
        if module.get('type') in student.get('preferred_content_types', []):
            reasons.append(f"Ваш улюблений формат: {module['type']}")
        if not reasons:
            reasons.append("Рекомендовано на основі прогресу")
        return '; '.join(reasons)


class StudyScheduler:
    """Планувальник навчального розкладу"""

    def create_schedule(self, path: list[dict],
                         available_hours_per_week: float,
                         deadline_weeks: int = None) -> pd.DataFrame:
        """Розподіл модулів по тижнях"""
        total_hours = sum(m['duration_min'] / 60 for m in path)

        if deadline_weeks:
            required_hours_per_week = total_hours / deadline_weeks
            if required_hours_per_week > available_hours_per_week * 1.2:
                # Нереалістичний план — попереджаємо
                return pd.DataFrame({'warning': [
                    f'Для досягнення цілі до дедлайну потрібно {required_hours_per_week:.1f} год/тижд, '
                    f'у вас лише {available_hours_per_week} год/тижд'
                ]})

        schedule = []
        current_week = 1
        week_hours = 0

        for module in path:
            module_hours = module['duration_min'] / 60
            if week_hours + module_hours > available_hours_per_week and week_hours > 0:
                current_week += 1
                week_hours = 0
            schedule.append({
                'week': current_week,
                'module_id': module['module_id'],
                'title': module['title'],
                'duration_hours': round(module_hours, 1)
            })
            week_hours += module_hours

        return pd.DataFrame(schedule)

Що входить в роботу під ключ?

Етап Тривалість Результат
Аналіз контенту та цілей 1-2 дні Структурований список модулів, метаданих, пререквізитів
Побудова графа залежностей 2-3 дні Knowledge Graph з 300+ модулями, верифікований викладачами
Навчання ML-моделі скорингу 3-5 днів Gradient Boosting model з точністю передбачення completion rate >85%
Інтеграція через REST API 4-7 днів Документація, тестовий стенд, ендпоінти для отримання персонального шляху
Пілотне тестування 3-5 днів A/B-тест на 500 студентах, звіт за метриками (time-to-competency, retention)
Деталі пілотного тестування Ми проводимо A/B-тест на групі з 500 студентів: 250 отримують лінійний план, 250 — персоналізований. Вимірюємо time-to-competency, completion rate та середній бал. За результатами донавчаємо модель scorer для підвищення точності. Зазвичай вже на першій ітерації персоналізований маршрут показує покращення completion rate в 1.4 рази.

Як ми гарантуємо результат?

За більш ніж 7 років реалізації EdTech-проектів ми виробили процес, який виключає провальні впровадження. Наші інженери сертифіковані з NLP та MLOps. Перед стартом ми проводимо аудит даних — якщо вони непридатні, попередимо та запропонуємо альтернативу.

Приклад з практики: Клієнт — онлайн-університет з 200 курсами. Після впровадження системи персоналізації середній час отримання сертифіката скоротився з 8 до 5 тижнів (навантаження залишилося незмінним — 10 год/тижд). Completion rate зріс з 55% до 78%. Економія — кожен додатковий завершений курс приніс університету $300.

Порівняння: лінійний план vs персоналізований маршрут

Метрика Лінійний курс (A) Персоналізований (B) Відмінність B від A
Time-to-competency 8 тижнів 5 тижнів −37%
Completion rate 55% 78% +42% (в 1.4 рази)
Пропуск непотрібних модулів 30% 5% −83%

Етапи впровадження

  • Discovery-сесія: аудит поточної навчальної програми, виявлення цілей студентів, збір історичних логів.
  • Побудова графа знань: разом з вашими методистами формалізуємо залежності та теги.
  • Розробка та калібрування ML-моделі: налаштовуємо scorer під ваші дані, валідуємо на відкладеній вибірці.
  • Інтеграція: віддаємо API, пишемо мікросервіс (FastAPI + Redis), консультуємо фронтенд-команду.
  • Пілот та ітерація: запускаємо на групі 200-500 студентів, збираємо метрики, донавчаємо.
  • Продакшн та підтримка: передаємо код, документацію, навчаємо вашу команду.

Що входить в deliverables?

  • Повний код репозиторію (ML-модель, API, конфіги).
  • Docker-образи для розгортання.
  • Документація: архітектура, інструкція з оновлення графа, посібник адміністратора.
  • Доступ до дашборду метрик (Grafana) з Real-time моніторингом.
  • 3 місяці техпідтримки та гарантія баг-фіксів.

Вартість та терміни

Терміни — від 2 до 4 тижнів залежно від обсягу контенту та складності інтеграції. Вартість розраховується індивідуально після аудиту: оцінюємо кількість модулів, необхідну точність моделі, глибину кастомізації UI. Для швидкої оцінки вашого сценарію просто опишіть платформу та проблеми. Ми проаналізуємо та запропонуємо оптимальну архітектуру — безкоштовно та без зобов'язань. Замовте дзвінок або напишіть на пошту.

Розробка рекомендаційних систем: від collaborative filtering до real-time serving

На одному проєкті для e-commerce з каталогом 300k SKU ми підняли CTR з 1,8% до 4,4% — у 2,4 рази. Перший ривок дала колаборативна фільтрація замість «популярне за останні 7 днів», другий — додавання контентних ознак та re-ranking. Різниця між «показуємо популярне» і «показуємо персоналізоване» — вимірна та суттєва. Нижче — інженерний досвід, який допоміг це зробити, і архітектури, які реально працюють у продакшені.

Collaborative Filtering: матрична факторизація та нейронні підходи

Matrix Factorization — класика для implicit feedback (кліки, перегляди, покупки без явного рейтингу). ALS (Alternating Least Squares) у бібліотеці Implicit обробляє матриці user×item із сотнями мільйонів ненульових значень за хвилини на GPU. Latent factors 64–256, регуляризація λ=0.01–0.1 — стартові параметри. Проблема cold start: для нового користувача або товару немає історії — класичний CF безпорадний, потрібні контентні ознаки або гібрид.

Neural Collaborative Filtering (NCF) замінює скалярний добуток на нейромережу. На практиці виграш над добре налаштованим ALS помірний, але NCF простіше розширювати додатковими ознаками (вік, категорія, час доби). Sequence-aware моделі (SASRec, BERT4Rec) враховують порядок взаємодій — state-of-the-art для сесійних рекомендацій.

Як вибрати архітектуру рекомендаційної системи?

Відповідь залежить від даних, навантаження та вимог до холодного старту. Нижче — три основні підходи з критеріями вибору.

Критерій Collaborative Filtering Content-Based Filtering Гібридний (two-stage)
Дані для старту Історія взаємодій Ознаки об'єктів та користувачів І те, і інше
Cold start Провальний Працює для нових items Частково вирішено
Diversity (long-tail) Низький, popularity bias Високий Середній–високий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Складність впровадження Низька Середня Висока

Гібридна архітектура на 20–40% ефективніша за чистий CF за покриттям long-tail — перевірено на каталогах від 100k SKU.

Content-Based Filtering: коли історії взаємодій мало

Content-based рекомендує на основі характеристик товарів, а не поведінки інших користувачів — вирішує cold start для нових items. Текстові ембединги через sentence-transformers (multilingual-e5-base, BGE-M3) → пошук схожих через FAISS IndexFlatIP — запит за <5 ms на 100k товарів. Item2Vec (Word2Vec на послідовностях переглядів) дає інтерпретовані «схожі товари» за пару годин навчання.

Структуровані ознаки (категорія, бренд, ціна) подаються через embedding layers або в gradient boosting — CatBoost працює з категоріями без ручного кодування.

Чому гібридні моделі працюють краще?

Production-системи майже завжди дворівневі. Stage 1 (Retrieval) — швидкий відбір 100–500 кандидатів із 300k товарів через ALS або Two-Tower модель з векторним пошуком (FAISS, Qdrant). Stage 2 (Ranking) — важкий ранжувальник на LightGBM або нейромережі з cross-features, часом, пристроєм та контекстом сесії. LightFM — хороша відправна точка для середнього масштабу без важкої інфраструктури. Наша практика показує: перехід від single-stage до two-stage дає приріст точності на 15–25% при зростанні latency всього на 20–30 мс.

Real-Time Serving: архітектура під навантаження

Latency SLA — 50–100 ms при тисячах запитів на секунду. Base-рекомендації precompute (batch job раз на годину) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для подій (кліки, додавання в кошик) → оновлення контекстних ознак. Feature serving — Redis з TTL (кількість переглядів за 24 години, останній клікнутий item). При навантаженні 10k req/s ставимо Redis Cluster з реплікацією.

A/B тестування — єдиний достовірний спосіб оцінити покращення. Офлайн-метрики корелюють з онлайн не завжди. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обов'язкове читання для команди. Тест з 5–10% трафіку, моніторинг CTR, конверсії, revenue per session. Одна з наших клієнтських систем після гібридизації збільшила виручку на 18% за місяць A/B.

Терміни розробки рекомендаційної системи

Етапи та типові часові витрати — у таблиці нижче. Вартість розраховується індивідуально під масштаб каталогу та вимоги до latency.

Етап Тривалість Результат
Аудит даних та baseline 1–2 тижні Звіт із щільністю матриці, cold start-зонами, метриками «популярного»
Прототип (offline validation) 2–3 тижні Працююча модель з офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 місяця Low-latency сервіс з моніторингом та A/B-інфраструктурою
Навчання команди та документація 1–2 тижні Model card, runbook з деплою, сесія з донавчання

Що входить у розробку під ключ

  1. Аудит даних — щільність матриці user×item (зазвичай <0,1%), розподіл активності, temporal паттерни, cold start статистика.
  2. Baseline — «популярне» як простий поріг, який часто важко перевершити.
  3. Ітеративне покращення — ALS → контентні ознаки → two-stage → sequence-aware. Кожен крок з A/B.
  4. Інфраструктура serving — batch precomputation, Redis, real-time re-ranking, моніторинг у Grafana.
  5. Документація — model card з метриками, інструкція з деплою, опис ознак.
  6. Навчання команди — сесія з інтерпретації результатів та донавчання моделі.
  7. Підтримка — 1 місяць після запуску (фікс інцидентів, доналаштування pipeline).

Ми — команда з 7+ роками досвіду в рекомендаційних системах, реалізували понад 30 проєктів для e-commerce та медіа. Гарантуємо прозоре A/B-тестування та фіксацію покращення метрик.

Хочете оцінити потенціал зростання вашого каталогу? Зв'яжіться з нами для безкоштовного аудиту даних. Замовте розробку рекомендаційної системи — перший прототип протягом двох тижнів.

Приклад конфігу ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Більше про математику рекомендаційних систем — у Wikipedia.