Вместо предисловия
Тинькофф, как известно, разрабатывает множество сервисов на рынке финансовых услуг. У нас есть много бизнес линий, в которых традиционно трудятся и решают свои повседневные задачи аналитики, разработчики, технологи, менеджеры и т.д.
Все мы ежедневно генерим идеи, анализируем, разрабатываем и делаем все, чтобы делать лучший продукт на рынке.
Меня зовут Александр, я backend программист в отделе внутренней разработки. Это значит, что нашими бизнес-заказчиками являются различные подразделения банка. Мы помогаем запускать новые бизнес линии, автоматизируем рабочий процесс и пытаемся сэкономить банку денег там, где это возможно (например отказаться от покупки лицензии на какой нибудь дорогой софт). Одним из наших бизнес-заказчиков является отдел лояльности клиентов, называемый Tinkoff Target, правильнее даже назвать это бизнес линией. Рабочий процесс у нас весьма стандартный, менеджеры придумывают бизнес фичи, технологи их формализуют и ставят задачи, аналитики анализируют данные, а разработчики уже решают поставленные перед ними задачи. В жизни все конечно же немного сложнее.
Здесь наверное стоит рассказать как устроена наша программа лояльности, чтобы понимать, какие задачи перед нами стоят.
Программа лояльности Тинькофф или как мы раздаем людям кэшбэк
Почти все современные банки выдают кэшбэк в той или иной форме, будь то рубли, мили или другие условные попугаи (баллы, которые ты можешь потратить на что то конкретное). Наш банк не исключение, мы выдаем стандартный кэшбэк в 1% на все и 5% на 3 выбранные категории (Транспорт, кино, Сувениры и т.д.). Много такого кэшбэка со своего кармана не выдать (а очень хочется), и поэтому у нас есть спецпредложения от партнеров банка, которые тоже хотят выдавать кэшбэк. Так вот, в рамках бизнес-линии программ лояльности мы пытаемся найти и убедить различные компании выдавать нашим клиентам кэшбэк на взаимовыгодных условиях. Эти компании и являются нашими партнерами.
Как мы это делаем? Представим что есть на рынке условная компания “Яблоко”, которая делает своим клиентам хорошо, предлагая сервис или готовый продукт за скромное вознаграждение. Наиболее верный способ привлечь партнера это помочь ему продать свой товар или услугу. Здесь задача стоит в привлечении аудитории для партнера, например клиентов, которые закупаются у конкурентов или клиентов, которые и вовсе не знают о существовании “Яблока”. А еще можно для Яблока подобрать подходящих по профилю клиентов, которые очень хотят “Яблоко”, просто еще не знают об этом, это я про искусственный интеллект, машин лернинг, ну вы поняли…
Так вот, задача подбора такой целевой аудитории лежит на плечах аналитиков, а их у нас мало (примерно 2) а партнеров много (более 1000). А ведь у аналитиков помимо этого еще много всякой интересной работы, а с ростом количества партнеров, подбор правильной аудитории превращается в рутину. Такую рутину необходимо автоматизировать и превращать в один клик по кнопке. К тому же многоступенчатый процесс выполнения подобных задач влечет за собой ошибки, обусловленные человеческим фактором.
Далее я расскажу как у нас получилось избавится от подобной рутинной работы.
Как мы строим аналитику
В Тинькофф большинство аналитиков (и не только) в своих повседневных задачах используют Apache Zeppelin. Мы довольно давно взяли этот инструмент на вооружение и активно его развиваем (даже комитим в опенсорс). Здесь для всех сотрудников открыт доступ к глобальному хранилищу данных и отчетности, т.е. ко всем аналитическим ресурсам Tinkoff с возможностью использования удобного аналитического языка.
Zeppelin написан на Java, и включает в себя множество интерпретаторов современных языков и технологий, среди которых Python, Hive, Spark, Groovy, R и многие другие. Написанные скрипты хранятся в ноутбуках, которые состоят из параграфов, внешне UI рабочей среды очень напоминает Jupyter. А основной экран приложения выглядит следующим образом:
У каждой бизнес-линии здесь есть своя рабочая директория с разграничением прав чтения и редактирования. О всех возможностях и преимуществах Zeppelin можно прочитать в интернете. Огромным плюсом для нас (для разработчиков) является наличие очень удобного и интерактивного API. С API жизнь становится проще.
Через API с этим инструментом можно делать все что угодно, минуя web UI. Так и пришла идея интегрировать результаты работы аналитиков в наш проект.
Кратко о нашем проекте
Backend у нас написан на Java, Frontend на Angular 5 (так как проект у нас не молодой часть UI написана на Vaadin от которого мы мало помалу избавляемся). Большая часть проекта это вэб приложение для работы менеджеров, где они ведут взаимоотношения с партнерами, заводят новые спецпредложения, следят за выполнением своих KPI и т.д. Также у нас есть личный кабинет партнера, где любой партнер банка может наблюдать статистику своих запущенных спецпредложений (начисления, активации и тд), скачивать и подписывать договора, счета, документировать взаимоотношения в общем. Также мы отдаем данные в мобильный банк и вэб портал в раздел Бонусы через SOAP вэб сервис. Еще есть лэндинг, написанный на React, где любой желающий может оставить заявку на участие в программе лояльности. У нас реализованы различные механики начисления кэшбэка и спецрассрочки, интеграции с различными банковскими сервисами и много всего интересного.
Интеграция с Apache Zeppelin
Традиционно, для привлечения новых партнеров менеджеры отправляли аналитикам письмо с набором хотелок партнера для генерации целевой аудитории. Аналитики в свою очередь использовали ранее написанные скрипты на зоопарке языков и магический копипаст. Очевидно, что при должной формализации требований можно написать универсальный скрипт, что мы и сделали. А для ввода формализованных данных написали удобный UI. Осталось только реализовать работу с Apache Zeppelin в нашем вэб приложении. Схема работы такой интеграции следующая:
Как все работает сейчас? Менеджер в ходе общения с партнером создает в приложении задание, заполняя на форме параметры для формирования целевой аудитории. Пример таких параметров следующий:
- категории BCC и/или MCC коды в которых клиент транзачит или транзачил в определенный период времени на определенные суммы с определенным средним чеком;
- компании конкуренты у которых клиент транзачит или транзачил в определенный период времени;
- и многое другое.
Таких параметров очень много и все они формализованы на UI. После ввода исходных параметров менеджер запускает операцию генерации и алгоритм начинает свою работу:
- Так как все наши скрипты написаны в одном ноутбуке и мы не хотим его изменить, мы клонируем его в отдельную директорию. Zeppelin в ответ на наш запрос возвращает нам ID клона, по которому мы будем обращаться к новому ноутбуку. Клонирование рабочих скриптов также удобно при администрировании, т.к. мы всегда можем заглянуть в скрипты, которые были выполнены для конкретного задания и найти проблему.
- Начиная с версии Zeppelin API 0.8 [ссылка] после создания нового ноутбука необходимо проставить CRUD доступ к нему для последующего администрирования.
- В одном из первых параграфов рабочего ноутбука, как правило объявлены переменные и заданы их начальные значения по умолчанию, которые необходимо заменить. На этом этапе мы вставляем свой параграф в ноутбук (с инициализацией переменных и формализованными данными), который формируем перед отправкой.
- Далее, легким запросом метода POST мы запускаем наш ноутбук на выполнение. Вернее сказать, мы запускаем наши параграфы поочередно, с целью мониторинга процесса выполнения всех скриптов и отображения статуса генерации целевой аудитории в приложении.
- По окончанию операции менеджеру приходит уведомление (на случай, если он не отслеживал статус выполнения). Результатом выполнения скриптов является сгенерированный CSV файл с аудиторией, сохраненный в общей директории. При запуске спецпредложения мы можем сгенерировать несколько аудиторий и проставить им разный тип при добавлении к офферу. А для аудиторий с разным типом мы можем гибко задавать условия и размеры начисления кэшбэка.
Немного грубой аналитики
По грубым подсчетам, автоматизация сбора целевой аудитории, привела к высвобождению более 30% рабочего времени аналитиков (не считая расход времени на коммуникацию аналитиков с менеджерами). С июня 2018 по январь 2019 года число выполненных заданий на генерацию превышает 400. По словам менеджеров на коммуникацию и получения требуемого результата они тратили от 0.5 до 4 часов, взяв среднее время для формирования целевой аудитории ~2 часа, было сэкономлено более 800 человеко-часов (более 100 рабочих дней).
В заключение
Самое важное чего удалось добиться интеграцией с Zeppelin, это минимизировать человеческий фактор на всех этапах процесса генерации целевой аудитории. Ошибки в формировании подходящей партнеру аудитории, как правило, выявляются после проведения начислений. Выдавая кэшбэк всем подряд, после запуска спецпредложения, очень сложно минимизировать понесенные финансовые издержки, а за допущенные ошибки приходится дорого платить.
Еще одним большим плюсом является смещение ответственности в сторону первоисточника процесса, т.к. bottleneck человеческого фактора теперь находится в зоне формирования исходных данных менеджером. А это значит, что тот кто создает задание на генерацию и заполняет исходные параметры, делает это с повышенным вниманием.
В настоящее время мы продолжаем развивать интеграцию и автоматизировать аналитические задачи. Так, с помощью удаленного запуска скриптов написанных в Zeppelin, из приложения мы формируем различные виды аналитических отчетов для менеджеров, которые раньше готовились индивидуально по запросу.