AAYMA
RU
Войти

Byteford United — агент управления тарифными кампаниями

Автономный Python-агент (Agent.act(env)) выбирает портфель до 10 кампаний «аудитория → новый тариф → канал» в пределах бюджета и лимита контактов…

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

О проекте

Команда: Byteford United
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Доведённый продукт

Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)

Суть

Автономный Python-агент (Agent.act(env)) выбирает портфель до 10 кампаний «аудитория → новый тариф → канал» в пределах бюджета и лимита контактов, чтобы получить максимальный чистый прирост ARPU. LLM не используется.

Как устроено

Из истории смен тарифов агент строит сглаженные priors с fallback для переходов без истории. Затем через env.run_pilot() запускает до 10 первичных SMS-пилотов по 80 клиентов и до 10 адаптивных уточняющих. После каждого пилота оценка эффекта обновляется с учётом размера пилота и эффективности канала. Финальные кампании отбираются по нижней доверительной границе эффекта, каждой нужно не меньше двух наблюдений. Портфель по бюджету, контактам и числу кампаний подбирается beam-search, канал выбирается из push, sms и digital_ads.

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

  • сглаженные исторические priors
  • последовательное вероятностное обновление
  • нижняя доверительная граница (LCB)
  • адаптивные пилоты (explore/exploit)
  • beam-search портфеля
  • stress-бенчмарк со сдвигом эффектов
  • A/B-сравнение с priors и без них

Особенности

Агента проверяют stress-бенчмарком со сдвинутыми скрытыми эффектами, чтобы он не подстраивался под благоприятную mock-среду. Массовый запуск разрешён только после двух наблюдений по гипотезе. Финальные кампании отбираются консервативно, по LCB. Есть HTML-отчёт и построчный журнал контактов, а NVIDIA Brev workflow сохраняет evidence проверки.

Стек

Python · pandas · NumPy · unittest · NVIDIA Brev


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

README

README.md

Byteford United — агент управления тарифными кампаниями

Решение хакатонного кейса Beeline по выбору маркетинговых кампаний для смены тарифа в условиях ограниченного бюджета и неизвестного эффекта на текущей аудитории.

Все данные, тарифы, суммы и эффекты в проекте синтетические и предоставлены организаторами для учебной задачи. По ним нельзя делать выводы о реальном бизнесе оператора.

Краткое описание

Массовое предложение сменить тариф может принести дополнительный ARPU, не дать эффекта или привести к downsell. При этом каждый SMS, рекламный контакт или звонок расходует бюджет. Аналитику нужно выбрать небольшой набор кампаний среди множества сочетаний «аудитория → новый тариф → канал», не зная заранее их реального эффекта.

Наше решение — автономный Python-агент, который:

  1. превращает исторические переходы в слабые первоначальные гипотезы;
  2. проверяет гипотезы небольшими пилотами на текущей аудитории;
  3. учитывает средний эффект и статистическую неопределённость;
  4. возвращает портфель до 10 кампаний в пределах бюджета и лимита контактов.

Основная целевая метрика — чистый результат:

net = прирост ARPU − стоимость пилотных и финальных контактов

Проект предназначен для аналитиков и команд CRM-маркетинга, которым нужно автоматизировать разведку гипотез и распределение ресурсов между кампаниями.

Что реализовано

  • обязательный класс Agent с методом act(env);
  • генерация возможных переходов между тарифами для каждой пары «текущий тариф + ARPU-сегмент»;
  • сглаженные исторические priors и fallback для переходов, которых нет в истории;
  • до 10 первичных SMS-пилотов по 80 клиентов;
  • до 10 адаптивных подтверждающих пилотов по наиболее ценным гипотезам;
  • обновление оценки эффекта с учётом размера пилота и эффективности канала;
  • консервативный отбор по нижней доверительной границе эффекта;
  • выбор между push, sms и digital_ads для финальных кампаний;
  • совместная оптимизация портфеля по чистому эффекту, бюджету, контактам и лимиту числа кампаний;
  • безопасный fallback при недоступности или ошибке исторических priors;
  • unit- и smoke-тесты контрактов, лимитов и воспроизводимости;
  • локальная end-to-end оценка, проверка устойчивости на разных seed и A/B-сравнение стратегии с priors и без них;
  • stress-бенчмарк со сдвинутыми эффектами, чтобы не оптимизироваться только под исторически благоприятную mock-модель;
  • наглядный HTML-отчёт и построчный CSV-журнал контактов для ручной проверки;
  • воспроизводимая генерация submission.csv;
  • опциональный NVIDIA Brev workflow, который разворачивает окружение и сохраняет evidence проверки без секретов.

