Career Quest
Веб-приложение Career Quest: сотрудник видит разрывы навыков до цели и до трёх подходящих активностей с объяснением, HR — аналитику разрывов и…
О проекте
Команда: SUperAI Team
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Веб-приложение Career Quest: сотрудник видит разрывы навыков до цели и до трёх подходящих активностей с объяснением, HR — аналитику разрывов и импорт новых профилей.
Как устроено
Официальный датасет (200 сотрудников, 40 активностей, 60 навыков) валидируется и загружается; сервер детерминированно отбирает активности нужного грейда с выполненными prerequisites и полезным приростом, учитывая историю участия. LLM (GPT-4.1 mini через chat completions, JSON mode) выбирает 1–3 шага только из проверенных кандидатов и объясняет выбор; при недоступности — явный fallback по многофакторной формуле. Завершение активности пересчитывает навыки по формуле max(текущий, min(5, текущий+gain, max_level)) с защитой от двойного начисления, состояние в SQLite.
Ключевые решения
- gap analysis навыков
- фильтр по prerequisites/грейду
- LLM выбор из проверенных кандидатов
- JSON mode
- multi-factor fallback scoring
- атомарный импорт JSON/CSV
Особенности
LLM не может выдумать событие или изменить уровень навыка — все числа проверяются сервером; в LLM не отправляются ФИО и ID. Запуск одной командой start.py с проверкой датасета, трёхъязычный интерфейс RU/KK/EN.
Стек
Python · FastAPI · Pydantic · SQLite · Vue 3 · Vite · vue-i18n · pytest
Модели
GPT-4.1 mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d92c0861-superai-team.
README
README.mdCareer Quest
Понятный следующий шаг в карьере
Career Quest — веб-приложение для кейса Halyk Bank на HackAlem AI. Сотрудник видит, каких навыков ему не хватает до карьерной цели, какие активности помогут и почему они подходят именно ему. HR видит общие разрывы и может загрузить новые данные для проверки.
1. Что реализовано
- Профиль сотрудника: роль, грейд, стаж, навыки, история и карьерная цель.
- До трёх доступных шагов с четырьмя факторами: цель/грейд, разрывы навыков, история участия и формат.
- Прогноз изменения навыков и покрытия требований для каждого шага.
- Завершение активности с пересчётом прогресса, защитой от повторного начисления и сохранением в SQLite.
- HR-аналитика: разрывы, участие, сотрудники без доступного шага.
- Загрузка дополнительных профилей JSON и истории CSV прямо в HR-экране.
- Каталог активностей, русский, казахский и английский интерфейс.
- Разделение доступа: сотрудник видит свой профиль, HR — всю выборку.
Покрытие требований — не вероятность и не гарантия повышения. Рекомендации относятся к добровольному развитию; обязательные курсы не используются как игровые достижения. Публичного рейтинга сотрудников нет.
2. Как работает решение
Профиль и история → карьерная цель → разрывы → допустимые активности → выбор 1–3 шагов → объяснение → выполнение → обновлённый прогресс.
Сервер отбирает только активности подходящего грейда с выполненными prerequisites и полезным приростом. Учитывается история похожих активностей, включая пропуски, отказы и незавершённые участия. Эти факты не трактуются как оценка личности или мотивации.
LLM выбирает из проверенных кандидатов по совокупности факторов. Все числа и объясняющие факты проверяемы: модель не может придумать событие, изменить уровень навыка или начислить прогресс. При недоступности модели отображается явный режим fallback с причиной; это резервная многофакторная формула, а не ответ LLM.
3. Технологии
| Часть | Технологии |
|---|---|
| Интерфейс | Vue 3, Vite 7, JavaScript, vue-i18n |
| API и правила | Python 3.11+, FastAPI, Pydantic |
| Хранение | SQLite, исходные JSON/CSV только для чтения |
| AI | HTTPX, API chat completions; пример конфигурации OpenAI GPT-4.1 mini |
| Проверки | pytest, Node test runner, HTTP smoke с реальным сервером |
Документация выбранной модели. Модель и провайдер заменяются переменными окружения. Ключ нужен только серверу.
4. Архитектура
frontend/ Vue: сотрудник, каталог, HR, импорт
│ /api/*
backend/main.py FastAPI + права доступа
├── data_loader.py Валидация JSON/CSV
├── domain.py Навыки, цель, разрывы, допустимость
├── storage.py SQLite, импорт, повторяемость запросов
├── reporting.py HR-аналитика
└── ai/engine.py Рекомендации и объяснения
└── provider.py Проверяемый выбор LLM
shared/contracts.py Общие формы запросов и ответов
start.py Подготовка и запуск одной командой
API описан в docs/API_CONTRACT.md; интерактивная документация после запуска — http://127.0.0.1:8000/docs.
5. Запуск одной командой
Нужны Python 3.11+, Node.js 22.12+ и официальный архив career_quest_dataset.zip. При первом запуске нужен интернет для установки зависимостей.
Из корня клонированного репозитория:
python start.py --dataset "/путь/к/career_quest_dataset.zip"
На Windows можно использовать py start.py; на Linux/macOS — python3 start.py. Если ZIP лежит в корне проекта или в папке Downloads, достаточно:
python start.py
Команда создаёт виртуальное окружение, устанавливает зависимости, готовит локальные данные и токены, проверяет датасет, собирает интерфейс и запускает сервер. Существующие .env, исходные данные и прогресс сохраняются. Частично распакованный набор не перезаписывается автоматически: используйте полный набор в отдельном DATA_DIR.
Откройте http://127.0.0.1:8000. В поле входа вставьте значение HR_TOKEN или EMPLOYEE_TOKEN из созданного локального файла .env — только значение после =. Это токены входа в приложение; API-ключ модели сюда вставлять не нужно. Сотрудник по умолчанию — E0001.
Повторный быстрый запуск после установки:
.\.venv\Scripts\python.exe run.py
Linux/macOS: ./.venv/bin/python run.py. Остановка — Ctrl+C. Режим разработки — run.py --dev.
Включить LLM
Заполните локальный .env и перезапустите приложение:
AI_ENABLED=true
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4.1-mini
LLM_API_KEY=<обычный проектный API-ключ>
LLM_JSON_MODE=true
Административные ключи sk-admin-... не используются. Жюри может использовать собственный проектный ключ: командный ключ публиковать не требуется. Для другого совместимого провайдера измените URL и модель; если он не поддерживает JSON mode, поставьте LLM_JSON_MODE=false.
Без ключа все экраны, импорт и прогресс работают в явно обозначенном резервном режиме. Внешний запрос ограничен общим таймаутом 8 секунд. При ошибке можно повторить запрос: временная ошибка провайдера не сохраняется в кэше навсегда.
Проверка живой модели: .\.venv\Scripts\python.exe scripts\check_ai.py. Успех — mode=llm; при fallback команда возвращает ненулевой код и причину, не печатая ключ.
6. Сценарий проверки для жюри
- Запустите проект и войдите с
HR_TOKEN. Откройте профиль сотрудника, цель, критические разрывы и объяснения карточек. - Перейдите в HR-аналитика. В блоке импорта выберите свои дополнительные
employees.jsonи/илиactivity_history.csvв формате официального набора. Нажмите загрузку. Код и список ID менять не требуется. - Для воспроизводимой демонстрации можно взять наши три синтетических профиля из docs/jury_examples. После импорта новый ID доступен в выборе сотрудников сразу.
- Выберите сотрудника с доступной активностью в самостоятельном формате. Подтвердите фактическое завершение. Навыки, рекомендации и HR-сводка обновятся; двойной клик не должен давать двойной прирост.
- Проверьте профиль
TEST_CQ_003: отсутствие подходящего шага объясняется, выдуманной рекомендации нет. - Попробуйте испорченный JSON или CSV с повторяющимся
record_id: весь запрос отклоняется, ранее загруженные данные сохраняются. - Перезапустите приложение: импортированные профили и прогресс должны сохраниться.
- Выйдите и войдите с
EMPLOYEE_TOKEN: HR-экран и чужие профили недоступны. - Если ключ настроен, в карточках должен быть режим
llm. При ошибке провайдера показываютсяfallbackи причина. Переключите RU / KK / EN.
Каждый прогноз рассчитан независимо от текущего состояния; прогнозы карточек не складываются. Будущие сессии нельзя отметить завершёнными заранее.
7. Данные и интеграции
Официальный стартовый набор организаторов: 200 сотрудников, 40 активностей, 60 навыков, 32 матрицы требований, 2 743 записи истории. Дата среза — 2026-10-01, она берётся из данных.
Навыки профиля — срез последней оценки. Начисляются только завершения после last_review_date; более ранние достижения не учитываются повторно. Формула прироста: max(текущий, min(5, текущий + gain, max_level)).
Импорт поддерживает новые и существующие профили, историю отдельно или вместе с профилями. Все ссылки на навыки, активности и сотрудников проверяются. Лимит — 5 MiB на файл. Импорт атомарный: при ошибке ни одна его часть не сохраняется. Повторяющиеся ID записей внутри CSV запрещены.
Исходные данные не редактируются. Изменения хранятся в STATE_PATH, по умолчанию .local/career_quest.sqlite3. В LLM отправляются роль, цель, разрывы и сведения о кандидатах; ФИО, employee ID, manager ID и исходные файлы не отправляются.
Официальный ZIP и исходный датасет не включены в текущий main. Жюри использует архив организаторов. В репозитории есть только собственные проверочные примеры. .env, ключи, токены, база состояния и зависимости исключены из Git.
8. Проверки
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe scripts\check_dataset.py
.\.venv\Scripts\python.exe scripts\check_backend.py
npm --prefix frontend test
npm --prefix frontend run build
На Windows полный сценарий интерфейс → настоящий API → SQLite:
$env:DATA_DIR = (Resolve-Path docs).Path
$env:CQ_PYTHON = (Resolve-Path .venv\Scripts\python.exe).Path
npm --prefix frontend run test:live
Последняя проверка объединённой версии: 79 Python-тестов, 41 frontend-тест, production-сборка и сквозной сценарий успешно прошли на Python 3.13 / Node 24.15. Сквозная проверка использовала fallback; HTTP-контракт LLM проверен с тестовым провайдером. Подробнее — docs/VALIDATION.md.
9. Ценность и развитие
Сотрудник получает объяснимый следующий шаг и видит его ожидаемый результат. HR получает проверяемые причины разрывов и случаи, где каталога недостаточно. Следующие шаги развития: банковский SSO, подтверждение прохождения из LMS, интеграция HRIS, оценка качества рекомендаций на экспертной разметке и мониторинг использования.
10. Ограничения
- Настоящий LLM-вызов требует действующего проектного ключа и доступной квоты; на момент финальной проверки такой вызов не подтверждён.
- Demo-токены и один процесс SQLite предназначены для локального MVP, не для промышленной эксплуатации банка.
- Названия из датасета и серверные объяснения сохраняют язык исходных данных; переведена оболочка интерфейса.
- Исторический CSV не содержит точного времени завершения self-paced; используется доступная дата записи.
- Каталог ограничен: для некоторых сотрудников нет доступного полезного шага. Система сообщает об этом.
- Нет банковского SSO/HRIS/LMS, публичных рейтингов и автоматического решения о повышении.
- Полный аудит мобильной вёрстки и нагрузочные испытания не проводились.
11. Развёрнутая версия
Публичного развёртывания нет. Проверка — локально по команде выше. Репозиторий команды: BAITC-Hacks/hack-d92c0861-superai-team.
Авторы коммитов
История коммитов
- 2026-09-23 17:56feat: deliver integrated Career Quest MVP and jury documentationDamirmgg
- 2026-09-23 17:34docs: document current Career Quest setup and validationDamirmgg
- 2026-09-23 17:25feat(frontend): integrate Career Quest UI with backend APISayat Raximbekov
- 2026-09-23 16:57Merge remote-tracking branch 'origin/main' into sayat-frontSayat Raximbekov
- 2026-09-23 16:51feat: complete backend state import and HR overviewDamirmgg
- 2026-09-23 16:49feat: добавлен компонент AppIcon для переиспользуемых SVG-иконокSayat Raximbekov
- 2026-09-23 16:35docs: clarify shared main workflow for Career QuestDamirmgg
- 2026-09-23 15:59merge: sync latest mainDamirmgg
Все коммиты (32)
- 2026-09-23 15:58merge: integrate Career Quest applicationDamirmgg
- 2026-09-23 15:58feat: add Career Quest applicationDamirmgg
- 2026-09-23 15:58chore: initialize project structureMikGrevSU
- 2026-09-23 15:56chore: add AI environment configuratioMikGrevSU
- 2026-09-23 15:41Добавлены новые строки локализации для английского, казахского и русского языковSayat Raximbekov
- 2026-09-23 15:20Добавлена поддержка интернационализации с несколькими языковыми локалямиSayat Raximbekov
- 2026-09-23 15:08chore: add AI environment configuratioшMikGrevSU
- 2026-09-23 15:04chore: add AI environment configurationMikGrevSU
- 2026-09-23 15:00test: validate recommendation engine on full datasetMikGrevSU
- 2026-09-23 14:56Добавление файла package-lock.json для управления зависимостями проектаSayat Raximbekov
- 2026-09-23 14:56Рефакторинг App.vue и main.css для улучшения верстки и функциональностиSayat Raximbekov
- 2026-09-23 14:55docs: add project contextDamirmgg
- 2026-09-23 14:48feat: implement deterministic recommendation eniMikGrevSU
- 2026-09-23 14:38feat: implement deterministic recommendation engiMikGrevSU
- 2026-09-23 14:35docs: update files 2MikGrevSU
- 2026-09-23 14:33feat: implement deterministic recommendation engineMikGrevSU
- 2026-09-23 14:19feat: implement AI recommendation engine foundationMikGrevSU
- 2026-09-23 14:09docs: update filesMikGrevSU
- 2026-09-23 14:01docs: add Codex AI implementation guidelinesMikGrevSU
- 2026-09-23 13:56Добавление начальной структуры проекта с настройкой Vue 3 и ViteSayat Raximbekov
- 2026-09-23 13:56docs: add dataset documentation structureMikGrevSU
- 2026-09-23 13:42chore: initialize AI module structureMikGrevSU
- 2026-09-22 21:06Remove unused HTML and CSS filesMikGrevSU
- 2026-09-22 21:05Implement MVPMikGrevSU
Структура репозитория (73 файлов)
.env.example .gitattributes .gitignore README.md ai/README.md ai/__init__.py ai/engine.py ai/provider.py ai/requirements.txt backend/README.md backend/__init__.py backend/data_loader.py backend/domain.py backend/main.py backend/reporting.py backend/requirements.txt backend/storage.py docs/API_CONTRACT.md docs/DATASET_AUDIT.md docs/README.md docs/VALIDATION.md docs/examples/README.md docs/examples/completion.json docs/examples/hr.json docs/examples/import.json docs/examples/profile.json docs/examples/recommendations.json docs/jury_examples/README.md docs/jury_examples/activity_history.csv docs/jury_examples/employees.json docs/openapi.json frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/App.vue frontend/src/api.js frontend/src/assets/integration.css frontend/src/assets/main.css frontend/src/components/AppIcon.vue frontend/src/components/CatalogView.vue frontend/src/components/EmployeeView.vue frontend/src/components/HrView.vue frontend/src/components/RecommendationCard.vue frontend/src/i18n.js frontend/src/locales/employee.js frontend/src/locales/en.json frontend/src/locales/hr.js frontend/src/locales/integration.js frontend/src/locales/kk.json frontend/src/locales/ru.json frontend/src/main.js frontend/src/session.js frontend/tests/api.test.mjs frontend/tests/live-smoke.mjs frontend/tests/screens.test.mjs frontend/tests/session.test.mjs frontend/vite.config.js pytest.ini requirements.txt run.py scripts/check_ai.py scripts/check_backend.py scripts/check_dataset.py scripts/seed_data.py scripts/setup_env.py shared/__init__.py shared/contracts.py start.py tests/conftest.py tests/test_ai.py tests/test_api.py tests/test_domain.py
Ветки (4)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.