Как мы использовали сочетание F #, математического планирования и микросервисов для оптимизации и оптимизации бизнес-процессов

Мэтью Крюс, инженер по машинному обучению, Quicken Loans

Мэтью Крюс (Matthew Crews) - инженер по машинному обучению, специализирующийся на пересечении математического планирования и прогнозных моделей. Он любит обучать и создавать инструменты, которые помогают разработчикам использовать возможности математического планирования.

Аннотация

В мире бизнеса лучшие технологии побеждают. Мы все ищем способ предоставить лучшие решения быстрым, надежным и надежным способом. Следите за тем, как Мэтью Крюс рассказывает, как технологическая команда Rocket Mortgage, крупнейшего в стране ипотечного кредитора, использует F # и математическое планирование, чтобы предоставить инструменты, которые значительно улучшают процесс принятия решений, рентабельность и эффективность.

В нашем мире доминируют решения. Мы постоянно задаемся вопросом: «Что нам делать?» В бизнесе ответы на основе данных часто получают с помощью таблиц, запросов и многочасового анализа. Наша технологическая группа заметила закономерность в решениях, которые нас просили предоставить. Деловые партнеры приходили к нам и говорили: «Мне нужен инструмент, который поможет мне визуализировать эти данные» или «Мне нужен запрос, который покажет мне продажи в регионе X с разбивкой по столбцу Y».

Было бы легко просто предоставить визуализацию или запрос, но вместо этого мы спрашиваем: «Почему? Зачем нужна визуализация? Зачем вам этот запрос? » Практически в каждом случае необходимо принять решение, а деловому партнеру нужна информация из запроса, чтобы он мог принять наилучшее возможное решение. Но что действительно нужно бизнесу, так это ответ на вопрос: «Что мне лучше делать с учетом того, что я знаю?» У бизнеса принципиально нет проблемы анализа, у него есть проблема решения.

Вместо того чтобы просто продолжать предоставлять визуализацию и запросы, мы сделали шаг назад и представили инструмент, который будет принимать все возможные варианты, учитывать все правила и нормы и предлагать пользователю лучшие решения. Это может показаться неправдоподобным, но это проще, чем вы думаете. Моя команда, «QTrade», регулярно предоставляет эти инструменты нашим бизнес-пользователям на рынках капитала. Эти инструменты используются для определения цены, хеджирования и обмена ссуд Rocket Mortgage. Я хочу показать вам, как мы это делаем с помощью математического планирования и F #. Но сначала давайте посмотрим, как мы сюда попали.

Как мы пришли к математическому планированию

Мы заметили закономерность в соответствии с потребностями наших бизнес-пользователей. Есть измеримая цель, которая может заключаться в максимизации дохода, минимизации затрат, минимизации потерь или максимизации эффективности, и всегда есть способ измерить успех. Есть также решения, которые необходимо принять. Сколько людей мы назначаем задаче? Как я могу торговать этими займами? В какие активы я вкладываю этот капитал? Наконец, есть ограничения, которые им необходимо соблюдать. Например: доступно ограниченное количество людей, займы можно продавать только определенным образом или мы хотим снизить нашу подверженность риску.

Мы потратили неделю на переосмысление того, как мы предлагаем решения этих проблем, во время недавней Hack Week, мероприятия, которое дает возможность членам команды Rocket Mortgage отказаться от своей повседневной работы и потратить время на идеи, которые могут перестроить наш бизнес. . Идея состоит в том, чтобы дать свободу творчеству и инновациям и исследовать возможные.

Во время этой Hack Week несколько команд пробовали разные подходы к принятию решений, но победивший был основан на математическом планировании.

Математическое планирование: наука об оптимальных решениях

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

Цель измеряет успех. Это число, которое вы хотите достичь как можно выше или ниже. Примеры включают максимизацию дохода, минимизацию отходов или минимизацию времени до завершения.

Ограничения - это правила, положения и ограничения, которые необходимо соблюдать. Каждая компания работает с ограничениями, будь то количество сотрудников, требования закона или стратегический выбор. Не все возможно. Разница между возможным и невозможным - это ограничение.

Наконец, решения - это выбор, который мы должны сделать в рамках этой структуры: сколько единиц X мы должны купить? Сколько людей мы должны назначить для выполнения данной задачи? Где нам разместить припасы для доставки? Все это примеры решений.

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

Как «делать» математическое планирование?

