О проекте
Команда: T++
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Рабочий MVP
Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)
Суть
Алгоритмический агент для кейса Beeline: выбирает целевые тарифы и каналы для групп абонентов при ограничениях бюджета и контактов, проводит пилоты и формирует до 10 финальных кампаний с максимальным чистым приростом ARPU.
Как устроено
Аудитория группируется по текущему тарифу и ARPU-сегменту, эффект перехода оценивается по истории change_tariff.csv (без истории используется консервативная оценка по разнице цен). Через env.run_pilot() проводятся 12 пилотов по 60 контактов (push) и 6 уточняющих по 200. Наблюдения объединяются с историей, выбор идёт по нижней оценке mean − 0.6·std. Кампании ранжируются по ожидаемому приросту ARPU за вычетом стоимости канала в пределах 15 000 контактов и 100 000 затрат. Есть локальный веб-дашборд для прогонов и загрузки своих CSV. LLM нет.
Ключевые решения
- pilot-based exploration (bandit-like)
- uncertainty penalty mean−0.6·std
- greedy budget allocation
- mock environment simulation
Метрики
30 прогонов на мок-модели: все положительные, медиана чистого прироста 1 822 343, мин 1 037 367, макс 1 937 148
Особенности
Explore/exploit-стратегия: пилоты уточняют оценку, а выбор идёт по консервативной нижней границе. В репозиторий закоммичены .pyc и файлы лежат плоско в корне, хотя README ссылается на data/ и web/.
Стек
Python · pandas · NumPy · HTML/JS dashboard
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-59902d1f-t.
README
README.mdАгент для тарифных маркетинговых кампаний
Проект выбирает тарифные предложения и каналы связи для абонентов при ограниченном бюджете и лимите контактов. Агент получает профиль аудитории и историю смен тарифов, проводит небольшие пилотные кампании, обновляет оценку эффекта и возвращает до 10 финальных кампаний.
Это алгоритмический агент с последовательным выбором действий по результатам пилотов. В проекте нет LLM и внешнего AI API.
Состав проекта
| Файл | Назначение |
|---|---|
agent.py | Стратегия: исторический приоритет, пилоты, оценка эффекта и выбор кампаний. Это файл агента для сдачи. |
environment.py | Интерфейс среды и проведение пилотов с ограничениями и шумом наблюдений. |
mock_environment.py | Локальная модель эффектов на основе выданной истории. |
scoring_core.py | Применение фильтров, лимитов, дедупликации и расчёт чистого результата. |
local_eval.py | Один прогон или серия прогонов на локальной модели. |
make_submission.py | Формирование воспроизводимого submission.csv с seed 42. |
dashboard.py, web/ | Локальный веб-дашборд для загрузки данных, запуска агента и просмотра результатов. |
customer_profile.csv, data/*.csv | Профиль аудитории, история переходов и справочники. |
Как работает стратегия
- Агент группирует аудиторию по текущему тарифу и сегменту ARPU. Для каждой группы оценивает варианты целевого тарифа по истории
data/change_tariff.csv. Если истории для пары нет, использует консервативную оценку по разнице цен. - Лучшие группы исследуются через
env.run_pilot(): сначала 12 пилотов по 60 контактов в каналеpush, затем 6 уточняющих пилотов по 200 контактов. Оставшиеся попытки направляются на следующие группы. Пилоты тратят лимит контактов и входят в итоговый результат. - Наблюдения пилотов объединяются с исторической оценкой. При выборе применяется поправка на неопределённость
mean - 0.6 × std. - Для каждой группы агент сравнивает ожидаемый прирост ARPU за вычетом стоимости контакта по доступным каналам. Кампании упорядочиваются по ожидаемому чистому эффекту с учётом бюджета и лимита охвата.
Финальные кампании задаются фильтрами filter_current_tariff и filter_arpu_segment, целевым тарифом target_tariff и каналом channel. Пилотные кампании учитываются отдельно и не входят в лимит 10 финальных кампаний.
Запуск и проверка
Запускайте команды из корня проекта. Нужны Python и зависимости из requirements.txt (локально проверено с Python 3.14.4, NumPy 2.5.3 и pandas 3.0.6).
python -m pip install -r requirements.txt
python local_eval.py
python local_eval.py --runs 30
python make_submission.py
python dashboard.py
После запуска dashboard.py откройте http://127.0.0.1:8000. Страница автоматически выполняет один прогон на данных проекта. Через блок «Входные данные» можно загрузить собственные CSV с теми же колонками, задать seed и число прогонов от 1 до 30. Исходные файлы проекта при этом не изменяются. В интерфейсе доступны метрики, график по прогонам, пилоты и кампании, а также скачивание финальной стратегии в CSV. Для пользовательских данных локальная мок-модель строится из загруженной истории переходов. Сервер работает локально и не обращается к внешним сервисам.
local_eval.py печатает чистый прирост ARPU, затраты, число пилотов, кампаний и контактов. --runs 30 использует seed от 0 до 29 и показывает устойчивость результата. make_submission.py записывает submission.csv с фиксированным seed 42. Для сдачи используйте agent.py и созданный submission.csv; если площадка требует явного списка зависимостей, добавьте requirements.txt.
Для проверки формата и воспроизводимости файла:
python -c "import pandas as pd; from scoring_core import validate_strategy; from make_submission import build_submission; from agent import Agent; saved=pd.read_csv('submission.csv'); validate_strategy(saved, pd.read_csv('data/dict_tariff.csv')); pd.testing.assert_frame_equal(saved.fillna(''), build_submission(Agent()).fillna(''), check_dtype=False); print('OK')"
Минимальные колонки для загрузки: профиль — ID_NUMBER, current_tariff, arpu_segment, data_segment, call_segment, predicted_arpu; история — ID_NUMBER, AVG_ARPU_PREV_3M, AVG_ARPU_NEXT_3M, tariff_plan_code_from, tariff_plan_code_to; справочник — tariff_plan_code, price_tariff. В профиле ID_NUMBER должен быть уникальным. Отсутствующие необязательные файлы берутся из проекта.
Проверка интеграции дашборда со скорингом:
python -m unittest discover -s tests -v
Лимиты и смысл результата
Среда разрешает до 20 пилотов размером 10–200 контактов; финальная стратегия содержит до 10 кампаний. Общий лимит составляет 15 000 контактов и 100 000 условных единиц затрат. Одна кампания охватывает не более 5 000 абонентов. Повторные контакты расходуют охват и бюджет, а эффект одного абонента учитывается один раз, по лучшей кампании. Основная метрика: суммарный прирост ARPU минус затраты на коммуникацию.
На локальной мок-модели серия из 30 прогонов дала положительный результат в 30 случаях: медиана чистого прироста 1 822 343, минимум 1 037 367, максимум 1 937 148. Эти числа проверяют работу кода и механики скоринга. На судействе используется другая модель эффектов, поэтому локальный балл не является прогнозом итогового результата.
Практическое применение и развитие
Подход подходит для ограниченного пилотирования предложений: агент выделяет группы абонентов, измеряет отклик и распределяет бюджет по ожидаемой чистой выгоде. Для применения на реальных кампаниях понадобятся проверка качества данных, контроль доступности каналов и согласий на коммуникации, а также оценка эффекта на контрольных группах. Следующий шаг в развитии стратегии — учитывать пересечение контактов между пилотами и финальными кампаниями при планировании охвата и сравнивать варианты целевых тарифов после первых пилотов, а не фиксировать один вариант для группы заранее.
Авторы коммитов
История коммитов
- 2026-09-23 17:31Add files via uploadtamik-tech
- 2026-09-23 17:30Add files via uploadtamik-tech
- 2026-09-23 17:28Add files via uploadtamik-tech
- 2026-09-23 17:27Add files via uploadtamik-tech
- 2026-09-23 17:25Add files via uploadtamik-tech
- 2026-09-23 16:55Delete README.mdRonine01kz
- 2026-09-23 16:51Delete T++ — копия.zipRonine01kz
- 2026-09-23 16:50Add files via uploadRonine01kz
Все коммиты (29)
- 2026-09-23 16:49Delete test_agent.pyRonine01kz
- 2026-09-23 16:49Delete tariff_dictionary.csvRonine01kz
- 2026-09-23 16:49Delete scoring_core.pyRonine01kz
- 2026-09-23 16:49Delete requirements.txtRonine01kz
- 2026-09-23 16:49Delete mock_environment.pyRonine01kz
- 2026-09-23 16:49Delete make_submission.pyRonine01kz
- 2026-09-23 16:49Delete local_eval.pyRonine01kz
- 2026-09-23 16:48Delete feature_dictionary.csvRonine01kz
- 2026-09-23 16:48Delete environment.pyRonine01kz
- 2026-09-23 16:48Delete customer_profile.csvRonine01kz
- 2026-09-23 16:48Delete agent_template.pyRonine01kz
- 2026-09-23 16:48Delete agent.pyRonine01kz
- 2026-09-23 16:47redmiRonine01kz
- 2026-09-23 16:47Delete TECHNICAL_NOTES.mdRonine01kz
- 2026-09-23 16:46Delete PARTICIPANT_GUIDE.pdfRonine01kz
- 2026-09-23 16:46Delete PARTICIPANT_GUIDE.mdRonine01kz
- 2026-09-23 16:45Delete HackAlem AI_ Beeline Tariff Marketing Campaigns Case.docxRonine01kz
- 2026-09-23 16:38Delete CUSTOMIZATION_GUIDE.mdRonine01kz
- 2026-09-23 15:50Add files via uploadtamik-tech
- 2026-09-23 14:39Первая проверечнаяtautanov05-cmyk
- 2026-09-23 14:13Add files via uploadtamik-tech
Структура репозитория (27 файлов)
README.md agent.cpython-314.pyc agent.py app.js arpu_monthly.csv change_tariff.csv customer_profile.csv dashboard.cpython-314.pyc dashboard.py dict_tariff.csv environment.cpython-314.pyc environment.py index.html local_eval.cpython-314.pyc local_eval.py make_submission.cpython-314.pyc make_submission.py mock_environment.cpython-314.pyc mock_environment.py requirements.txt scoring_core.cpython-314.pyc scoring_core.py styles.css submission.csv test_dashboard.cpython-314.pyc test_dashboard.py traffic.csv
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.