Основная стратегия не использует LLM и не зависит от внешнего API: числовое решение полностью воспроизводится локально.

Как работает решение

История смен тарифов + справочник тарифов + текущая аудитория
                              │
                              ▼
              Сглаженные priors и fallback-гипотезы
                              │
                              ▼
               Первичная разведка разными пилотами
                              │
                              ▼
           Обновление среднего эффекта и неопределённости
                              │
                              ▼
                 Адаптивные уточняющие пилоты
                              │
                              ▼
        Консервативная оценка тарифов и каналов коммуникации
                              │
                              ▼
         Портфель до 10 кампаний под оставшиеся ограничения

Проверяющая среда создаёт Agent и вызывает Agent.act(env). Через env агент получает профиль аудитории, тарифы, каналы и остатки ресурсов. Узнавать эффект на текущей аудитории разрешено только через публичный env.run_pilot().

Первичные пилоты обеспечивают широкую разведку: агент проверяет как переходы с историей, так и несколько неизвестных сочетаний. Затем результаты пилотов нормализуются на эффективность канала и объединяются с первоначальной оценкой. Больший пилот имеет больший статистический вес. Штатный массовый финальный запуск разрешается только после двух наблюдений по гипотезе: stress-тесты показали, что это устойчивее единичного удачного пилота при сдвиге скрытых эффектов. Если подтверждённых прибыльных вариантов совсем нет, обязательный аварийный fallback возвращает одну синтаксически корректную бесплатную push-кампанию.

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

{
    "campaign_name": "main_1_tariff_4_mid_tariff_8_sms",
    "filter_arpu_segment": "MID",
    "filter_current_tariff": "tariff_4",
    "target_tariff": "tariff_8",
    "channel": "sms",
}

Технологии

КатегорияИспользуется
ЯзыкPython
Работа с таблицамиpandas
Численные расчётыNumPy
Тестированиестандартный модуль unittest
Формат данныхCSV, pandas DataFrame
Модель принятия решенийсглаженные исторические оценки, последовательное вероятностное обновление, консервативная оценка и beam-search портфеля
AI/LLMне используется
Внешние APIне используются агентом
Облачная средаNVIDIA Brev — опционально, только для воспроизводимого запуска и evidence

Текущая версия проверена в локальном окружении Python 3.14. Диапазоны версий зависимостей зафиксированы в requirements.txt.

Архитектура проекта

КомпонентНазначение
agent.pyМинимальная обязательная точка входа Agent.act(env).
priors.pyОчистка истории, сглаживание, fallback и первичный рейтинг гипотез.
strategy.pyПолитика пилотов, обновление оценок, выбор каналов и портфеля.
mock_environment.pyЛокальная имитация среды и шумных пилотов.
scoring_core.pyПроверка кампаний, дедупликация клиентов и расчёт результата.
local_eval.pyОдин полный прогон или серия прогонов на разных seed.
benchmark.pyСравнение полного агента и fallback без priors на одинаковых seed.
stress_benchmark.pyПроверка устойчивости при расхождении истории и скрытых эффектов.
tuning_benchmark.pyЧестное A/B-сравнение конфигураций на одинаковых stress-сценариях.
visual_report.pyHTML-дашборд и CSV-расшифровка одного mock-прогона.
make_submission.pyГенерация воспроизводимого submission.csv.
tests/Unit- и smoke-тесты стратегии и priors.
scripts/brev_setup.shРазвёртывание и полный проверочный прогон на NVIDIA Brev.
scripts/brev_verify.pyСбор версий, GPU, результатов тестов и SHA-256 submission в evidence-отчёт.

agent.py зависит только от стабильного интерфейса CampaignStrategy. strategy.py получает кандидатов через контракт priors.build_candidates(...). Поэтому модель подготовки гипотез можно заменить, не меняя внешний интерфейс агента и проверяющей среды.

Подробное описание алгоритма и пути масштабирования находится в PROJECT_GUIDE.md.

Установка и запуск

Windows PowerShell или CMD

git clone https://github.com/BAITC-Hacks/hack-033bf26b-byteford-united.git
cd hack-033bf26b-byteford-united
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -X utf8 local_eval.py

Точка перед именем .venv обязательна.

Linux или macOS

git clone https://github.com/BAITC-Hacks/hack-033bf26b-byteford-united.git
cd hack-033bf26b-byteford-united
python3 -m venv .venv
./.venv/bin/python -m pip install --upgrade pip
./.venv/bin/python -m pip install -r requirements.txt
./.venv/bin/python local_eval.py

