AAYMA
RU
Войти

Career Quest

Сервис карьерного развития на синтетическом датасете Halyk (200 сотрудников, 60 навыков, 40 событий).

Рабочий MVP
Команда «Nexelle» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Nexelle
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP

Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития

Суть

Сервис карьерного развития на синтетическом датасете Halyk (200 сотрудников, 60 навыков, 40 событий). Строит траекторию грейдов и дефицит навыков, рекомендует 1–3 шага с объяснением, пересчитывает прогресс после завершения активности и формирует HR-аналитику.

Как устроено

JSON- и CSV-данные проходят валидацию в internal/importer и загружаются в in-memory store на Go. internal/progress пересчитывает уровни навыков по формуле gain + max_level. internal/recommendation отбрасывает обязательные мероприятия, проверяет пререквизиты и считает Score = Gap × Critical_Multiplier + History_Penalties + Feasibility: вес критичного навыка ×2.5, штрафы за no_show и dropped. internal/explanation формирует обоснования по шаблонам на RU и KK. Frontend на React 19 и Tailwind, переключение ролей сотрудник/HR, есть импорт датасета через API.

Ключевые решения

  • multi-factor scoring
  • prerequisite filtering
  • history penalties
  • explainable templates RU/KK
  • in-memory store

Метрики

отклик REST API < 30 мс

Особенности

Команда явно разбирает «ловушку жюри»: правило «бери минимальный навык» рекомендовало бы Public Speaking, а мультифакторный скоринг со штрафами за пропуски выбирает критичный System Design. Backend на Go без внешних сервисов, Python-версия оставлена для сверки алгоритма.

Стек

Go · React 19 · TypeScript · Vite · Tailwind CSS · Python · Docker Compose · nginx


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-c4ae53c5-nexelle.

README

README.md

Career Quest

AI-система персонализированного карьерного развития и HR-аналитики для АО «Народный Банк Казахстана» на официальном синтетическом датасете (200 сотрудников, 40 событий, 60 навыков, 24 мес. истории).

Сервис строит траекторию грейдов, рассчитывает дефицит компетенций (skill gaps), подбирает 1–3 релевантных шага с прозрачным обоснованием на 3+ факторах, мгновенно сдвигает прогресс при завершении активностей и формирует срез для HR.


Быстрый запуск (Docker — рекомендуется)

Запуск всего контура (Go Backend + React Frontend) одной командой:

docker compose up --build

Локальный запуск (без Docker)

Требования: Go 1.27+, Node.js 22+, pnpm.

# 1. Сборка фронтенда
cd web
pnpm install --frozen-lockfile
pnpm build
cd ..

# 2. Запуск сервера (раздает API и скомпилированный UI)
go run ./cmd/career-quest

Открыть в браузере: http://localhost:8080.

Переменные окружения перечислены в .env.example. По умолчанию зафиксирована дата среза SNAPSHOT_DATE=2026-10-01 (системное время не используется). Максимум навыка — 5.


Сценарий проверки MVP (Для жюри)

  1. Профиль сотрудника и траектория:
    • Открыть http://localhost:3000 (по умолчанию загружен E0001, Middle).
    • Отображаются текущие уровни навыков (0–5), требования для перехода на грейд Senior и 1–3 персональные рекомендации.
  2. Прозрачное объяснение (Explainable AI):
    • Каждая рекомендация содержит структурированное обоснование: дефицит навыка, критичность для грейда, статус пререквизитов и учет истории посещений.
  3. Выполнение активности и мгновенный сдвиг прогресса:
    • Нажать кнопку «Завершить активность» (Complete).
    • Сервер пересчитывает профиль по формуле gain + max_level, навык мгновенно сдвигается, траектория обновляется без перезагрузки.
  4. HR-дашборд:
    • Переключить роль на HR (тумблер в интерфейсе или заголовок X-Demo-Role: hr).
    • Отображается срез по 200 сотрудникам: топ дефицитных компетенций, сотрудники без траектории и статистика явки по активностям.

Загрузка проверочных данных жюри

Сервис поддерживает динамический импорт новых датасетов без перезапуска:

curl -X POST http://localhost:8080/api/import \
  -F "employees=@data/employees.json" \
  -F "events=@data/events.json" \
  -F "skills=@data/skills.json" \
  -F "history=@data/activity_history.csv"

Логика скоринга и решение ловушки жюри

В проверочном профиле жюри сотрудник имеет минимальный балл по Public Speaking (уровень 1 при норме 2), но трижды пропускал тренинги в истории, тогда как для целевого грейда критичен System Design (уровень 2 при норме 4).

Примитивное правило («бери минимальный навык») проваливается. Наш алгоритм:

  1. Исключает обязательные (mandatory) мероприятия и проверяет prerequisites.
  2. Применяет мультифакторный скоринг: Score = (Gap × Critical_Multiplier) + History_Penalties + Feasibility.
  3. Штрафует за пропуски (no_show, dropped) и повышает приоритет критического навыка (вес x2.5), безошибочно рекомендуя System Design.

Архитектура

