Career Quest
Сервис карьерного развития на синтетическом датасете Halyk (200 сотрудников, 60 навыков, 40 событий).
О проекте
Команда: 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.mdCareer Quest
AI-система персонализированного карьерного развития и HR-аналитики для АО «Народный Банк Казахстана» на официальном синтетическом датасете (200 сотрудников, 40 событий, 60 навыков, 24 мес. истории).
Сервис строит траекторию грейдов, рассчитывает дефицит компетенций (skill gaps), подбирает 1–3 релевантных шага с прозрачным обоснованием на 3+ факторах, мгновенно сдвигает прогресс при завершении активностей и формирует срез для HR.
Быстрый запуск (Docker — рекомендуется)
Запуск всего контура (Go Backend + React Frontend) одной командой:
docker compose up --build
- Веб-интерфейс: http://localhost:3000 (или http://localhost:8080)
- REST API: http://localhost:8080/api
- Проверка здоровья (Healthcheck): http://localhost:8080/health
Локальный запуск (без 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 (Для жюри)
- Профиль сотрудника и траектория:
- Открыть http://localhost:3000 (по умолчанию загружен
E0001, Middle). - Отображаются текущие уровни навыков (0–5), требования для перехода на грейд Senior и 1–3 персональные рекомендации.
- Открыть http://localhost:3000 (по умолчанию загружен
- Прозрачное объяснение (Explainable AI):
- Каждая рекомендация содержит структурированное обоснование: дефицит навыка, критичность для грейда, статус пререквизитов и учет истории посещений.
- Выполнение активности и мгновенный сдвиг прогресса:
- Нажать кнопку «Завершить активность» (Complete).
- Сервер пересчитывает профиль по формуле
gain + max_level, навык мгновенно сдвигается, траектория обновляется без перезагрузки.
- HR-дашборд:
- Переключить роль на HR (тумблер в интерфейсе или заголовок
X-Demo-Role: hr). - Отображается срез по 200 сотрудникам: топ дефицитных компетенций, сотрудники без траектории и статистика явки по активностям.
- Переключить роль на HR (тумблер в интерфейсе или заголовок
Загрузка проверочных данных жюри
Сервис поддерживает динамический импорт новых датасетов без перезапуска:
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).
Примитивное правило («бери минимальный навык») проваливается. Наш алгоритм:
- Исключает обязательные (mandatory) мероприятия и проверяет prerequisites.
- Применяет мультифакторный скоринг:
Score = (Gap × Critical_Multiplier) + History_Penalties + Feasibility. - Штрафует за пропуски (
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}/profile | employee | Профиль, уровни, gaps, evidence и рекомендации |
POST /api/v1/employees/{id}/complete | employee | Отметка о прохождении активности и пересчет навыка |
GET /api/events | employee / hr | Каталог обучающих мероприятий |
GET /api/skills | employee / hr | Справочник навыков с названиями |
GET /api/v1/hr/analytics | hr | HR-агрегаты: дефициты, явка, вовлеченность |
POST /api/import | admin / жюри | Динамическая загрузка файлов датасета (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 # Тесты фронтенда
Дополнительные материалы
- Интерактивная презентация проекта для защиты:
docs/presentation.html - Руководство по интеграции:
docs/integration.md - Описание исходных данных:
data/README.ru.md
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.