AI Corporate Learning and Upskilling System Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI Corporate Learning and Upskilling System Development
Medium
~2-4 weeks
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

AI-система корпоративного обучения и повышения квалификации

Корпоративное обучение отличается от образовательных платформ: важен не диплом, а применимость навыков к конкретной роли. AI-система связывает текущие компетенции сотрудника, требования роли, пробелы в навыках и доступный обучающий контент — и строит индивидуальный план развития.

Матрица компетенций и анализ пробелов

import pandas as pd
import numpy as np
from anthropic import Anthropic
import json

class CompetencyFramework:
    """Модель компетенций для ролей"""

    def __init__(self):
        # Шкала: 0=нет, 1=начальный, 2=базовый, 3=продвинутый, 4=экспертный
        self.role_requirements = {
            'senior_data_scientist': {
                'python': 3, 'sql': 3, 'machine_learning': 4,
                'statistics': 4, 'spark': 2, 'mlops': 3,
                'communication': 3, 'project_management': 2
            },
            'ml_engineer': {
                'python': 4, 'docker': 3, 'kubernetes': 2,
                'machine_learning': 3, 'ci_cd': 3, 'cloud_platforms': 3,
                'software_engineering': 4, 'mlops': 4
            },
            'data_analyst': {
                'sql': 4, 'python': 2, 'excel': 3,
                'tableau': 3, 'statistics': 2, 'communication': 4,
                'business_analysis': 3
            }
        }

    def get_skill_gaps(self, employee_skills: dict,
                        target_role: str) -> dict:
        """Пробелы между текущими навыками и требованиями роли"""
        requirements = self.role_requirements.get(target_role, {})
        gaps = {}

        for skill, required_level in requirements.items():
            current = employee_skills.get(skill, 0)
            gap = required_level - current
            if gap > 0:
                gaps[skill] = {
                    'current': current,
                    'required': required_level,
                    'gap': gap,
                    'priority': 'high' if gap >= 2 else 'medium' if gap == 1 else 'low'
                }

        return dict(sorted(gaps.items(), key=lambda x: -x[1]['gap']))


class SkillAssessmentEngine:
    """Автоматическая оценка навыков"""

    def __init__(self):
        self.llm = Anthropic()

    def assess_skill_from_resume(self, resume_text: str,
                                   target_skills: list[str]) -> dict:
        """Оценка уровня навыков из резюме"""
        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=400,
            messages=[{
                "role": "user",
                "content": f"""Assess skill levels from this resume. Scale: 0=none, 1=beginner, 2=basic, 3=advanced, 4=expert.

Skills to assess: {target_skills}

Resume:
{resume_text[:1000]}

Return JSON: {{"skill_name": level, ...}}
Be conservative — only give level 3-4 if explicitly demonstrated."""
            }]
        )

        try:
            return json.loads(response.content[0].text)
        except Exception:
            return {skill: 0 for skill in target_skills}

    def assess_from_work_products(self, work_samples: list[dict]) -> dict:
        """Оценка по продуктам работы (код, презентации, отчёты)"""
        # Каждый work_sample: {'type': 'code', 'content': '...', 'skills': ['python', 'ml']}
        skill_scores = {}

        for sample in work_samples:
            response = self.llm.messages.create(
                model="claude-3-5-sonnet-20241022",
                max_tokens=200,
                messages=[{
                    "role": "user",
                    "content": f"""Evaluate skill levels demonstrated in this work sample.
Type: {sample['type']}
Skills to evaluate: {sample['skills']}

Content:
{str(sample['content'])[:500]}

Return JSON: {{"skill": level_0_to_4}}"""
                }]
            )

            try:
                scores = json.loads(response.content[0].text)
                for skill, score in scores.items():
                    if skill not in skill_scores:
                        skill_scores[skill] = []
                    skill_scores[skill].append(score)
            except Exception:
                pass

        # Усредняем оценки из разных источников
        return {skill: round(np.mean(scores)) for skill, scores in skill_scores.items()}