Как только мы определили, что у компании есть проблема принятия решений, которую можно решить с помощью математического планирования, следующий вопрос: Как нам это сделать? Исторически инструменты для работы были ограничены экспертами в области исследования операций, области, где эти инструменты родились. Со временем библиотеки для создания и решения задач математического планирования стали доступны на всех основных языках программирования. Для Python у нас есть PuLP, для C # у нас есть OPTANO, а для F # у нас есть Flips, и это лишь некоторые из них.

Вы начинаете с создания модели, которая представляет вашу проблему. Затем вы отправляете эту модель решателю, библиотеке, которая понимает, как интерпретировать модель и находить лучшее решение. Вся причудливая математика происходит внутри решателя, и вы получаете решение от решателя, который заполнил значения, которые, по его мнению, вы должны использовать для своих решений.

Например, вы можете создать модель, чтобы максимизировать доход от фургона с едой. Как владелец фургона с едой, вы должны решить, сколько каждого ингредиента брать с собой. Ваша цель - получить максимальный доход. Ваши ограничения включают размер фургона с едой и количество каждого доступного ингредиента.

Как разработчики программного обеспечения, мы понимаем, что этот рабочий процесс может состоять из нескольких функций:

  • Функция, которая принимает данные и создает модель
  • Функция Solve, которая принимает модель и возвращает решение
  • Функция, которая принимает решение и сопоставляет его с областью бизнеса

Это так просто.

Но почему F #?

К счастью, команда QTrade уже создавала с учетом расширяемости и эволюции. Стек, который мы используем, в основном состоит из микросервисов, написанных на F #, связанных друг с другом через Kafka.

Как функционально-ориентированный язык для .NET, F # идеально подходит для нашего проблемного пространства, благодаря его способностям точно моделировать предметную область с помощью алгебраических типов и способности составлять функции вместе для построения сложной логики. Хотя F # является многопарадигмальным языком, он лучше всего подходит для решения проблем путем точного моделирования доменов с использованием простых типов и написания функций, которые преобразуют эти типы. И мы именно этим и занимаемся.

Всем, кто хочет глубже погрузиться в F #, я рекомендую сайт F # for Fun and Profit Скотта Влашина.

Это всего лишь функции!

Предлагаю услугу - это просто функция, пусть и большая. Функция - это часть логики, которая принимает тип и создает новый тип. В F # мы можем определить функцию для добавления 1 к int следующим образом:

let add1 (x:int) : int =
    x + 1

Здесь add1 - это функция, которая принимает тип int и создает новое значение типа int. В этом случае тип входа и выхода одинаков, int. Однако это не обязательно. Давайте определим функцию, которая принимает int и возвращает string:

let hello (x:int) : string =
    sprintf “Hello! %i” x

Функция hello тривиальна, но является примером функции, которая переходит от типа int к типу string.

F # позволяет легко склеивать функции вместе, используя технику, называемую «композиция функций», с оператором ››. На других языках, если вы хотите вызвать функцию add1 со значением 5, а затем вызвать hello, вам необходимо вложить вызовы, например:

hello(add1(x))

В F # вы можете просто создать новую функцию add1Hello, склеив их вместе с >>, как показано ниже:

let add1Hello = add1 >> hello
add1Hello 5
> “Hello! 6”

Теперь у вас есть функция, которая принимает int и возвращает string.

Это тривиальные примеры, но теперь, когда вы понимаете, как работают функции в F #, мы можем посмотреть, как это применимо к реальной службе.

Встраивание модели в службу

Всякий раз, когда мы реализуем одну из этих служб, мы следуем аналогичной схеме. У нас будет тип OptimizationRequest, содержащий параметры, которые мы хотим использовать в модели. У нас есть ModelBuilder функция, которая превращает OptimizationRequest в Model тип. Функция Solve инкапсулирует логику решения модели и возвращает тип решения.

type Model = … // This is defined in the library you are using for solving these models
type Solution = … // This is defined in the library you are using for solving these models
type OptimizationRequest = {
// Parameters for the model
}
type DomainDecisions = {
// The Domain specific representation of the Solution found by the solver
// for use by other services
}
type ModelBuilder = OptimizationRequest -> Model
type Solve = Model -> Solution
type DecisionBuilder = Solution -> DomainDecisions

Используя композицию функций, наш сервис может быть таким же простым, как объединение этих функций вместе. В этом примере modelBuilder является экземпляром типа ModelBuilder, solution - экземпляром типа Solve, а solutionBuilder - экземпляром типа DecisionBuilder:

let businessLogic = modelBuilder >> solve >> decisionBuilder

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

