AAYMA
RU
Войти

Career Quest

Веб-навигатор карьеры: для сотрудника до 3 рекомендаций активностей с объяснением и прогнозом «что изменится», для HR — дефициты навыков и пробелы…

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

О проекте

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

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

Суть

Веб-навигатор карьеры: для сотрудника до 3 рекомендаций активностей с объяснением и прогнозом «что изменится», для HR — дефициты навыков и пробелы каталога; поверх детерминированного движка добавлен AI Career Agent.

Как устроено

Данные стартового кита (200 профилей, 40 событий, 60 навыков, 2743 записи истории) загружаются в engine.py: навыки восстанавливаются с учётом завершений после last_review_date, фильтры исключают неподходящие события. Вероятность участия считается бета-биномиальной оценкой (completed+2)/(resolved+4) со смесью 25% тип + 25% формат + 50% личная история; ранжирование по формуле benefit × (0.5+0.5×p)/sqrt(duration). AI Career Agent на OpenAI Responses API с function calling (4 tools) выбирает шаг из Top 3, сервер проверяет ссылки и подставляет исходные факты.

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

  • бета-биномиальное сглаживание
  • прозрачный скоринг-ранжирование
  • function calling
  • OpenAI Responses API
  • coverage с весами критических навыков

Метрики

41 тест пройден; расчёт рекомендаций для 200 профилей ~0.13 с; ответ живого AI 6.1 с

Особенности

Агент не публикует свободный текст модели: модель выбирает только ID активности/навыка и порядок ссылок, а сервер подставляет факты и проверяет полноту доказательств; оценка участия явно не используется для кадровых решений.

Стек

Python · стандартная библиотека http-сервер · JavaScript · HTML/CSS · OpenAI SDK · Render

Модели

gpt-4.1-mini


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

README

README.md

Career Quest

Карьерный навигатор для кейса Halyk Bank на HackAlem. Сотрудник видит, как конкретная активность сокращает разрыв до карьерной цели, почему она предложена и что изменится после завершения. HR видит нехватку навыков и пробелы каталога.

Актуальное демо

Публичный адрес пока не опубликован. Для размещения готова конфигурация Render и инструкция.

Открыть актуальное локальное демо Career Quest →

Последняя проверка: 23 сентября 2026 — живой AI ответил за 6.138 секунды. Ссылка работает только на компьютере, где запущен сервер; это не публичный адрес для жюри или команды.

Запуск демо по этому адресу:

.venv/bin/python run.py --ask-key --port 8001

Подготовка окружения для первого запуска описана ниже.

Запуск одной командой

Нужен Python 3.9 или новее. Сдаваемая версия — server.py + engine.py + web/. Обычные рекомендации работают без внешних сервисов.

Для AI и полного набора тестов один раз подготовьте окружение:

python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt

Запуск с невидимым вводом ключа (ключ хранится только в памяти процесса):

.venv/bin/python run.py --ask-key

Если порт 8000 занят, добавьте --port 8001. Либо передайте OPENAI_API_KEY в окружении и используйте .venv/bin/python run.py. Не добавляйте ключ в файлы проекта или коммиты. Без AI запуск остаётся таким:

python3 -B server.py

Открыть http://127.0.0.1:8000. Порт можно изменить: PORT=8080 python3 -B server.py.

Вход сотрудника — выбор синтетического профиля. Вход HR — пароль hackalem-demo. Для собственного пароля: HR_PASSWORD='your-local-password' python3 -B server.py.

Это демонстрационный прототип: выбор личности сотрудника не заменяет корпоративную аутентификацию. По умолчанию сервер слушает 127.0.0.1; для хостинга предусмотрены BIND_ADDRESS=0.0.0.0 и порт PORT. Публичное демо использует только синтетические данные и не предназначено для производственной эксплуатации. Настройка HTTPS-cookie и пароля HR описана в инструкции публикации.