class LearningPlanGenerator:
    """Генерация персональных планов обучения"""

    def __init__(self, content_catalog: pd.DataFrame):
        """content_catalog: id, title, skills, duration_hours, level, type, provider"""
        self.catalog = content_catalog
        self.llm = Anthropic()

    def create_individual_development_plan(self, employee: dict,
                                            skill_gaps: dict,
                                            time_budget_hours_per_week: float = 3,
                                            target_weeks: int = 12) -> dict:
        """Индивидуальный план развития (ИПР)"""
        total_available_hours = time_budget_hours_per_week * target_weeks

        # Приоритизация пробелов
        high_priority = {k: v for k, v in skill_gaps.items() if v['priority'] == 'high'}
        medium_priority = {k: v for k, v in skill_gaps.items() if v['priority'] == 'medium'}

        # Подбор контента для каждого пробела
        plan_items = []
        hours_used = 0

        for skill, gap_info in {**high_priority, **medium_priority}.items():
            if hours_used >= total_available_hours * 0.9:
                break

            # Ищем подходящий контент
            skill_content = self.catalog[
                self.catalog['skills'].apply(lambda s: skill in s if isinstance(s, list) else False)
            ]

            # Уровень контента = текущий + 1
            target_level = gap_info['current'] + 1
            filtered = skill_content[
                skill_content['level'].between(target_level - 0.5, target_level + 0.5)
            ]

            if filtered.empty:
                filtered = skill_content

            if filtered.empty:
                continue

            best_content = filtered.nsmallest(3, 'duration_hours').iloc[0]
            plan_items.append({
                'skill': skill,
                'gap_size': gap_info['gap'],
                'content_id': best_content['id'],
                'content_title': best_content['title'],
                'duration_hours': best_content['duration_hours'],
                'type': best_content.get('type', 'course'),
                'week_target': int(hours_used / time_budget_hours_per_week) + 1
            })
            hours_used += best_content['duration_hours']

        # LLM-объяснение плана
        plan_summary = self._generate_plan_narrative(employee, plan_items, target_weeks)

        return {
            'employee_id': employee['id'],
            'target_role': employee.get('target_role', ''),
            'plan_items': plan_items,
            'total_hours': round(hours_used, 1),
            'estimated_completion_weeks': target_weeks,
            'skills_covered': [item['skill'] for item in plan_items],
            'summary': plan_summary
        }

    def _generate_plan_narrative(self, employee: dict,
                                   plan_items: list,
                                   weeks: int) -> str:
        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=200,
            messages=[{
                "role": "user",
                "content": f"""Write a motivating 2-3 sentence summary of this learning plan in Russian.
Employee: {employee.get('name', 'Сотрудник')}, target role: {employee.get('target_role', '')}
Plan covers: {[item['skill'] for item in plan_items[:5]]}
Duration: {weeks} weeks
Be specific and encouraging."""
            }]
        )
        return response.content[0].text


class TeamSkillsAnalytics:
    """Аналитика навыков команды"""

    def get_team_skill_heatmap(self, team_skills: pd.DataFrame) -> pd.DataFrame:
        """Тепловая карта навыков команды"""
        # Средний уровень по навыкам
        skill_cols = [c for c in team_skills.columns if c != 'employee_id']
        return team_skills[skill_cols].mean().round(1).sort_values(ascending=False)

    def identify_single_points_of_failure(self, team_skills: pd.DataFrame,
                                           critical_skills: list[str],
                                           min_level: int = 3) -> list[dict]:
        """Критические навыки с единственным носителем"""
        spof = []
        for skill in critical_skills:
            if skill not in team_skills.columns:
                continue
            qualified = (team_skills[skill] >= min_level).sum()
            if qualified <= 1:
                experts = team_skills[team_skills[skill] >= min_level]['employee_id'].tolist()
                spof.append({
                    'skill': skill,
                    'qualified_count': qualified,
                    'experts': experts,
                    'risk': 'critical' if qualified == 0 else 'high'
                })
        return spof

Корпоративные системы обучения с AI-персонализацией повышают скорость закрытия компетентностных пробелов на 35-50% по сравнению с универсальными тренинговыми программами. ROI измеряется через time-to-productivity при переходе на новую роль и retention сотрудников.