В последней части нашего проекта Лаборатории машинного обучения для прогнозирования доступности станций Capital Bikeshare мы использовали механизм прогнозирования, который создали ранее в этом году, и добавили данные о погоде. Это дало нам значительный прирост точности и отзыва, что означало, что двигатель наконец-то был готов к работе в прайм-тайм.

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

Как мы это сделали

Во-первых, нам нужен был способ понимать сообщения пользователей и извлекать ключевую информацию, такую ​​как местоположение и время. Было несколько инструментов, которые соответствовали нашим требованиям, но в итоге мы выбрали wit.ai, так как он бесплатный и, кажется, имеет очень мало ограничений. Используя их визуальный дизайнер (рис. 1), мы создали историю, которая фиксирует различные сценарии и активно запрашивает информацию о дате и местоположении от пользователя в диалоговой форме.

Рис. 1

Далее нам нужно было подключить Slack и wit.ai. Для этого мы настроили сервер node.js, который может взаимодействовать с обеими системами и действовать как прокси. Например, когда пользователь отправляет сообщение боту, оно пересылается и оценивается wit.ai, который, в свою очередь, отвечает, и это тоже пересылается, на этот раз обратно пользователю. Мы добились этого с помощью Botkit, библиотеки node.js для Slack Real Time Messaging API, и собственного Javascript SDK wit.ai.

Когда сообщение получено из Slack, оно оценивается wit.ai, где содержащиеся в нем сущности извлекаются, сохраняются в сеансе, а затем создается ответ одним из двух способов. Если в сеансе отсутствует время или место, пользователю будет предложено предоставить недостающую информацию. Этот тип бота называется слотовым, потому что его цель — заполнить ряд информационных слотов, как веб-форма. Однако, если оба объекта найдены, он вызывает назначенную функцию на стороне node.js. Это, в свою очередь, делает запрос к нашему API, форматирует ответ и отправляет результат в Slack.

Когда взаимодействие завершено, наш сервер node.js переходит в состояние wit.ai, и в следующий раз, когда мы услышим от пользователя, начнется новый разговор и сеанс.

Проблемы

Мы столкнулись с проблемами часового пояса, которые стали очевидны только после развертывания бота. Из-за того, что Capital Bikeshare находится в Вашингтоне, округ Колумбия, мы хотели интерпретировать пользовательский ввод как относящийся к восточному часовому поясу, поэтому, например, «9 вечера сегодня вечером» будет проанализировано как 21:00 по восточному времени. К сожалению, wit.ai интерпретировал пользовательский ввод в часовом поясе своего центра обработки данных, поэтому нам пришлось потратить некоторое время на обработку данных.

Мы также столкнулись с некоторыми трудностями при определении ветвей диалога в конструкторе историй wit.ai. Это условное переключение, которое использует состояние сеанса, чтобы определить, следует ли запрашивать у пользователя дополнительные данные. Похоже, что Wit.ai не допускает отрицания в выражениях условий, поэтому мы не можем указать «!date». Вместо этого нам пришлось создать несколько дополнительных переменных (например,missingDate,missingLocation) и убедиться, что они соответствующим образом обновляются по ходу разговора. Это казалось ненужным и громоздким.

Наконец, мы хотели добавить некоторые различия в ответы бота, чтобы он не всегда запрашивал данные, используя одни и те же слова. Однако мы не смогли найти способ чередовать сообщения в истории wit.ai. Вероятно, мы могли бы экспортировать эту логику на сторону node.js, но это нарушило бы архитектурную простоту простого прокси. Мы чувствовали, что оно того не стоит.

Вывод

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

Есть видение проекта машинного обучения? Напишите нам.