Что работает

  • Все 200 профилей, 40 событий, 60 навыков и 2743 записи истории из стартового комплекта.
  • Цель из career_goal; если её нет — следующий грейд текущей роли. Для Lead — развитие в текущем грейде.
  • До трёх рекомендаций с объяснением: текущий грейд, целевые требования, дефицит навыков, история участия, вклад и длительность.
  • «Что изменится?» показывает уровни навыков до/после и прирост покрытия цели.
  • Ограничение времени на одну активность и объяснение отсутствия подходящих вариантов.
  • Симуляция выполнения с сохранением, пересчётом навыков и рекомендаций. Завершение будущей сессии допустимо только как явно обозначенная демо-симуляция.
  • HR: частые дефициты, сотрудники без доступного шага, участие и завершения по событиям.
  • Импорт дополнительных employees.json и activity_history.csv в HR-интерфейсе.
  • Серверное разграничение доступа сотрудник/HR, HttpOnly-сессии, защита от межсайтовых POST, экранирование данных в UI.

Где здесь AI

Используется интерпретируемая статистическая модель участия, обучаемая на разрешённых исходах добровольных активностей (completed, no_show, dropped, declined). Эта часть движка остаётся детерминированной. Поверх неё добавлен AI Career Agent (career_agent.py) через OpenAI Responses API с function calling. По кнопке агент получает профиль, требования, историю и Top 3 через tools; результаты этих tools передаются OpenAI (store=False).

Для типа активности, её формата и пары «сотрудник + тип» вычисляется бета-биномиальная оценка (completed + 2) / (resolved + 4). Итоговая оценка — 25% тип + 25% формат + 50% личная история. Сглаживание даёт осмысленное значение при отсутствии истории. Модель не утверждает причинную связь и пока не имеет доказанной калибровки на независимой выборке.

Дальше применяется прозрачное ранжирование:

benefit = сумма закрытых уровней целевых навыков (вес критических = 2)
score = benefit × (0.5 + 0.5 × participation_estimate) / sqrt(duration_hours)

Начатая активность получает множитель 1.2; очная активность для remote-профиля — 0.8. Коэффициенты — эвристики прототипа. История влияет на рекомендацию, но не лишает сотрудника возможности развивать навык. Объяснение строится из фактических данных расчёта, без выдуманных причин. Оценка участия не используется для кадровых решений.

Перед ранжированием исключаются обязательные события, неподходящая текущая роль/грейд, невыполненные prerequisites, прошедшие сессии, превышение бюджета, отсутствие пользы для цели и уже завершённые события. Исключение для повторений — клуб EV_036, максимум одна демо-симуляция в день.

Расчёт прогресса

Дата демо — 2026-10-01, как задано в комплекте; системная дата не используется. Базовые навыки берутся из оценки сотрудника. Только завершения строго после last_review_date добавляют прирост; более ранние не учитываются повторно. Повторная запись завершённого неповторяемого курса не увеличивает навык дважды.

new_level = max(old_level, min(5, max_level, old_level + gain))
coverage = sum(min(level, required) × weight) / sum(required × weight) × 100
weight = 2 для critical_skills, иначе 1

Высокий навык не снижается курсом с меньшим max_level. Покрытие — показатель соответствия навыков, не вероятность повышения. Для ротации оцениваются требования целевой роли, но допуск к событиям проверяется по текущей роли; отсутствие переходных событий явно показывается HR.

Импорт для жюри

  1. Войти как HR и открыть блок «Проверочные профили жюри».
  2. Выбрать JSON: один профиль, массив профилей или { "employees": [...] }; CSV истории можно загрузить одновременно или отдельно. Минимум для профиля: employee_id, role, grade, skills; имя и стаж могут быть дополнены системой.
  3. Нажать «Проверить и импортировать». Импорт объединяет по employee_id и record_id, заменяя совпавшие записи. Уникальные старые записи сохраняются.
  4. Через круглый значок CQ открыть вход и выбрать загруженного сотрудника.

Проверяются известные роли/грейды, карьерные цели, ссылки, статусы, даты и целые уровни навыков 0–5. При ошибке ни одна запись пакета не сохраняется. CSV: UTF-8, стандартная схема стартового комплекта. Каталоги событий и навыков фиксированы.

Изменения записываются в var/state.json атомарной заменой. Для чистого демо остановить сервер и переместить этот файл в резервную копию, затем перезапустить. Исходные данные в data/ не изменяются. Импортированные данные не нужно коммитить.

Архитектура

web/index.html + app.js + style.css
              ↓ HTTP JSON / cookie session