data/*.json + activity_history.csv
  → internal/importer (валидация схемы и связей)
  → internal/store (in-memory потокобезопасное хранилище)
  → internal/progress (расчет уровней с учетом gain и max_level)
  → internal/recommendation (мультифакторный скоринг и фильтрация)
  → internal/explanation (шаблоны RU/KK + Explainable DTO)
  → internal/transport/httpapi (REST API, отклик < 30 мс)
  → web/ (React 19 + TypeScript + Vite + Tailwind CSS)

backend/ сохранен как автономная Python-реализация для проверки данных и алгоритма. Go не вызывает Python и не требует сторонних сервисов.


REST API

Метод и путьДоступ / РольНазначение
GET /healthБез ограниченийПроверка здоровья сервиса и размеры датасета
GET /api/v1/employees/{id}/profileemployeeПрофиль, уровни, gaps, evidence и рекомендации
POST /api/v1/employees/{id}/completeemployeeОтметка о прохождении активности и пересчет навыка
GET /api/eventsemployee / hrКаталог обучающих мероприятий
GET /api/skillsemployee / hrСправочник навыков с названиями
GET /api/v1/hr/analyticshrHR-агрегаты: дефициты, явка, вовлеченность
POST /api/importadmin / жюриДинамическая загрузка файлов датасета (multipart / ZIP)
  • Демо-доступ: заголовки X-Demo-Role: employee и X-Employee-ID: E0001, либо X-Demo-Role: hr.
  • Язык интерфейса и обоснований: параметр ?locale=ru или ?locale=kk.

Тестирование и верификация

Все тесты проходят со 100% успехом:

go test ./...              # Unit-тесты бэкенда (PASS)
go vet ./...               # Статический анализ Go
go build ./...             # Компиляция бинарника
cd web && pnpm test        # Тесты фронтенда

Дополнительные материалы

Звёзды
⭐ 0
Форки
0
Язык
Go
Последний push
в прошлом месяце
Коммиты
19
Авторы
4
Файлы
81
Ветки
6

Авторы коммитов

heewonenn 9heewonenn 5Gulnaz210 3Gulnaz Meiram 2

История коммитов

  • 2026-09-23 17:56Документация и запуск: обновлен README, настроен Docker healthcheck/proxy и добавлена презентацияheewonenn
  • 2026-09-23 17:42feat: connect frontend to Go backendGulnaz210
  • 2026-09-23 17:26Добавлены конфигурации Docker Compose для быстрого запускаheewonenn
  • 2026-09-23 17:18Исправить загрузку dataset и объединить Career Quest через Go APIheewonenn
  • 2026-09-23 17:18feat: prepare frontend API integrationGulnaz210
  • 2026-09-23 17:16Интегрировать фронтенд и Go APIheewonenn
  • 2026-09-23 16:45Добавили функциюheewonenn
  • 2026-09-23 16:14Добавлены стартовые данные и документация проектаheewonenn
Все коммиты (19)
  • 2026-09-23 16:05Добавить заметку для review recommendation engineheewonenn
  • 2026-09-23 15:54Расширить HTTP API и импорт данныхheewonenn
  • 2026-09-23 15:53Реализованы карьерный расчёт и рекомендацииheewonenn
  • 2026-09-23 15:53Добавлен доступ к профилю сотрудникаheewonenn
  • 2026-09-23 15:52Добавлен базовый backend Career Questheewonenn
  • 2026-09-23 15:49Merge AI recommendation engineGulnaz Meiram
  • 2026-09-23 15:18Implement AI recommendation engineheewonenn
  • 2026-09-23 15:04feat: add Career Quest demo frontendGulnaz210
  • 2026-09-23 14:53Merge pull request #2 from BAITC-Hacks/feature/frontend-hr-demoGulnaz Meiram
  • 2026-09-23 14:51Добавить демо интерфейс Career Questheewonenn
  • 2026-09-23 10:33Настройка базового файла .gitignoreheewonenn
Структура репозитория (81 файлов)
.dockerignore
.env.example
.gitignore
Dockerfile
README.md
backend/__init__.py
backend/ai_agent.py
backend/data_loader.py
backend/models.py
backend/recommendation_engine.py
backend/requirements.txt
backend/test_backend.py
cmd/career-quest/main.go
data/README.kz.md
data/README.md
data/README.ru.md
data/activity_history.csv
data/employees.json
data/events.json
data/skills.json
docker-compose.yml
docs/backend-development-guide.md
docs/development-plan.md
docs/integration.md
docs/presentation.html
docs/verification.md
go.mod
internal/config/config.go
internal/domain/contracts.go
internal/domain/types.go
internal/explanation/explanation.go
internal/explanation/explanation_test.go
internal/explanation/http.go
internal/importer/importer.go
internal/importer/importer_test.go
internal/importer/official_test.go
internal/progress/edge_cases_test.go
internal/progress/progress.go
internal/progress/progress_test.go
internal/recommendation/edge_cases_test.go
internal/recommendation/recommender.go
internal/recommendation/recommender_test.go
internal/service/career.go
internal/service/career_test.go
internal/service/integration_test.go
internal/store/memory.go
internal/store/memory_test.go
internal/transport/httpapi/handler.go
internal/transport/httpapi/handler_test.go
internal/transport/httpapi/web.go
pyproject.toml
requirements-dev.txt
web/.gitignore
web/Dockerfile
web/index.html
web/nginx.conf
web/package.json
web/pnpm-lock.yaml
web/pnpm-workspace.yaml
web/src/App.jsx
web/src/components/ActivityHistory.jsx
web/src/components/LanguageSwitch.jsx
web/src/components/MetricCard.jsx
web/src/components/ProgressBar.jsx
web/src/components/RecommendationCard.jsx
web/src/components/RoleSwitch.jsx
web/src/components/SkillProgress.jsx
web/src/i18n/translations.js
web/src/main.jsx
web/src/mocks/data.js
web/src/pages/CareerPath.jsx
web/src/pages/EmployeeDashboard.jsx
web/src/pages/HRDashboard.jsx
web/src/services/api.ts
web/src/services/contracts.ts
web/src/services/mockApi.js
web/src/styles/index.css
web/tests/api.integration.mjs
web/tests/api.test.mjs
web/tsconfig.json
web/vite.config.js
Ветки (6)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.