NVIDIA Brev

На подготовленной Brev VM из корня репозитория:

bash scripts/brev_setup.sh

Скрипт создаёт .venv, устанавливает зависимости, запускает unit-тесты, local_eval, benchmark и генерацию submission. Отчёт и логи сохраняются в .brev-evidence/, который исключён из Git. GPU фиксируется как evidence окружения, но вычисления агента остаются CPU-bound и от GPU не зависят. Подробная инструкция находится в BREV.md.

Как проверить решение

1. Автоматические тесты

.\.venv\Scripts\python.exe -m unittest discover -s tests -v

Результат OK подтверждает, что агент импортируется, возвращает корректные кампании, соблюдает доступные ресурсы, работает без внешних priors и воспроизводимо строит таблицу гипотез. Это проверка корректности кода, а не гарантия прибыли на скрытой выборке.

2. Один end-to-end прогон

.\.venv\Scripts\python.exe -X utf8 local_eval.py

Жюри может проверить:

  • Статус: PASS;
  • наличие проведённых пилотов;
  • неотрицательные остатки бюджета и контактов;
  • отсутствие отброшенных кампаний;
  • итоговый net_arpu_gain на мок-среде.

Для более наглядной проверки:

.\.venv\Scripts\python.exe -X utf8 visual_report.py
start .agent-report\report.html

HTML показывает использование бюджета и контактов, экономический результат, пилоты, финальные кампании и пример охваченных абонентов. Рядом создаются:

  • contact_ledger.csv — одна строка на каждый фактический контакт;
  • subscriber_summary.csv — все 23 441 абонента и их итоговый вклад;
  • campaign_summary.csv — сводка пилотов и финальных кампаний.

3. Устойчивость к шуму пилотов

.\.venv\Scripts\python.exe -X utf8 local_eval.py --runs 10

Команда показывает минимум, медиану, максимум и число положительных запусков на разных seed. Для более строгой проверки можно использовать --runs 50.

4. Вклад исторических priors

.\.venv\Scripts\python.exe -X utf8 benchmark.py --runs 10

Benchmark запускает на одинаковых seed полный агент и вариант только с тарифным fallback. Он проверяет интеграцию priors.py, но не предсказывает будущий судейский балл: эффекты скрытой среды будут другими.

5. Устойчивость к сдвигу эффектов

.\.venv\Scripts\python.exe -X utf8 stress_benchmark.py --runs 10

Команда оставляет агенту исходную историю, но изменяет скрытую mock impact-модель: добавляет шум эффектов, сдвигает конверсии и меняет знак части переходов. Для сравнения стратегий важны p10_net, средний результат худших 20% запусков и минимум. Сценарии являются стресс-тестами, а не прогнозом судейских эффектов.

6. Финальный артефакт

.\.venv\Scripts\python.exe -X utf8 make_submission.py

Команда запускает настоящего агента с фиксированным seed и пересоздаёт submission.csv. Подробная инструкция и интерпретация метрик находятся в TESTING.md.

Данные и интеграции

ИсточникИспользование
customer_profile.csvТекущая аудитория, тарифы, сегменты и predicted_arpu; на судействе передаётся через env.customer_profile.
data/change_tariff.csvИсторические смены тарифов для построения слабых priors.
data/dict_tariff.csvПараметры тарифов и fallback для неизвестных переходов; на судействе справочник доступен через env.tariffs.
data/traffic.csvДанные потребления из официального набора; напрямую текущей стратегией не читаются.
data/arpu_monthly.csvМесячная история ARPU из официального набора; напрямую текущей стратегией не читается.
tariff_dictionary.csv, feature_dictionary.csvОписания тарифов и признаков.
env.run_pilot()Единственная интеграция для получения нового наблюдения об эффекте на целевой аудитории.

Сеть, облачные сервисы, базы данных и сторонние API во время работы агента не используются. API-ключи не требуются и не хранятся в репозитории.

Ограничения текущей версии

  • Результаты local_eval.py относятся только к синтетической мок-среде и не гарантируют такой же эффект на скрытом судействе.
  • Финальная сегментация использует текущий тариф и ARPU-сегмент. Признаки потребления данных и звонков пока не используются как отдельные фильтры.
  • Политика рассчитана на четыре канала и их названия из условий хакатона.
  • Размеры пилотов, квоты и доверительный коэффициент заданы константами в strategy.py, а не внешней конфигурацией.
  • Состояние пилотов не сохраняется между отдельными запусками процесса.
  • Beam-search является ограниченным приближённым поиском, а не точным математическим оптимизатором.
  • Нет веб-интерфейса: по условиям кейса результатом является Python-агент и список кампаний. HTML-отчёт является локальной диагностикой, а не отдельным приложением.
  • Проект предназначен только для синтетических данных хакатона и не является готовой production-системой оператора.