server.py: API, права, импорт, атомарное сохранение
              ↓
engine.py: восстановление навыков, модель участия, ранжирование, HR
              ↓
data/: исходный комплект      var/state.json: локальные изменения

Python standard library + JavaScript/CSS; официальный OpenAI SDK для опционального AI-анализа. Без сборки frontend. Состояние защищено блокировкой в одном процессе; многопроцессный production потребует БД.

Основные API: POST /api/login, GET /api/profile?hours=80, POST /api/complete, GET /api/hr, POST /api/import. Чужой профиль и HR API недоступны с сессией сотрудника. GET /api/demo намеренно раскрывает список синтетических имён для демо-входа.

Проверка

.venv/bin/python -B -m unittest discover -s tests -v

Тесты API запускают временный сервер на loopback и работают с временным состоянием. Проверяются: доступы, импорт и его атомарность, повторное завершение, корректный рост, учёт последней оценки, ограничения на всех 200 профилях, критический навык против минимального, ротация и бюджет времени.

В среде с запретом локальных сокетов отдельно можно запустить ядро:

python3 -B -m unittest discover -s tests -p test_engine.py -v

Проверено в рабочей среде: 41 тест основного приложения и экспериментального прототипа прошёл после установки requirements.txt; расчёт рекомендаций для всех 200 профилей занял около 0.13 секунды (ядро, без сети и отрисовки). Проверки логики не заменяют независимую оценку качества рекомендаций. Выполнена визуальная проверка в Chrome: десктоп, мобильная ширина 390 px и форма импорта на 320 px. Проверены вход сотрудника/HR, объяснение и прогноз, ошибка пароля, форма импорта без файла. Подробности и границы проверки — в отчёте QA.

Границы прототипа

Нет SSO, подтверждения обучения через LMS, production-БД, полноценной казахской локализации, оценки качества на скрытых профилях и развёртывания в инфраструктуре банка. Названия и описания событий сохранены на английском из каталога; интерфейс на русском. Синтетические данные предназначены только для хакатона: не публикуйте комплект за его пределами.

План команды и идеи · Сценарий защиты

AI Career Agent

POST /api/agent/recommend принимает {"employee_id":"E0028"} и необязательный hours (по умолчанию 80). Нужна существующая cookie-сессия: сотрудник может анализировать только себя, HR — любой профиль.

Агенту доступны get_employee_profile, get_next_grade_requirements, get_activity_history, get_recommendations. Порядок вызовов выбирает модель; сервер проверяет полноту доказательств перед финальным ответом. Рекомендации берутся из Engine.profile() — того же движка, который использует web-интерфейс. Требования следующего грейда отделены от выбранной карьерной цели.

Модель выбирает активность из Top 3, навык, альтернативу и порядок ссылок на объяснения tools. Сервер проверяет эти ссылки и подставляет исходные факты, gain с учётом max_level и текст объяснений. Произвольный текст модели и chain-of-thought не публикуются. tools_used содержит только успешно выполненные вызовы, запрошенные моделью; fallback-вызов движка туда не добавляется.

Модель по умолчанию — gpt-4.1-mini; можно задать OPENAI_MODEL через environment. Ограничения: до 6 итераций, общий бюджет ожидания AI — 8 секунд, без повторных сетевых попыток SDK. Внешний поток ожидания возвращает fallback по истечении бюджета даже при зависшем SDK; максимум четыре read-only AI-работника одновременно. Просроченный работник удерживает слот до завершения и не пишет данные. Запас до лимита задания 10 секунд оставлен на локальный расчёт и HTTP; задержку живого сервиса нужно измерить на демонстрационном ноутбуке. При отсутствии ключа, SDK, ошибке API или некорректном решении возвращается mode: "fallback" и обычная рекомендация. Ошибки SDK и секреты в JSON не включаются.

Для полного набора тестов установите python3 -m pip install -r requirements.txt. Тесты агента используют подменённые ответы SDK для проверки реального выполнения локальных tools в нескольких раундах; это не доказательство успешного обращения к OpenAI. Живой тест: запустить сервер в окружении с ключом, войти как E0028 и нажать «Анализировать мой следующий шаг»; ответ должен содержать mode: "openai" и фактический tools_used.

