В этом посте я покажу шаги по созданию и развертыванию SlackBot в AWS с помощью Chalice. Бот использует обученную модель машинного обучения, чтобы предсказать, какая команда НИОКР наиболее способна ответить на вопрос, введенный пользователем. Вот так:

Подробности обучения модели машинного обучения будут в более позднем посте. На данный момент просто знайте, что текст из заявок Jira, назначенных командам схватки с метками от A до I, используется для создания классификатора, чтобы мы могли предсказать команду, которая задает вопрос. Обученная модель хранится в S3.

Бессерверный хостинг

SlackBot - это, по сути, веб-сервер, отвечающий на входящие запросы через конечную точку отдыха. Вы могли бы просто запустить где-нибудь доступный из Интернета сервер, но это кажется идеальным приложением для запуска в AWS Lambda; каждый запрос недолговечен и не имеет состояния. Проблема с AWS заключается в том, что нужно многому научиться, чтобы использовать все элементы, необходимые для достижения этой цели: функции Lambda, API-шлюз, роли IAM и т. Д. Чтобы упростить это, инструменты и фреймворки с открытым исходным кодом могут позаботиться о многом. этих накладных расходов. AWS Chalice - это

… микрофреймворк для написания бессерверных приложений на Python. Он позволяет быстро создавать и развертывать приложения, использующие AWS Lambda.

Я не буду повторять здесь то, что вы можете прочитать в документации Chalice. Я предлагаю для начала создать Hello World rest api, а затем следить за этим постом.

Slack-клиент

Чтобы взаимодействовать со Slack из нашего кода Python, нам нужно использовать slackclient. Поскольку наше приложение уже работает во фреймворке Chalice, мы не будем часто использовать клиентский фреймворк Slack. Фактически, он используется только для вызова api, чтобы вернуть ответ на вопрос.

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

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

  1. Основная информация / токен подтверждения - (для SLACK_VERIFICATION_TOKEN)
  2. OAuth и разрешения / Токен доступа OAuth пользователя бота - (для SLACK_BOT_TOKEN)

Код

Если вы создали приложение Hello World Chalice, вы будете знакомы с основными компонентами:

  • app.py - где мы построим slackbot
  • .chalice/config.json - здесь мы настроим приложение
  • requirements.txt - нужные нам библиотеки Python

Этот первый блок кода выполняет некоторый импорт и некоторую инициализацию. Импорт относится к некоторым пакетам, которые нам нужно будет объединить в zip развертывания для функции Lambda. Они объявлены в requirements.txt файле для Чаши:

Часть инициализации - это чтение переменных среды. Рекомендуется отделять эти параметры конфигурации от кода. В дополнение к токенам Slack, упомянутым ранее, мы также указываем сегмент S3 и ключ для местоположения модели машинного обучения. Вот пример config.json файла:

В этом конфигурационном файле есть еще несколько параметров, на которые стоит обратить внимание:

lambda_memory_size - Я установил 1536 МБ - обратите внимание, что выделенная память используется для расчета пропорциональной мощности ЦП. Поскольку мы загружаем и запускаем модель машинного обучения, распределения по умолчанию недостаточно. Моя стратегия состоит в том, чтобы начать с достаточно высокого уровня, а затем снизить его. Журналы облачных часов показывают количество потраченного времени и памяти, использованной для каждого запуска - это хорошая информация, которую можно использовать при настройке.

manage_iam_role и iam_role_arn - Chalice попытается создать для вас роль iam с правильными разрешениями, но это не всегда работает. Если для роли не предоставлен доступ S3, вы можете добавить его в консоли AWS, а затем указать arn в config.json. Вам также необходимо установить manage_iam_role на false.

Задержки

Внимательные читатели заметят, что на приведенном выше снимке экрана журнала облачных наблюдений была большая разница во времени между двумя запусками, один составлял 10 секунд, а следующий - менее 1 миллисекунды! Причина этого в том, как работает AWS Lambda. Если функция «холодная», первый запуск в новом контейнере, то мы должны выполнить дорогостоящий процесс извлечения модели машинного обучения из S3 и загрузки ее в sci-kit learn. При всех последующих вызовах, пока функция «прогрета», модель будет в памяти. Мы должны кодировать эти «холодное» и «теплое» состояния, чтобы обеспечить приемлемое поведение.

