О проекте
Команда: Cerebrum
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Доведённый продукт
Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)
Суть
Агент тарифных кампаний Beeline с локальной веб-панелью. Проверяет гипотезы пилотами, уточняет эффект и выдаёт план из 1–10 кампаний с экспортом submission.csv.
Как устроено
Клиенты группируются по тарифу и сегментам ARPU, потребления данных и звонков. Гипотезы получают приоритет по истории смен тарифов, затем проверяются пилотами через env.run_pilot() с повторными измерениями перспективных. Финальный план строится по нижней оценке чистого эффекта с учётом остатка ресурсов. Опциональная LLM (OpenAI Responses API) переставляет порядок гипотез по агрегатам; ответ проверяется, при ошибке используется локальный алгоритм. Панель на http.server показывает кампании, историю пилотов и решения агента.
Ключевые решения
- segmentation
- adaptive pilots
- lower-bound net effect selection
- LLM hypothesis reordering with validation
Особенности
run.py --check проверяет SHA-256 пакета участника, прогоняет seeds 42 и 0–9, дважды запускает экспортёр и сравнивает CSV побайтно. Отдельно есть preflight и security_audit репозитория.
Стек
Python · NumPy · pandas · http.server · HTML/JS · unittest
Модели
OpenAI gpt-4.1-mini-2025-04-14
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-deb8a427-cerebrum.
README
README.mdCerebrum — агент тарифных маркетинговых кампаний
Cerebrum помогает аналитику маркетинга выбрать, каким клиентам предложить смену тарифа и через какой канал, когда бюджет, число контактов и экспериментов ограничены. Решение разработано для кейса Beeline на HackAlem AI.
Агент проверяет гипотезы небольшими пилотами, уточняет оценки эффекта и
возвращает план из 1–10 кампаний. Результат можно изучить в локальной панели
и выгрузить в submission.csv официального формата.
Для жюри: базовый режим работает без API-ключа и аккаунта внешнего сервиса. Нужны Python 3.11+, официальный пакет участников и интернет для первой установки зависимостей. Данные синтетические; локальная оценка не предсказывает балл на скрытой судейской среде.
Что реализовано
- Группы клиентов по текущему тарифу и сегментам ARPU, потребления данных и звонков. ARPU — средний доход от абонента.
- Приоритеты тарифных гипотез по открытой истории смен тарифов и ценам.
- Пилоты через публичный
env.run_pilot(): небольшая начальная выборка, повторные измерения для уточнения перспективных гипотез. - Сравнение каналов
push,sms,digital_ads,callс учётом стоимости контакта и результатов пилотов. Доступные каналы берутся из среды. - Финальный план по нижней оценке чистого эффекта с учётом неопределённости и остатка ресурсов.
- Веб-панель: кампании, история пилотов, решения агента, метрики, результаты серии проверок и скачивание CSV.
- Проверка seed 42 и 0–9, независимый подсчёт расходов и контактов, сопоставление с официальным evaluator и повторяемость экспорта.
- Опциональное LLM-ранжирование гипотез с проверкой ответа и возвратом к локальному алгоритму при ошибке.
| Ограничение официального сценария | Лимит |
|---|---|
| Финальные кампании | 1–10 |
| Аудитория одной кампании | Не более 5 000 абонентов |
| Контакты, включая пилоты | Не более 15 000 |
| Бюджет всех контактов | 100 000 у.е. |
| Пилоты | Не более 20, по 10–200 абонентов |
| Время работы агента | Не более 600 секунд |
Источники контракта: руководство участников и описание ограничений.
Как работает решение
- Пользователь указывает ZIP или каталог официального пакета. Запуск проверяет SHA-256 файлов по манифесту и импортирует входные CSV в рабочую копию.
- Официальная мок-среда предоставляет профили клиентов, тарифы, каналы и лимиты. Пользователь запускает агента из панели или командной строки.
- Агент формирует группы и варианты переходов. История другой выборки помогает выбрать порядок экспериментов. Опциональная LLM может изменить этот порядок по агрегатам групп.
- Агент проводит пилоты, обновляет оценки и уточняет гипотезы дополнительными измерениями. Пилотные контакты входят в общий расход ресурсов.
- Агент возвращает кампании с фильтрами аудитории, тарифом и каналом. Официальный evaluator считает прирост ARPU за вычетом расходов.
- Пользователь изучает план и ход экспериментов. Для сдачи официальный
экспортёр повторно запускает агента с seed 42 и записывает
submission.csv.
История не даёт готового эффекта для текущих клиентов. Финальные решения опираются на наблюдения пилотов; скрытая модель среды агенту недоступна.
Технологии
| Компонент | Используется в проекте |
|---|---|
| Язык и среда | Python 3.11+, стандартная библиотека, venv, unittest |
| Обработка данных | numpy==2.3.5, pandas==3.0.1 — две прямые зависимости |
| Интерфейс | HTML, CSS, JavaScript; сервер на http.server |
| Оценка | Официальные environment.py, mock_environment.py, scoring_core.py, local_eval.py |
| Опциональная LLM | OpenAI Responses API через urllib.request; модель по умолчанию в коде — gpt-4.1-mini-2025-04-14 |
| Артефакты | CSV для сдачи, JSON для локальных отчётов |
Для запуска не нужны Node.js, Docker или отдельная база данных. Обучение
собственной нейросети не выполняется; predicted_arpu предоставлен в пакете.
Архитектура проекта
run.py / start.cmd
├─ .venv + requirements.txt
├─ scripts/import_participant_package.py → проверка пакета, импорт CSV
├─ preview_server.py + web/index.html → локальная панель
└─ jury_eval.py → дочерние процессы оценки и отчёт проверки
└─ local_eval.py → Agent.act(env)
├─ candidates.py → группы и тарифные гипотезы
├─ llm_advisor.py → опциональный порядок гипотез
└─ env.run_pilot() → наблюдения → финальный план
make_submission.py → Agent.act(env), seed 42 → submission.csv
| Файл или каталог | Назначение |
|---|---|
agent.py | Пилоты, обновление оценок, контроль ресурсов и финальный план |
candidates.py | Подготовка таблиц и приоритеты гипотез по публичным данным |
llm_advisor.py | Запрос к LLM, проверка перестановки гипотез, запасная логика |
jury_eval.py | Проверка решений и согласованности с официальным подсчётом |
preview_server.py, web/ | HTTP API и интерфейс для демонстрации |
scripts/ | Импорт пакета, манифест SHA-256, preflight и аудит репозитория |
analysis/profile_data.py | Профилирование CSV и отчёт о качестве данных |
tests/ | Проверки агента, контрактов, импорта, LLM и защитных проверок |
tests/support/ | Вспомогательная среда и синтетические фикстуры для тестов |
docs/ | Контракт, архитектура, отчёты и инструкции для сдачи |
Официальные скрипты, PARTICIPANT_GUIDE.md и входные CSV сохраняются без
изменений. Фикстуры команды не заменяют пакет организаторов.
Подробнее — архитектура.
Установка и запуск
1. Подготовьте проект и пакет
Установите Python 3.11 или новее. Скачайте доступную вам копию репозитория
или клонируйте её и откройте терминал в корне проекта, где находится run.py.
Официальный ZIP или распакованный каталог участников храните вне репозитория.
python --version
Если Windows открывает Microsoft Store, используйте py -3 вместо python
или свой установленный интерпретатор. На Linux/macOS используйте python3.
Git не нужен для демонстрации из ZIP. Для полного набора тестов,
preflight.py и security_audit.py нужна Git-копия проекта и Git в PATH.
2. Создайте окружение и проверьте пакет
python run.py --package "..\beeline_case_participants.zip" --check
Замените путь на местоположение своего официального ZIP или каталога. Конкретное имя файла и абсолютный путь участника не требуются. На Linux/macOS:
python3 run.py --package ../beeline_case_participants.zip --check
Команда создаёт .venv, устанавливает зависимости из requirements.txt,
проверяет целостность пакета, импортирует семь CSV и проверяет агента
с воспроизводимым экспортом. Активация окружения не нужна. Отличающиеся
локальные данные не перезаписываются: импорт завершится ошибкой проверки.
При успехе появляются artifacts/validation.json, artifacts/latest.json
и проверенный submission.csv. Повторить проверку:
python run.py --check
--check всегда отключает LLM, запускает seed 42 и 0–9, дважды вызывает
официальный экспортёр и сравнивает CSV побайтно. Нарушение проверки или
неположительный результат серии приводит к ненулевому коду возврата.
Каждый процесс оценки ограничен 600 секундами.
3. Откройте локальную панель
python run.py
Откроется Cerebrum на localhost. После первой
установки базовый режим работает без интернета, ключа и .env.
На Windows можно дважды нажать start.cmd: он выберет Python, подготовит
окружение и при необходимости спросит путь к пакету. Повторно используется
готовая .venv. Для проверки через эту обёртку: start.cmd --check.
- Если порт занят:
python run.py --port 8766. - Если браузер не нужен:
python run.py --no-browser. - Остановить сервер:
Ctrl+Cв терминале запуска. - Использовать готовое окружение с нужными версиями:
python run.py --use-current-env.
Как проверить решение жюри
Сценарий в интерфейсе
- Выполните установку и
--checkпо инструкции выше, затем запустите панель. - Оставьте seed
42и нажмите «Запустить агента». - Во вкладке «Кампании» проверьте тариф, канал, размер и фильтры аудитории.
- Во вкладках «История пилотов» и «Решения агента» изучите наблюдения, расходы, этапы экспериментов и статус LLM или локального алгоритма.
- Откройте «Соответствие ТЗ»: там показан отчёт последнего
--check. При изменении кода агента панель отмечает сохранённый отчёт устаревшим. - Повторите запуск с seed
0и сравните кампании и метрики. - Скачайте CSV. Он относится к последнему запуску панели; для сдачи создайте
официальный
submission.csvкомандой ниже с отключённой LLM.
Официальные команды и тесты
Из корня проекта в подготовленном окружении Windows PowerShell:
$env:CEREBRUM_LLM = "0"
.\.venv\Scripts\python.exe local_eval.py
.\.venv\Scripts\python.exe local_eval.py --runs 10
.\.venv\Scripts\python.exe make_submission.py
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
.\.venv\Scripts\python.exe scripts/import_participant_package.py --check
.\.venv\Scripts\python.exe scripts/preflight.py
.\.venv\Scripts\python.exe scripts/security_audit.py
.\.venv\Scripts\python.exe -m pip check
На Linux/macOS путь к интерпретатору — .venv/bin/python, а отключение LLM:
export CEREBRUM_LLM=0. При активированном окружении первая команда оценки
выглядит как python local_eval.py.
Проверяйте текст отчёта, а не только код завершения: официальный evaluator
может напечатать FAIL и вернуть код 0. Не должно быть ошибок агента или
отброшенных кампаний. Поле «Кампаний» в отчёте evaluator включает пилоты;
лимит 10 относится только к финальному плану.
Свежие результаты и PASS/FAIL по пунктам интеграционной проверки приведены в release checklist.
Файл сдачи
make_submission.py перезаписывает submission.csv в корне проекта.
Это 1–10 строк кампаний и заголовок из семи столбцов:
campaign_name,filter_arpu_segment,filter_data_segment,filter_call_segment,filter_current_tariff,target_tariff,channel
Пустой фильтр означает отсутствие соответствующего ограничения. Файл содержит
фильтры групп, а не список идентификаторов абонентов. Проверьте CSV и включите
его в сдачу вместе с agent.py, candidates.py, llm_advisor.py и
requirements.txt. Проверенный submission.csv включается в Git; входные CSV
и локальные отчёты исключены через .gitignore.
Данные и интеграции
Используется официальный синтетический пакет Beeline. Источник и SHA-256 зафиксированы в манифесте.
| Данные | Роль |
|---|---|
customer_profile.csv | Целевая аудитория: текущий тариф, сегменты, predicted_arpu |
data/change_tariff.csv | История другой выборки для приоритетов гипотез; также вход официальной мок-среды |
data/dict_tariff.csv | Тарифы и параметры для официальной мок-среды |
tariff_dictionary.csv, feature_dictionary.csv | Справочники тарифов и признаков пакета |
data/traffic.csv, data/arpu_monthly.csv | Дополнительная история; текущим алгоритмом агента напрямую не используется |
Все семь CSV проверяются при импорте. Подробнее — профиль пакета. Упоминание IBM Telco в архивном отчёте относится к отдельной проверке профилировщика: этот набор не является входом текущего агента и не входит в сдачу.
Опциональная LLM
Передайте OPENAI_API_KEY через окружение процесса и запустите:
python run.py --llm
Этот режим требует доступа к OpenAI API. Модель по умолчанию задана в
llm_advisor.py; OPENAI_MODEL позволяет указать другую совместимую модель.
При прямом запуске официальных скриптов LLM включается через CEREBRUM_LLM=1.
.env автоматически не загружается. Не записывайте ключ в код, команды
с буквальным секретом, README, CSV или логи.
В API отправляются агрегаты не более 20 групп: фильтры, размеры, средний ARPU и варианты тарифов. Строки клиентов и их ID не передаются. Ответ может только переставить допустимые гипотезы; финальные кампании выбирает агент после пилотов. На запуск выполняется максимум один запрос с ожиданием до 8 секунд. При отсутствии ключа, таймауте или неверном ответе сохраняется локальный порядок. Воспроизводимый экспорт выполняйте без LLM.
Ограничения / Known limitations
- Проверки используют мок-эффекты организаторов. Они подтверждают работу на выданном пакете, но не оптимальность плана или результат на скрытых данных.
- Оценка неопределённости эвристическая, не калиброванный доверительный интервал. Если все наблюдения плохие, агент всё равно пытается вернуть одну допустимую кампанию с минимальной экспозицией, поскольку это требует контракт.
- Преимущество LLM по прибыли не доказано; её ответы могут меняться. Базовый алгоритм и сдача не требуют LLM.
- Без официального пакета основной сценарий не запускается. Импорт принимает только файлы, совпадающие с манифестом; новый пакет организаторов потребует отдельной проверки совместимости.
- Пропуски и дубли входных данных отражены в отчёте о пакете. Исходные файлы не исправляются и не подменяются для улучшения оценки.
- Подтверждённая платформа проверки — Windows с Python 3.12.14. Команды для Linux/macOS приведены, но отдельный прогон на этих ОС не выполнен.
- Закреплены прямые зависимости; полного lock-файла транзитивных зависимостей нет.
- Жёсткий таймаут обеспечивают
jury_eval.pyи запуск из панели/--check. Сам агент проверяет время между пилотами и не может прервать зависший вызов среды. - Панель предназначена для локальной демонстрации. Интеграции с реальной CRM, отправки сообщений абонентам и многопользовательского доступа нет.
Развёрнутая версия
В репозитории не указана подтверждённая публичная deployed-версия. Демонстрация запускается локально: http://127.0.0.1:8765/. Адрес доступен на компьютере, где запущен проект; это не публичный сайт.
Документация и сдача
- Финальная интеграционная проверка.
- Чек-лист сдачи и уточнение дедлайна.
- Подробная архитектура и контракт.
- Безопасность, источники и права использования.
- Отчёт о доработке запуска и опциональных возможностей.
Отдельной лицензии кода команды нет. Права на распространение официального пакета уточняются у организаторов.
Авторы коммитов
История коммитов
- 2026-09-23 17:32Merge pull request #11 from BAITC-Hacks/chore/final-integration-checkirrumi
- 2026-09-23 17:25docs: complete Russian jury README and release checklistИмя участника
- 2026-09-23 17:22docs: clarify deadline planning and submission confirmationИмя участника
- 2026-09-23 15:50docs: profile supplied participant packageX-0mEGa-X
- 2026-09-23 16:40Merge pull request #10 from BAITC-Hacks/feat/jury-launch-and-adaptive-strategyirrumi
- 2026-09-23 16:38feat: simplify jury launch and complete optional case featuresИмя участника
- 2026-09-23 16:11Merge pull request #9 from BAITC-Hacks/docs/readme-actualizationirrumi
- 2026-09-23 16:11Merge pull request #8 from BAITC-Hacks/qa/readme-reproducibilityirrumi
Все коммиты (30)
- 2026-09-23 15:05docs: add reproducible setup and evaluation guideX-0mEGa-X
- 2026-09-23 16:03docs: align README with current implementationBaibolat Nurarys
- 2026-09-23 15:33Merge pull request #7 from BAITC-Hacks/fix/official-participant-contractirrumi
- 2026-09-23 15:31fix: align tariff agent with official participant packageИмя участника
- 2026-09-23 14:21docs: record IBM sample dataset profilingX-0mEGa-X
- 2026-09-23 15:13Merge pull request #6 from BAITC-Hacks/qa/readme-reproducibilityirrumi
- 2026-09-23 15:07Merge pull request #5 from BAITC-Hacks/security/auditirrumi
- 2026-09-23 15:06Merge pull request #4 from BAITC-Hacks/security/robustnessirrumi
- 2026-09-23 13:58docs: add reproducible dataset profileX-0mEGa-X
- 2026-09-23 14:55docs: add security audit reportBaibolat Bekarys
- 2026-09-23 14:50Merge main for local project validationИмя участника
- 2026-09-23 14:50test: add agent contract and fallback testsBaibolat Bekarys
- 2026-09-23 14:36Merge pull request #3 from BAITC-Hacks/security/preflightirrumi
- 2026-09-23 14:32Merge pull request #2 from BAITC-Hacks/qa/data-profileirrumi
- 2026-09-23 14:23Merge concurrent data profile updateИмя участника
- 2026-09-23 14:22feat: add adaptive pilot agent and synthetic case data generatorИмя участника
- 2026-09-23 14:21fix: keep data profiling separate from demo artifactsИмя участника
- 2026-09-23 14:17Merge main into data profile branchИмя участника
- 2026-09-23 14:15chore: add repository security preflightBaibolat Bekarys
- 2026-09-23 13:56docs: document local agent contract and architectureИмя участника
- 2026-09-23 13:51Merge pull request #1 from BAITC-Hacks/feat/pilot-campaign-agentirrumi
- 2026-09-23 13:42feat: add pilot-driven tariff campaign foundationИмя участника
Структура репозитория (59 файлов)
.env.example .gitattributes .gitignore PARTICIPANT_GUIDE.md PR_DESCRIPTION.md README.md SECURITY.md THIRD_PARTY.md agent.py agent_template.py analysis/profile_data.py candidates.py docs/architecture.md docs/constraints.md docs/data-profile.md docs/demo-script.md docs/final-checklist.md docs/jury-validation.md docs/participant-data-profile.md docs/participant-package-qa.md docs/release-checklist.md docs/robustness-tests.md docs/security-report.md docs/stages.md docs/synthetic_data.md docs/test-plan.md docs/test-report.md environment.py jury_eval.py llm_advisor.py local_eval.py make_submission.py mock_environment.py preview_server.py requirements.txt run.py scoring_core.py scripts/import_participant_package.py scripts/participant_package_manifest.json scripts/preflight.py scripts/security_audit.py start.cmd submission.csv tests/__init__.py tests/support/__init__.py tests/support/generate_demo_data.py tests/support/local_env.py tests/test_agent.py tests/test_agent_contract.py tests/test_candidates.py tests/test_local_env.py tests/test_official_contract.py tests/test_optional_features.py tests/test_package_import.py tests/test_preflight.py tests/test_profile_data.py tests/test_security_audit.py tests/test_security_patterns.py web/index.html
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.