AAYMA
RU
Войти

T++

Алгоритмический агент для кейса Beeline: выбирает целевые тарифы и каналы для групп абонентов при ограничениях бюджета и контактов, проводит пилоты…

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

О проекте

Команда: 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Профиль аудитории, история переходов и справочники.

Как работает стратегия

  1. Агент группирует аудиторию по текущему тарифу и сегменту ARPU. Для каждой группы оценивает варианты целевого тарифа по истории data/change_tariff.csv. Если истории для пары нет, использует консервативную оценку по разнице цен.
  2. Лучшие группы исследуются через env.run_pilot(): сначала 12 пилотов по 60 контактов в канале push, затем 6 уточняющих пилотов по 200 контактов. Оставшиеся попытки направляются на следующие группы. Пилоты тратят лимит контактов и входят в итоговый результат.
  3. Наблюдения пилотов объединяются с исторической оценкой. При выборе применяется поправка на неопределённость mean - 0.6 × std.
  4. Для каждой группы агент сравнивает ожидаемый прирост 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. Эти числа проверяют работу кода и механики скоринга. На судействе используется другая модель эффектов, поэтому локальный балл не является прогнозом итогового результата.

Практическое применение и развитие

Подход подходит для ограниченного пилотирования предложений: агент выделяет группы абонентов, измеряет отклик и распределяет бюджет по ожидаемой чистой выгоде. Для применения на реальных кампаниях понадобятся проверка качества данных, контроль доступности каналов и согласий на коммуникации, а также оценка эффекта на контрольных группах. Следующий шаг в развитии стратегии — учитывать пересечение контактов между пилотами и финальными кампаниями при планировании охвата и сравнивать варианты целевых тарифов после первых пилотов, а не фиксировать один вариант для группы заранее.

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

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

Ronine01kz 21tamik-tech 8tautanov05-cmyk 1

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

  • 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 комментариев

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

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