Career Quest
Django-приложение, которое по профилю, истории обучения и карьерной цели рекомендует сотруднику 1–3 объяснимых шага развития, ведёт личный план с…
О проекте
Команда: Meta Juniors
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Django-приложение, которое по профилю, истории обучения и карьерной цели рекомендует сотруднику 1–3 объяснимых шага развития, ведёт личный план с проверкой результата и показывает HR дефициты навыков команды.
Как устроено
Сервер вычисляет актуальные навыки (аттестация + завершения после неё), разрывы до целевой роли и допустимые мероприятия с учётом аудитории, расписания, истории и потолка прироста. Обезличенные признаки передаются в OpenAI gpt-4.1-mini (Responses API, Structured Outputs), модель ранжирует до трёх кандидатов, сервер проверяет каждый event_id, факт и эффект. При недоступности модели работает подбор по правилам. Прирост навыка применяется только после подтверждённого результата: new_level = max(cur, min(5, max_level, cur+gain)).
Ключевые решения
- анализ skill gap
- OpenAI Structured Outputs
- валидация ответа LLM
- фолбэк на правила
- атомарный импорт с предпросмотром
Метрики
68 тестов; live-вызов модели 4.44 с; медиана ответа: профиль 61.1 мс, HR-обзор 200 сотрудников 253.4 мс
Особенности
Модель только ранжирует заранее отфильтрованных кандидатов, а сервер проверяет каждый event_id и число, поэтому выдумать мероприятие она не может. Прогноз прогресса отделён от фактических навыков, а в модель не уходят персональные данные.
Стек
Python · Django · DRF · PostgreSQL · Pydantic · JavaScript · Docker Compose · Waitress · WhiteNoise
Модели
gpt-4.1-mini (OpenAI)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3cd2281d-meta-juniors.
README
README.mdCareer Quest
AI-навигатор развития сотрудников для кейса Halyk Bank · HackAlem AI 2026
Career Quest превращает разрозненные данные о навыках, карьерной цели и истории обучения в конкретный следующий шаг. Сотрудник видит что развивать, зачем и какой результат ожидается, а HR — где сосредоточены дефициты команды и кому нужна поддержка.
Профиль + история + цель → 1–3 объяснимые рекомендации → личный план → проверенный результат → обновлённый прогресс
Проблема
Корпоративный каталог обучения отвечает на вопрос «что доступно», но не отвечает на вопрос сотрудника: «что поможет именно мне приблизиться к следующей роли?»
- рекомендации без карьерного контекста выглядят случайными;
- пройденная активность не всегда означает приобретённый навык;
- HR видит множество записей, но не получает понятной картины дефицитов;
- повторный курс может быть формально подходящим, но уже не давать прироста.
Решение
Career Quest строит путь от карьерной цели к проверяемому действию:
flowchart LR
A[Профиль и история] --> B[Актуальные навыки]
B --> C[Разрывы до цели]
C --> D[Допустимые активности]
D --> E[AI ранжирует 1–3 шага]
E --> F[Сотрудник добавляет шаг в план]
F --> G[Результат проходит проверку]
G --> H[Навыки и прогресс пересчитываются]
Система не рекомендует мероприятие только потому, что оно совпало по названию навыка. Она проверяет аудиторию, требования, расписание, историю участия, уже начатые и завершённые шаги, реальный прирост и потолок каждого мероприятия.
Ценность продукта
| Для сотрудника | Для HR и бизнеса |
|---|---|
| Понятный следующий шаг вместо длинного каталога | Карта дефицитов по подразделениям и грейдам |
| Объяснение через цель, разрыв и историю | Список сотрудников, которым нужна поддержка |
| Ожидаемый прирост навыков до начала активности | Проверяемый цикл от рекомендации до результата |
| Личный план и прогноз покрытия цели | Загрузка новых профилей без изменения кода |
Что реализовано
Персональные рекомендации
- до трёх подходящих активностей;
- численный эффект, например
System Design 1 → 2; - объяснение через карьерный разрыв и историю сотрудника;
- исключение обязательных, недоступных, бесполезных и уже пройденных шагов;
- честное пустое состояние: цель достигнута, шаг уже в плане или каталог не закрывает потребность.
Личная траектория
- текущие уровни и требования целевой роли;
- приоритетный критичный разрыв;
- состояния плана:
запланировано → в работе → на проверке → завершено; - прогноз прогресса отдельно от фактических навыков;
- сохранение версий работы и обратной связи.
Навыки не меняются от одного нажатия «начать». Прирост применяется только после подтверждённого результата и не начисляется повторно.
HR-пространство
- дефициты команды относительно индивидуальных целей;
- фильтры по подразделению, грейду, навыку и сигналу поддержки;
- поиск по имени, ID и роли;
- согласованные показатели и список сотрудников для выбранного фильтра;
- импорт новых профилей и истории через безопасный предпросмотр.
HR выступает координатором развития. Технические задания и их содержательную оценку должен согласовывать компетентный руководитель или эксперт. В прототипе проверка доступна через общий HR-кабинет; отдельного назначения экспертов пока нет.
Если каталога недостаточно
Сотрудник может запросить индивидуальную практику по незакрытому навыку. HR согласует ожидаемый результат и критерии, после чего сотрудник добровольно добавляет задание в план. Для демонстрации подготовлен редактируемый кейс по проектированию сервиса уведомлений.
Это дополнительный сценарий. Основная ценность продукта — качественный и объяснимый подбор из существующего каталога.
Как работает AI
- Сервер вычисляет актуальные навыки, разрывы и список допустимых мероприятий.
- В модель передаются обезличенные признаки: роль, грейд, стаж, формат работы, цель, разрывы и агрегированная история.
- Модель ранжирует до трёх кандидатов и выбирает подтверждающие факты.
- Сервер проверяет каждый
event_id, факт, критичность и численный эффект. - Только проверенный результат показывается пользователю.
Модель не может придумать мероприятие, навык или число. Имена, ID сотрудников и сырые строки истории не отправляются. При недоступности провайдера включается явно обозначенный многофакторный подбор по правилам — основной сценарий остаётся рабочим.
Используются OpenAI Responses API и Structured Outputs. Модель по умолчанию — gpt-4.1-mini. Один контрольный live-вызов занял 4,44 с; это отдельный замер, не гарантия задержки под нагрузкой.
Данные и расчёт прогресса
Исходный синтетический набор:
| Сущность | Количество |
|---|---|
| Сотрудники | 200 |
| Мероприятия | 40 |
| Навыки | 60 |
| Профили ролей | 32 |
| Записи истории за 24 месяца | 2 743 |
Навыки из последней аттестации дополняются завершениями после last_review_date. Эффект активности ограничен шкалой 0–5 и её собственным потолком:
new_level = max(current_level, min(5, max_level, current_level + gain))
Покрытие цели показывает долю уже достигнутых уровней целевого профиля. Это индикатор развития, а не вероятность повышения.
Дополнительные employees.json и activity_history.csv проходят проверку схемы, связей, дат и повторов. До сохранения HR видит, сколько записей будет создано, изменено или оставлено без изменений. Подтверждение выполняется одной транзакцией.
Быстрый запуск
Требуются Docker Desktop или Docker Engine с Compose.
git clone https://github.com/BAITC-Hacks/hack-3cd2281d-meta-juniors.git
cd hack-3cd2281d-meta-juniors
docker compose up --build -d
Открыть http://localhost:8000. Первый запуск применит миграции, загрузит датасет и создаст демо-аккаунты. PostgreSQL хранится в Docker volume и не сбрасывается при обычном перезапуске.
| Роль | Логин | Пароль |
|---|---|---|
| Сотрудник, профиль E0028 | employee | career-demo-2026 |
| HR | hr | career-demo-2026 |
На странице входа есть кнопки обеих демо-ролей. Если порт 8000 занят, добавьте в .env строку APP_PORT=8001 и откройте http://localhost:8001.
Полезные команды:
docker compose ps
docker compose logs --tail=50 web
docker compose down
docker compose down сохраняет данные. Не добавляйте -v, если PostgreSQL volume нужно оставить.
Подключение OpenAI
Создайте .env, только если его ещё нет:
if (!(Test-Path .env)) { Copy-Item .env.example .env }
Добавьте ключ OpenAI Platform:
OPENAI_API_KEY=ваш_API_ключ
OPENAI_MODEL=gpt-4.1-mini
Пересоздайте web-контейнер:
docker compose up -d --force-recreate web
Ключ используется только сервером, не передаётся в браузер и исключён из Git. Без ключа приложение автоматически работает в резервном режиме и показывает это в интерфейсе.
Демо за 3 минуты
- Войти как employee и показать цель, разрывы и карточки рекомендаций.
- Открыть «Почему этот шаг подходит» и численный ожидаемый прирост.
- Добавить рекомендацию в план: прогноз изменится, фактические навыки — нет.
- Войти как HR и показать дефициты команды и фильтр по навыку.
- Открыть загрузку данных и объяснить предпросмотр неизвестных профилей.
Для отдельного примера корректного исключения откройте через HR профиль E0028 после завершения Designing High-Load Systems: повторный System Design Fundamentals с потолком 3 уже не даёт прироста и не должен рекомендоваться для цели Senior с требованием 4.
Подробный сценарий: docs/DEMO.md.
Архитектура
Django Templates + JavaScript
│
Django / DRF
├── career.py актуальные навыки и разрывы
├── recommendations.py AI, валидация и fallback
├── plans.py переходы личного плана
├── practice.py задания, версии и проверка
├── trajectory.py прогноз без записи в навыки
└── importer.py preview и атомарный импорт
│
PostgreSQL 16
Стек: Python 3.12 · Django 5.2 LTS · DRF · PostgreSQL 16 · OpenAI Responses API · Pydantic · JavaScript · Docker Compose · Waitress · WhiteNoise.
Ролевой доступ построен на Django sessions, группах и CSRF. Сотрудник видит только собственные профиль, план и работы. HR не может менять карьерную цель или план за сотрудника. Самопроверка результата запрещена.
Проверка качества
.\.venv\Scripts\python.exe manage.py test
.\.venv\Scripts\python.exe manage.py check
.\.venv\Scripts\ruff.exe check .
В финальной сборке:
- 68 тестов проходят на SQLite и PostgreSQL 16;
- контейнеры
webиdbпроходят healthcheck; - проверены вход, роли, CSRF, импорт, рекомендации, переходы плана, возврат работы и идемпотентность подтверждения;
- медиана локального HTTP-ответа: профиль 61,1 мс, HR-обзор 200 сотрудников 253,4 мс;
- мобильный интерфейс проверен при ширине 390 px.
Автотесты не расходуют API-кредиты: ответы модели там заменены контролируемыми данными. Live-проверка описана отдельно в docs/VERIFICATION.md.
Ограничения прототипа
- нет промышленной интеграции с корпоративными SSO и LMS;
- нет отдельной роли и механизма назначения технического эксперта;
- интерфейс преимущественно на русском, названия каталога сохранены на английском;
- прирост навыка основан на правилах синтетического датасета и не заменяет аттестацию;
- влияние на вовлечённость ещё не измерено на реальных пользователях;
- качество и задержка live-AI зависят от модели, сети и API.
Документация
- Discovery Matrix — исходный анализ
- Solution Validation Matrix — реализация и доказательства
- Архитектура, формулы и принятые решения
- Сценарий защиты
- Результаты проверок и измерений
- Описание исходного датасета
Команда
Meta Juniors · HackAlem AI 2026 · трек «Управление» · кейс Halyk Bank.
Данные предоставлены организатором и являются синтетическими. Код решения разработан командой во время хакатона с использованием Codex. Готовый сторонний проект Career Quest не использовался.
OpenAI: Structured Outputs · GPT-4.1 mini
Авторы коммитов
История коммитов
- 2026-09-23 17:37Finalize Career Quest product and validationZhandos Aktayev
- 2026-09-23 17:27docs: record verified QA fixes and regression evidencemeriodasuzwe
- 2026-09-23 17:24fix: close QA gaps in HR views and data validationmeriodasuzwe
- 2026-09-23 17:19docs: publish team-provided Career Quest READMEmeriodasuzwe
- 2026-09-23 16:46docs: update submission guide and QA for development plansmeriodasuzwe
- 2026-09-23 16:36Merge pull request #1 from BAITC-Hacks/qa-readmerewtesh
- 2026-09-23 16:31docs: add architecture diagramsЗарина Шерим
- 2026-09-23 16:02docs: add independent QA report and evidence for 0534bf7meriodasuzwe
Все коммиты (15)
- 2026-09-23 15:06Add development plans and safer data workflowsZhandos Aktayev
- 2026-09-23 14:31Build Career Quest MVPZhandos Aktayev
- 2026-09-23 14:12docs: add Career Quest QA checklistrewtesh
- 2026-09-23 14:11docs: add Career Quest demo guiderewtesh
- 2026-09-23 13:58docs: expand Career Quest READMEЗарина Шерим
- 2026-09-23 13:40docs: update Career Quest READMEЗарина Шерим
- 2026-09-23 13:38docs: add Career Quest README and QA filesЗарина Шерим
Структура репозитория (170 файлов)
.dockerignore .env.example .gitignore Dockerfile README.md compose.yaml config/__init__.py config/settings.py config/urls.py config/wsgi.py data/README.kz.md data/README.md data/README.ru.md data/activity_history.csv data/employees.json data/events.json data/skills.json docs/ARCHITECTURE.md docs/BUG_REPORT.md docs/DEMO.md docs/QA_PLAN.md docs/QA_REPORT.md docs/USER_GUIDE.md docs/VERIFICATION.md docs/analytics/Discovery Matrix AS-IS.xlsx docs/analytics/Solution_Validation_Matrix.xlsx docs/archive/2026-09-23-stage1/BUG_REPORT.md docs/archive/2026-09-23-stage1/QA_PLAN.md docs/archive/2026-09-23-stage1/QA_REPORT.md docs/images/HR_arch.png docs/images/employee_arch.png docs/images/prog_arch.png docs/qa/2026-09-23-stage2/employee-after.txt docs/qa/2026-09-23-stage2/employee-before.txt docs/qa/2026-09-23-stage2/environment.json docs/qa/2026-09-23-stage2/event-detail.txt docs/qa/2026-09-23-stage2/hr-all.txt docs/qa/2026-09-23-stage2/hr-e0028.txt docs/qa/2026-09-23-stage2/hr-filtered.txt docs/qa/2026-09-23-stage2/hr-qa002.txt docs/qa/2026-09-23-stage2/http_stage2.py docs/qa/2026-09-23-stage2/import-confirmed.txt docs/qa/2026-09-23-stage2/import-preview.txt docs/qa/2026-09-23-stage2/network-failure.txt docs/qa/2026-09-23-stage2/network-toast.json docs/qa/2026-09-23-stage2/plan-after-restart.txt docs/qa/2026-09-23-stage2/plan-completed.png docs/qa/2026-09-23-stage2/plan-completed.txt docs/qa/2026-09-23-stage2/plan-in-progress.txt docs/qa/2026-09-23-stage2/plan-planned.txt docs/qa/2026-09-23-stage2/qa002-no-steps.txt docs/qa/2026-09-23-stage2/qa_stage2.py docs/qa/2026-09-23-stage2/regression-tests.txt docs/qa/2026-09-23-stage2/results.json docs/qa/2026-09-23-stage2/standard-tests.txt docs/qa/2026-09-23/backend/BACKEND_RESULTS.md docs/qa/2026-09-23/backend/extra-suite.log docs/qa/2026-09-23/backend/qa_backend_extra.py docs/qa/2026-09-23/backend/standard-suite-result.txt docs/qa/2026-09-23/browser/access-_hr_.txt docs/qa/2026-09-23/browser/access-_hr_import_.txt docs/qa/2026-09-23/browser/access-_people_E0001_.txt docs/qa/2026-09-23/browser/after-server-restart.txt docs/qa/2026-09-23/browser/before-outage.txt docs/qa/2026-09-23/browser/employee-after-ev009.png docs/qa/2026-09-23/browser/employee-after-ev009.txt docs/qa/2026-09-23/browser/employee-before.png docs/qa/2026-09-23/browser/employee-before.txt docs/qa/2026-09-23/browser/employee-viewport.png docs/qa/2026-09-23/browser/goal-lead.txt docs/qa/2026-09-23/browser/goal-restored-senior.txt docs/qa/2026-09-23/browser/hr-before.png docs/qa/2026-09-23/browser/hr-before.txt docs/qa/2026-09-23/browser/hr-department.txt docs/qa/2026-09-23/browser/hr-e0028-after.txt docs/qa/2026-09-23/browser/hr-e0028-before.txt docs/qa/2026-09-23/browser/hr-imported-list.txt docs/qa/2026-09-23/browser/hr-qa003-after.txt docs/qa/2026-09-23/browser/hr-readonly-profile.txt docs/qa/2026-09-23/browser/import-empty.txt docs/qa/2026-09-23/browser/import-form.txt docs/qa/2026-09-23/browser/logged-out-protection.txt docs/qa/2026-09-23/browser/login-invalid.txt docs/qa/2026-09-23/browser/navigation-history.png docs/qa/2026-09-23/browser/navigation-history.txt docs/qa/2026-09-23/browser/qa001-counterexample.txt docs/qa/2026-09-23/browser/qa002-no-candidates.png docs/qa/2026-09-23/browser/qa002-no-candidates.txt docs/qa/2026-09-23/browser/qa003-after.txt docs/qa/2026-09-23/browser/qa003-before.txt docs/qa/2026-09-23/browser/recommendations-network-failure.txt docs/qa/2026-09-23/browser/recommendations-recovered.txt docs/qa/2026-09-23/browser/save-network-failure.png docs/qa/2026-09-23/browser/save-network-failure.txt docs/qa/2026-09-23/browser/save-recovered.txt docs/qa/2026-09-23/browser/ui-automation-timings.json docs/qa/2026-09-23/create_fixtures.py docs/qa/2026-09-23/environment.json docs/qa/2026-09-23/fixtures/EXPECTED.md docs/qa/2026-09-23/fixtures/STATIC_CHECK.json docs/qa/2026-09-23/fixtures/activity_history.csv docs/qa/2026-09-23/fixtures/employees.json docs/qa/2026-09-23/fixtures/invalid_employees.json docs/qa/2026-09-23/fixtures/invalid_history_unknown_event.csv docs/qa/2026-09-23/http/QA001_recommendations.json docs/qa/2026-09-23/http/QA002_recommendations.json docs/qa/2026-09-23/http/QA003_recommendations.json docs/qa/2026-09-23/http/combined_import_atomic_rejection.json docs/qa/2026-09-23/http/import_http_audit.py docs/qa/2026-09-23/http/invalid_csv_header.json docs/qa/2026-09-23/http/invalid_employee_range.json docs/qa/2026-09-23/http/invalid_header.csv docs/qa/2026-09-23/http/invalid_history_event.json docs/qa/2026-09-23/http/positive_import.json docs/qa/2026-09-23/http/repeat_import.json docs/qa/2026-09-23/http/results.json manage.py pyproject.toml quest/__init__.py quest/admin.py quest/context.py quest/forms.py quest/http_errors.py quest/management/__init__.py quest/management/commands/__init__.py quest/management/commands/bootstrap_demo.py quest/management/commands/import_dataset.py quest/migrations/0001_initial.py quest/migrations/0002_importdraft_developmentplanitem.py quest/migrations/0003_existing_progress_to_plan.py quest/migrations/0004_existing_demo_completions.py quest/migrations/0005_developmentrequest_practicebrief_worksubmission_and_more.py quest/migrations/__init__.py quest/models.py quest/schemas.py quest/services/__init__.py quest/services/career.py quest/services/importer.py quest/services/plans.py quest/services/practice.py quest/services/recommendations.py quest/services/trajectory.py quest/templatetags/__init__.py quest/templatetags/quest_tags.py quest/tests.py quest/urls.py quest/views.py quest/workflow_views.py requirements-dev.txt requirements.txt scripts/run-local.ps1 scripts/serve.py scripts/smoke_http.py static/app.css static/app.js templates/base.html templates/quest/_trajectory.html templates/quest/development_requests.html templates/quest/error.html templates/quest/event.html templates/quest/hr.html templates/quest/hr_development.html templates/quest/hr_request.html templates/quest/hr_review.html templates/quest/import.html templates/quest/no_profile.html templates/quest/plan.html templates/quest/profile.html templates/quest/workspace.html templates/registration/login.html
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.