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 сотрудников.







