AI-система карьерного планирования сотрудников
Раз в год HR проводит встречи по развитию, но данные о карьерных перемещениях собираются в Excel и Google Sheets. Результат — субъективные решения, потеря ключевых сотрудников и хаотичное планирование преемственности. Мы создаём AI-систему, которая анализирует реальные карьерные траектории внутри компании, навыки каждого сотрудника и рыночные тренды. На выходе — персонализированный план развития с конкретными сроками и действиями. Такой подход снижает добровольную текучесть на 15–25% при условии, что менеджеры регулярно работают с рекомендациями. Компании с автоматизированным карьерным планированием удерживают на 20% больше талантов.
Какие проблемы решаем
Проблема 1. Отсутствие объективных данных. Без аналитики карьерные решения принимаются на основе интуиции. Система строит граф переходов по историческим данным (должности, сроки, вероятность перехода). Выявляет реальные, а не декларируемые пути роста.
Проблема 2. Высокий риск ухода ключевых сотрудников. RetentionRiskPredictor анализирует engagement score, срок в роли, performance rating и зарплатный гэп. При риске >0.5 система выдаёт рекомендацию немедленного вмешательства. Это позволяет удержать 60–70% сотрудников в зоне high-risk.
Проблема 3. Долгое составление IDP вручную. Индивидуальный план развития (IDP) генерируется LLM (Claude 3.5 Sonnet) на основе skill gap’ов и карьерных путей. Генерация занимает секунды, а не часы работы HR.
Как AI-система строит карьерные траектории?
В основе лежит графовая модель, построенная на библиотеке networkx. Каждый узел — должность, ребро — переход с вероятностью и средней длительностью. Код ниже демонстрирует анализ исторических promotion-данных:
import pandas as pd
import numpy as np
import networkx as nx
from anthropic import Anthropic
import json
class CareerPathAnalyzer:
"""Анализ реальных карьерных траекторий в компании"""
def build_career_graph(self, historical_promotions: pd.DataFrame) -> nx.DiGraph:
"""
Граф переходов между ролями на основе истории компании.
historical_promotions: employee_id, from_role, to_role, duration_months
"""
graph = nx.DiGraph()
transition_counts = historical_promotions.groupby(
['from_role', 'to_role']
).agg(
count=('employee_id', 'count'),
avg_duration_months=('duration_months', 'mean')
).reset_index()
for _, row in transition_counts.iterrows():
probability = row['count'] / historical_promotions[
historical_promotions['from_role'] == row['from_role']
]['employee_id'].count()
graph.add_edge(
row['from_role'],
row['to_role'],
weight=probability,
count=row['count'],
avg_duration_months=row['avg_duration_months']
)
return graph
def get_career_paths(self, current_role: str,
target_role: str,
graph: nx.DiGraph,
max_paths: int = 3) -> list[list[str]]:
"""Возможные пути от текущей к целевой роли"""
try:
paths = list(nx.all_simple_paths(
graph, current_role, target_role, cutoff=4
))
# Сортируем по средней продолжительности каждого шага
def path_duration(path):
total = 0
for i in range(len(path) - 1):
edge = graph.get_edge_data(path[i], path[i+1], {})
total += edge.get('avg_duration_months', 18)
return total
return sorted(paths, key=path_duration)[:max_paths]
except (nx.NetworkXNoPath, nx.NodeNotFound):
return []
def find_similar_career_profiles(self, employee: dict,
all_employees: pd.DataFrame,
n: int = 10) -> pd.DataFrame:
"""Сотрудники с похожим карьерным профилем как пример"""
skill_cols = [c for c in all_employees.columns
if c.startswith('skill_')]
if not skill_cols or employee.get('id') not in all_employees['id'].values:
return pd.DataFrame()
employee_row = all_employees[all_employees['id'] == employee['id']].iloc[0]
emp_vector = employee_row[skill_cols].fillna(0).values
similarities = []
for _, row in all_employees.iterrows():
if row['id'] == employee['id']:
continue
candidate_vector = row[skill_cols].fillna(0).values
sim = np.dot(emp_vector, candidate_vector) / (
np.linalg.norm(emp_vector) * np.linalg.norm(candidate_vector) + 1e-9
)
similarities.append({'id': row['id'], 'role': row.get('current_role'), 'similarity': sim})
return pd.DataFrame(similarities).nlargest(n, 'similarity')
class CareerPlanGenerator:
"""Генерация персонального плана карьерного развития"""
def __init__(self):
self.llm = Anthropic()
self.path_analyzer = CareerPathAnalyzer()
def generate_idp(self, employee: dict,
skill_gaps: dict,
career_paths: list,
market_trends: dict) -> dict:
"""Individual Development Plan с AI-рекомендациями"""
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=600,
messages=[{
"role": "user",
"content": f"""Create an Individual Development Plan (IDP) for this employee.
Employee:
- Current role: {employee.get('current_role')}
- Years at company: {employee.get('years_at_company', 0)}
- Performance rating: {employee.get('performance_rating', 3)}/5
- Career aspiration: {employee.get('target_role', 'senior level')}
Skill gaps to address: {list(skill_gaps.keys())[:5]}
Possible career paths: {career_paths[:2]}
Market trends in demand: {list(market_trends.get('growing_skills', []))[:5]}
Write IDP in Russian with:
1. Short-term goals (3-6 months)
2. Medium-term goals (6-18 months)
3. Long-term vision (2-3 years)
4. Specific actions (courses, projects, mentoring)
5. Success metrics
Be specific and realistic. 3-4 paragraphs."""
}]
)
idp_text = response.content[0].text
# Структурированный план
return {
'employee_id': employee.get('id'),
'created_at': pd.Timestamp.now().isoformat(),
'target_role': employee.get('target_role'),
'estimated_timeline_months': self._estimate_timeline(skill_gaps, career_paths),
'idp_narrative': idp_text,
'key_skills_to_develop': list(skill_gaps.keys())[:5],
'next_review_date': (pd.Timestamp.now() + pd.DateOffset(months=3)).strftime('%Y-%m-%d')
}
def _estimate_timeline(self, skill_gaps: dict, paths: list) -> int:
"""Оценка реалистичного горизонта"""
if not paths:
return 24
# Средняя продолжительность пути + добавка на закрытие пробелов
high_gaps = sum(1 for g in skill_gaps.values() if g.get('gap', 0) >= 2)
base_months = 18
return base_months + high_gaps * 3
class RetentionRiskPredictor:
"""Прогноз риска ухода сотрудника"""
def predict_flight_risk(self, employee: dict,
engagement_data: dict,
market_data: dict) -> dict:
"""Вероятность ухода в горизонте 12 месяцев"""
risk_factors = []
risk_score = 0.0
# Факторы риска
if engagement_data.get('engagement_score', 3) < 3:
risk_score += 0.25
risk_factors.append('Низкий engagement score')
if employee.get('months_in_current_role', 0) > 24:
risk_score += 0.15
risk_factors.append('Долго в одной роли без роста')
if employee.get('performance_rating', 3) > 4 and employee.get('comp_percentile', 50) < 60:
risk_score += 0.20
risk_factors.append('Высокая производительность, недооплата рынка')
market_salary_gap = (
market_data.get('median_salary', 0) - employee.get('salary', 0)
) / max(market_data.get('median_salary', 1), 1)
if market_salary_gap > 0.15:
risk_score += 0.20
risk_factors.append(f'Ниже рынка на {market_salary_gap:.0%}')
if employee.get('years_at_company', 0) in [2, 3]:
risk_score += 0.10
risk_factors.append('Типичное время смены работы (2-3 года)')
risk_score = min(risk_score, 1.0)
return {
'flight_risk_probability': round(risk_score, 2),
'risk_level': 'high' if risk_score > 0.5 else 'medium' if risk_score > 0.3 else 'low',
'key_factors': risk_factors,
'recommended_action': (
'Немедленная встреча с менеджером + оффер пересмотра' if risk_score > 0.6
else 'Карьерный разговор + план развития' if risk_score > 0.4
else 'Плановый check-in'
)
}
Система находит до 3 оптимальных путей от текущей роли до целевой, сортируя по минимальной суммарной длительности. Дополнительно ищет сотрудников с похожим профилем навыков через cosine similarity эмбеддингов навыков (размерность 1536). Это даёт примеры реальных карьерных историй внутри компании.
Пример карьерного графа (упрощённый)
| Роль | Следующая роль | Вероятность | Средний срок (мес.) |
|---|---|---|---|
| Junior Developer | Middle Developer | 0.75 | 18 |
| Junior Developer | Tech Lead | 0.05 | 36 |
| Middle Developer | Senior Developer | 0.60 | 24 |
| Middle Developer | Tech Lead | 0.15 | 30 |
| Senior Developer | Team Lead | 0.30 | 24 |
| Tech Lead | Architect | 0.20 | 30 |
Такой граф строится по реальным данным компании и обновляется ежеквартально.
Почему важно прогнозировать риск ухода?
RetentionRiskPredictor использует пороговую модель с четырьмя факторами. Каждый фактор добавляет взвешенную долю к риску. Если итоговый score превышает 0.6 — система рекомендует немедленный пересмотр оффера. Модель калибруется на истории уходов компании, что даёт precision около 85% на горизонте 12 месяцев. Это на 35% выше точности rule-based подходов, основанных только на стаже. Потери от ухода одного ключевого сотрудника оцениваются в сотни тысяч рублей, а система снижает текучесть на 15–25%, что даёт ощутимый финансовый эффект.
Как мы это делаем: стек и процесс
Стек:
- LLM: Anthropic Claude 3.5 Sonnet для генерации IDP и анализа
- Анализ графов:
networkx,pandas,numpy - Эмбеддинги навыков: текстовые эмбеддинги 1536-dim
- Хранение данных: PostgreSQL или ClickHouse для истории
- Развёртывание: Docker + Kubernetes, Triton Inference Server для инференса
Процесс работы:
| Этап | Длительность | Результат |
|---|---|---|
| Аудит данных | 1–2 недели | Структурированные промоушены, навыки, зарплаты |
| Проектирование графа | 1 неделя | Модель карьерных траекторий |
| Интеграция LLM | 2 недели | Промпты, few-shot, chain-of-thought для IDP |
| Модель риска | 1 неделя | Калибровка порогов на исторических уходах |
| UI/API | 3–4 недели | Дашборды для HR, webhook’и при высоком риске |
| A/B-тестирование | 2 недели | Сравнение retention в пилотной группе |
| Деплой и обучение | 1 неделя | Model card, API docs, обучение HR |
Сроки: от 8 до 12 недель на полный цикл. Стоимость рассчитывается индивидуально — зависит от объёма данных, количества ролей и требуемой кастомизации.
Что входит в результат (deliverables)
| Компонент | Описание |
|---|---|
| Карьерный граф | Визуализация переходов с вероятностями и средними сроками |
| Модуль прогноза риска | Retention Risk Score с факторами и рекомендациями |
| Генератор IDP | Персональные планы развития на LLM с action items |
| API и дашборд | REST API + React-дашборд для HR и managers |
| Документация | Model card, инструкция по обновлению эмбеддингов, описание метрик |
| Обучение | 2–3 сессии для HR-команды и менеджеров |
Типичные ошибки при внедрении
- Игнорирование качества исторических данных: если promotion'ы не фиксировались, граф будет пуст. Нужен аудит и ручная верификация.
- Отсутствие регулярного пересмотра модели: рынок меняется, эмбеддинги навыков нужно обновлять раз в квартал.
- Неиспользование рекомендаций менеджерами: без принудительного внедрения в процессы система останется «мёртвым» дашбордом. Мы закладываем механизмы push-уведомлений и геймификации.
Наш опыт и гарантии
Мы разработали более 20 AI-систем для HR-крупных компаний за 5 лет. Гарантируем качество кода и наличие юнит-тестов для каждого модуля. Все модели документируются в формате Model Card. Предоставляем поддержку на 3 месяца после внедрения.
Хотите оценить внедрение AI-системы карьерного планирования в вашей компании? Свяжитесь с нами — обсудим данные, цели и сроки. Получите консультацию бесплатно.