Приведенный выше фрагмент кода показывает, где мы загружаем и используем модель. load_model() просто проверяет, инициализирован ли clf. В противном случае он загружает модель из S3 в папку / tmp в контейнере Lambda и загружает ее. На момент написания Lambda предоставляет 512 МБ пространства tmp, поэтому следите за размером вашей модели. Пока функция теплая, последующие вызовы load_model() будут быстро возвращаться без необходимости загружать модель.

Вам может быть интересно, почему мы просто не загрузили модель в верхней части скрипта. Это загрузит его только один раз, и он сделает это естественным образом при первом «холодном» запуске. Проблема здесь в том, как Slack взаимодействует со SlackBot.

Вышеупомянутая функция вызывается из Slack всякий раз, когда есть входящее событие в зависимости от типов событий, для которых мы зарегистрировались (снимок экрана в верхней части этого сообщения). Он также вызывается во время регистрации как вызов, чтобы проверить, соответствует ли этот бот регистрации. Первый оператор if проверяет, совпадает ли входящий токен от Slack с нашим токеном проверки. Затем, если это запрос вызова, мы просто разворачиваемся и отправляем строку запроса обратно.

Третий оператор if интересен и является причиной, по которой нам пришлось обрабатывать загрузку модели таким образом, как мы это делали. В event api doc одним из условий сбоя является мы ждем более 3 секунд, чтобы получить действительный ответ от вашего сервера. Это также относится к запросу, приведенному выше, поэтому, если мы загрузим модель машинного обучения на 10 секунд, мы даже не сможем зарегистрировать нашего бота! Далее в документе говорится, что сбои повторяются немедленно, затем через 1 минуту, а затем через 5 минут. Этот код мог бы более тщательно обрабатывать различные сценарии сбоя и обрабатывать каждый соответственно, но для простоты и поскольку это не критически важное приложение, я написал код, который просто поглощает попытки повторных попыток, немедленно возвращаясь с 200 OK. Причина этого заключалась в том, что я обнаружил, что мой первый холодный запуск займет больше 3 секунд, и поэтому произойдет повторная попытка. Это может даже привести к тому, что AWS создаст еще одну функцию Lambda, потому что моя первая все еще работала. В конце концов, в зависимости от времени, я могу получить два или три идентичных ответа в канале Slack по мере завершения прогонов.

Итак, наконец, мы переходим к боту, который фактически выполняет логический вывод по входящему вопросу и возвращает строку, предлагающую команде связаться. На самом деле это довольно просто - он ищет слово «кто» в вопросе, а затем передает всю строку в функцию прогнозирования, чтобы получить классификацию. Обратите внимание, что load_model() вызывается только в том случае, если найдено «who».

Развертывание

Если вы ранее запускали приложение Chalice Hello World, вы дошли до точки, в которой запустили chalice deploy, а затем оно сотворило чудо и создало для вас все материалы AWS, и вы были в рабочем состоянии. Это может работать для этого SlackBot, но я столкнулся с одной проблемой - это ограничение на размер zip-архива в 50 МБ, которое накладывает AWS Lambda. Если размер вашего ZIP-архива развертывания (всего кода и пакетов) превышает этот предел, произойдет сбой. Однако еще не все потеряно, по какой-либо причине, если вы развернете свой zip из S3, а не как часть загрузки, вы можете выйти за пределы этого лимита.

Chalice предоставляет альтернативу методу автоматического развертывания, позволяющую использовать вместо него AWS Cloudformation. У этого способа развертывания есть побочное преимущество для этой проблемы ограничения в том, что он использует S3 для хранения пакета для развертывания. Вызов chalice package вместо развертывания создает zip-архив и шаблон SAM для последующего развертывания с помощью интерфейса командной строки AWS. Чтобы автоматизировать это для моего SlackBot, я создал сценарий bash:

Регистрация

Наконец, когда бот развернут, мы можем зарегистрировать его в Slack. Помните этот URL-адрес запроса и процесс проверки? Возьмите URL-адрес, который распечатан chalice deploy или deploy.sh, и добавьте к нему /slack/events, чтобы он выглядел примерно так:

https://##########.execute-api.us-east-1.amazonaws.com/api/slack/events

Вставьте это в поле формы URL-адреса запроса, и Slack немедленно попытается проверить вашего бота с помощью запроса вызова.

Были сделаны!

Бессерверный SlackBot запущен и готов ответить на вопросы ваших пользователей. В следующем посте я объясню, как была создана модель машинного обучения, с пошаговым руководством по коду для сбора данных из Jira, их очистки, обучения модели и доставки ее в S3.

Код доступен на Github.