Когда вы составляете достаточно небольших функций вместе, вы получаете бизнес-логику. Когда вы вместе составляете достаточно бизнес-логики, вы получаете услугу. Когда вы вместе составляете достаточно сервисов, вы получаете продукт. Когда вы составляете достаточно продуктов вместе, вы получаете набор продуктов. Функционирует полностью вверх и функционирует полностью вниз.

Эта продуманная архитектура делает относительно простым расширение существующего набора сервисов новым сервисом математического планирования. Мы добавляем еще один сервис в набор существующих микросервисов. Мы создаем пользовательский интерфейс, в котором пользователь может запросить оптимизацию. Компания по-прежнему может использовать Excel для запроса результатов и создания сводных таблиц, но больше не утомительно выполнять механические манипуляции с таблицами Excel. Вместо этого члены нашей команды могут тратить свое время на то, что у них хорошо получается - на общение с людьми.

Большие победы

Теперь, когда мы проделали это несколько раз, мы сделали шаг назад, чтобы рассмотреть основные победы. Некоторые из них были ожидаемыми, а другие были счастливыми случайностями.

Увеличение дохода

Я не могу сказать, насколько больший доход мы получаем с помощью этих инструментов, но могу сказать, что это очень важно. Для сравнения: в 2019 году мы закрыли кредиты на сумму 145 миллиардов долларов. Значительная часть этих ссуд проходит через службы математического планирования. Даже увеличение на 0,1% того, как мы торгуем ссудами, составило бы 145 миллионов долларов. В этих масштабах даже самые незначительные улучшения в эффективности, обеспечиваемые математическим планированием, могут привести к значительному выигрышу.

Повышенная эффективность

Мы часто видим резкое сокращение времени, необходимого для решения проблем, связанных с принятием решений, когда мы внедряем службу математического планирования. Ежедневные задачи, которые занимали четыре часа, сокращены до 10 минут. Такое резкое повышение эффективности дает людям возможность переосмыслить другие части нашего бизнеса, открывая для нас новые возможности в ипотечной отрасли, которые раньше были бы невозможны.

Надежный и повторяемый

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

Соответствие цели

В процессе внедрения инструмента математического планирования у нас было много дискуссий по поводу уточнения цели и ограничений модели. Люди часто предполагают, что все понимают проблему одинаково, но мы снова и снова обнаруживаем, что это не так. У людей разные ментальные модели того, что должно и не должно быть возможным. При выявлении ограничений мы должны уточнить юридические ограничения по сравнению со стратегическими решениями или устаревшими правилами, которые больше не применяются. Теперь математическая модель стала общим пониманием бизнеса и команды разработчиков.

Бизнес-логика в системе контроля версий

Как только математическая модель планирования представляет собой фрагмент кода, встроенный в сервис, мы также сохраняем его в системе контроля версий. У нас есть записи о том, какая логика применялась и в какое время, потому что по мере развития отрасли меняются и модели. Когда модель меняется, остается документальный след, объясняющий, почему. Это избавляет от дискуссий о том, следовали ли люди правильным шагам, манипулируя каким-либо файлом Excel, когда они пытались следовать за непонятным бизнес-процессом. Такой критически важный компонент бизнеса должен иметь поддающиеся аудиту записи о том, как были приняты решения.

Дальнейшие действия

Сочетание F # и математического планирования позволяет нам быстро и надежно предоставлять решения нашим деловым партнерам. Мы нашли множество возможностей для оптимизации бизнес-процессов и повышения прибыльности, эффективности и надежности, и мы добились огромного успеха с этим решением. Использование F # в качестве основного языка позволяет нам легко развивать нашу предметную область и продолжать добавлять сервисы в наш набор продуктов, при этом имея возможность масштабироваться в соответствии с быстрым ростом, который мы наблюдаем. Мы с нетерпением ждем возможности поделиться более подробной информацией о том, как мы реализуем компоненты внутри этих систем, включая тестирование на основе свойств, эволюцию предметной области и фактическое моделирование для математического планирования. Это захватывающее время, а мы только разминаемся!

Мы все еще набираем сотрудников! Даже в разгар пандемии мы меняем финтех-отрасль. Хотите присоединиться к нам? Ознакомьтесь с нашими технологическими новинками.

Это мнение автора. Если в этом посте не указано иное, Quicken Loans не является аффилированным лицом и не одобрено какой-либо из упомянутых компаний. Все используемые или отображаемые товарные знаки и другая интеллектуальная собственность являются собственностью соответствующих владельцев. Эта статья принадлежит © 2020 Quicken Loans.