План развития — конфигурация стратегии, универсальное подключение каналов, хранилище экспериментов, temporal backtesting, causal/uplift-модель, контейнеризация, CI и мониторинг — подробно описан в PROJECT_GUIDE.md.

Безопасность и соответствие правилам

  • Агент использует только выданные данные и публичный интерфейс env.
  • Доступ к скрытому состоянию через closure, gc, inspect и подобные обходы не используется.
  • .env, ключи и credential-файлы исключены через .gitignore.
  • Основная логика не требует LLM или секретов.

Deployed-версия

Публичная deployed-версия отсутствует. Решение запускается локально или внутри проверяющей Python-среды организаторов; отдельный веб-сервис условиями кейса не требуется.

Дополнительная документация

  • PROJECT_GUIDE.md — полный разбор алгоритма, архитектуры, демонстрации и масштабирования.
  • TESTING.md — пошаговая проверка и объяснение метрик.
  • BREV.md — воспроизводимый запуск и evidence на NVIDIA Brev.
  • PROGRESS.md — журнал этапов и локальных baseline-результатов.
  • PARTICIPANT_GUIDE.md — исходное руководство организаторов.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
22
Авторы
3
Файлы
41
Ветки
1

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

dakota_xaoc 10enzosha 6itsAlikon 6

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

  • 2026-09-23 17:06Add files via uploadenzosha
  • 2026-09-23 16:36feat: harden exploration against effect shiftsdakota_xaoc
  • 2026-09-23 15:51Add files via uploadenzosha
  • 2026-09-23 15:48Add files via uploadenzosha
  • 2026-09-23 15:47feat: add visual campaign evaluation reportdakota_xaoc
  • 2026-09-23 15:30docs: rewrite README for hackathon jurydakota_xaoc
  • 2026-09-23 15:17Add files via uploadenzosha
  • 2026-09-23 15:16docs: add complete agent and scalability guidedakota_xaoc
Все коммиты (22)
  • 2026-09-23 15:14Add files via uploadenzosha
  • 2026-09-23 14:59chore: add reproducible Python environment setupdakota_xaoc
  • 2026-09-23 14:39Add files via uploadenzosha
  • 2026-09-23 14:33feat: add reproducible agent benchmark workflowdakota_xaoc
  • 2026-09-23 14:29feat: diversify pilots across prior sourcesdakota_xaoc
  • 2026-09-23 13:51docs: record adaptive agent baseline resultsdakota_xaoc
  • 2026-09-23 13:50feat: add adaptive pilot campaign agentdakota_xaoc
  • 2026-09-23 16:39chore: hourly progress checkpointitsAlikon
  • 2026-09-23 13:39chore: import hackathon starter kit and protect secretsdakota_xaoc
  • 2026-09-23 15:55chore: strengthen Brev evidence integrityitsAlikon
  • 2026-09-23 15:23feat: add reproducible NVIDIA Brev workflowitsAlikon
  • 2026-09-23 15:09chore: hourly progress checkpointitsAlikon
  • 2026-09-23 14:14feat: add historical priors and campaign candidatesitsAlikon
  • 2026-09-23 13:45chore: add initial progress logitsAlikon
Структура репозитория (41 файлов)
.gitattributes
.gitignore
BREV.md
PARTICIPANT_GUIDE.md
PARTICIPANT_GUIDE.pdf
PROGRESS.md
PROJECT_GUIDE.md
README.md
TESTING.md
agent.py
agent_template.py
benchmark.py
customer_profile.csv
data/arpu_monthly.csv
data/change_tariff.csv
data/dict_tariff.csv
data/traffic.csv
document/Тектовый блокнот.txt
environment.py
feature_dictionary.csv
hack-033bf26b-byteford-united/Тектовый блокнот.txt
hack-033bf26b-byteford-united2/Тектовый блокнот.txt
local_eval.py
make_submission.py
mock_environment.py
priors.py
requirements.txt
scoring_core.py
scripts/brev_setup.sh
scripts/brev_verify.py
strategy.py
stress_benchmark.py
submission.csv
tariff_dictionary.csv
tests/test_agent_smoke.py
tests/test_priors.py
tests/test_stress_benchmark.py
tests/test_visual_report.py
text/Тектовый блокнот.txt
tuning_benchmark.py
visual_report.py

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

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

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