AAYMA
RU
Войти

Career Quest

Django-приложение, которое по профилю, истории обучения и карьерной цели рекомендует сотруднику 1–3 объяснимых шага развития, ведёт личный план с…

Доведённый продукт
Команда «Meta Juniors» 13💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

Career 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

  1. Сервер вычисляет актуальные навыки, разрывы и список допустимых мероприятий.
  2. В модель передаются обезличенные признаки: роль, грейд, стаж, формат работы, цель, разрывы и агрегированная история.
  3. Модель ранжирует до трёх кандидатов и выбирает подтверждающие факты.
  4. Сервер проверяет каждый event_id, факт, критичность и численный эффект.
  5. Только проверенный результат показывается пользователю.

Модель не может придумать мероприятие, навык или число. Имена, 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 и не сбрасывается при обычном перезапуске.

РольЛогинПароль
Сотрудник, профиль E0028employeecareer-demo-2026
HRhrcareer-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 минуты

  1. Войти как employee и показать цель, разрывы и карточки рекомендаций.
  2. Открыть «Почему этот шаг подходит» и численный ожидаемый прирост.
  3. Добавить рекомендацию в план: прогноз изменится, фактические навыки — нет.
  4. Войти как HR и показать дефициты команды и фильтр по навыку.
  5. Открыть загрузку данных и объяснить предпросмотр неизвестных профилей.

Для отдельного примера корректного исключения откройте через 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.

Документация

Команда

Meta Juniors · HackAlem AI 2026 · трек «Управление» · кейс Halyk Bank.

Данные предоставлены организатором и являются синтетическими. Код решения разработан командой во время хакатона с использованием Codex. Готовый сторонний проект Career Quest не использовался.

OpenAI: Structured Outputs · GPT-4.1 mini

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

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

meriodasuzwe 5Зарина Шерим 4Zhandos Aktayev 3rewtesh 3

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

  • 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
Ветки (4)

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

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

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