Разработка AI-системы планирования карьеры сотрудников

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

AI-система карьерного планирования сотрудников

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

Анализ карьерных траекторий

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'
            )
        }

AI-система карьерного планирования снижает добровольную текучесть на 15-25% при активном использовании. Ключевое условие успеха: менеджеры должны регулярно работать с рекомендациями системы, а не просто иметь к ним доступ.