Формат интеграции: официальная документация OpenAI по function calling.

Проверка живого AI и версии

Внизу страницы показаны версия процесса и состояние конфигурации AI. GET /api/health возвращает только build ID и булевы признаки наличия ключа/SDK, без секретов. После обновления Python-кода перезапустите сервер: обновление страницы само по себе не перезагружает Python.

После запуска с ключом:

.venv/bin/python scripts/check_live_ai.py
# Для второго порта:
.venv/bin/python scripts/check_live_ai.py --url http://127.0.0.1:8001

Успех — PASS, mode=openai, четыре выполненных tools и задержка меньше 10 секунд. Команда завершится ненулевым кодом при fallback: резервный ответ не выдаётся за подтверждённый AI.

23 сентября 2026 живой тест E0028 на локальном порту 8001 прошёл: сборка 555ed5d026, mode=openai, fallback_reason=null, время 6.138 секунды. Выполнены все четыре инструмента: get_employee_profile, get_next_grade_requirements, get_activity_history, get_recommendations. Это один успешный запрос; он не доказывает стабильную задержку под нагрузкой или качество рекомендаций для всех профилей.

Экспериментальный прототип

app.py, recommender.py, data_loader.py, hr_dashboard.py и career_quest_dataset/ сохранены как исторический Streamlit-прототип команды. Он не является сдаваемой версией, использует другую формулу и не заменяет основной web. При запуске виден предупреждающий баннер. Его тесты проверяют только этот экспериментальный путь. Основные web и AI используют единый Engine.profile(); демо и защита проводятся только через server.py.

Импорт пограничных данных

CSV с UTF-8 BOM поддерживается. Повторные завершения неповторяемого курса с разными record_id не начисляют навык повторно, в том числе если первая запись была до даты оценки. При отсутствующей дате оценки исторические завершения не проигрываются; интерфейс сообщает об этом явно. Это консервативное правило, чтобы не удвоить уже оценённые навыки.

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

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

ayaulymzhanabay 5AluaZhanbulat 5Akbar 2

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

  • 2026-09-23 17:25Prepare Python demo for Render hosting with HTTPS cookiesayaulymzhanabay
  • 2026-09-23 17:18Document current local demo URLayaulymzhanabay
  • 2026-09-23 17:17Finalize Career Quest demo reliability and live AI verificationayaulymzhanabay
  • 2026-09-23 16:40Add tool-calling career agent and fix judge profile import navigationAluaZhanbulat
  • 2026-09-23 15:43Merge remote history with integrated Career QuestAkbar
  • 2026-09-23 15:39Build integrated Career Quest web demoAkbar
  • 2026-09-23 14:55Merge latest team changesAluaZhanbulat
  • 2026-09-23 14:48commit1ayaulymzhanabay
Все коммиты (12)
  • 2026-09-23 14:47Merge Ayaulym demo with Career Quest logicAluaZhanbulat
  • 2026-09-23 14:42Alua Career Quest MVPAluaZhanbulat
  • 2026-09-23 14:28commit 1AluaZhanbulat
  • 2026-09-23 14:22commitayaulymzhanabay
Структура репозитория (44 файлов)
.gitignore
README.md
app.py
career_agent.py
career_quest_dataset/README.kz.md
career_quest_dataset/README.md
career_quest_dataset/README.ru.md
career_quest_dataset/activity_history.csv
career_quest_dataset/employees.json
career_quest_dataset/events.json
career_quest_dataset/skills.json
data/README.kz.md
data/README.md
data/README.ru.md
data/activity_history.csv
data/employees.json
data/events.json
data/skills.json
data_loader.py
docs/DEMO.md
docs/DEPLOY.md
docs/READINESS_REVIEW.md
docs/TEAM_PLAN.md
docs/VISUAL_QA.md
engine.py
hr_dashboard.py
recommender.py
render.yaml
requirements-web.txt
requirements.txt
run.py
scripts/check_live_ai.py
server.py
tests/judge_sample/activity_history.csv
tests/judge_sample/employees.json
tests/test_api.py
tests/test_app.py
tests/test_career_agent.py
tests/test_engine.py
tests/test_recommender.py
tests/test_upload.py
web/app.js
web/index.html
web/style.css

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

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

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