11-12 марта прошел Хакатон Яндекс.Денег, в котором мы — команда Happy Santa из Санкт-Петербурга приняли участие. О победителях уже есть отдельная статья. Нашей команды там нет, так что решили рассказать Хабрасообществу о своем проекте и решениях, которые мы использовали.
Как выбрали идею?
За 24 часа предстояло решить не самую простую задачу: организаторы Хакатона просили предложить интересные идеи и необычные кейсы, которые выходят за рамки «продающих» ботов (спойлер: в итоге победил именно такой бот).
Мы же решили делать бота продавца и автоответчика не из-за недостатка идей, а так как сами работаем в eCommerce и хорошо знакомы с проблемами и многими неочевидными требованиями к бизнес-логике магазинов. Оценив свои силы, мы решили сделать бота, который оформляет покупки, информирует о состоянии заказа, отвечает на популярные вопросы пользователей и собирает фидбек. Кроме того, было необходимо в минимально рабочем состоянии создать склад с резервацией товаров и CRMку для заказов и курьеров. Чтобы все было еще интереснее, мы решили поддержать два типа ботов:
Более простого для Телеграма, который реагирует на статические команды.
Более сложного для ВКонтакте, который реагирует на привычный человеческий язык и больше похож на настоящего человека.
Как мы это делали?
Это не первый Хакатон для нас, когда-то мы даже заняли второе место на Хакатоне ВКонтакте. И как нам уже было известно, самая важная задача на таких мероприятиях – хорошо декомпозировать задачи (на самом деле красиво презентовать идею и впечатлить судей, но это уже кому и что интереснее). Первым делом, мы разбили все задачи и постарались максимально изолировать их, чтобы каждый из нас мог кодить независимо друг от друга. Если обобщить, то получилось три категории задач:
Веб + интеграция с Яндекс.Деньгами.
Транспортный уровень – получение и отправка сообщений в мессенджеры.
Такое разбиение позволило независимо друг от друга реализовать выделенные задачи и минимально отвлекаться, разве что затем, чтобы согласовать взаимодействие между этими слоями.
Стэк.
Хакатон – не то место, где есть время на изучение чего-то нового, поэтому мы выбрали привычный для нас стек: PHP 5, MySQL, RabbitMQ, Redis. Было желание попробовать PHP7, но решили не рисковать. RabbitMQ был выбран как клей между нашими условными слоями, что позволило нам разделить кодовую базу. MySQL – хранилище наших заказов и их статусов. Redis – кеширование, блокировки.
Проблемы, с которыми мы столкнулись.
Основные проблемы находились на транспортном уровне. Ранее мы уже делали ботов для ВК и Телеграма и были знакомы с особенностями, минусами и плюсами каждой из платформ. Сообщения загружались из мессенджеров через Long Pool, что существенно облегчило разработку, кроме того, реализовано это у ВК и Телеграма практически одинаково. Для надежности мы предусмотрели алгоритм автоматического перезапуска процессов получения сообщений из API в случае фатальных ошибок и докачки сообщений, которые были присланы, когда бот был оффлайн. Во ВКонтакте иногда происходит проблема с отправкой сообщений через API: не получается отправить сообщение с первого раза, поэтому отправку приходится повторять. Тут очень помог RabbitMQ с поддержкой отложенных сообщений (ttl + dead-letter). Этот же метод был применен у Телеграма. У них есть похожая проблема: периодически на любой запрос начинает приходить ошибка 502. Лечится это временем или перевыпуском токена бота (но не всегда).
Как мы уже написали выше, было принято решение сделать две версии бота. У Telegram удобная реализация меню бота, там хорошо проработала система команда – поэтому бот жестко ориентировался на них и взаимодействовал с пользователем строго через команды и меню.
В “умной” версии боту можно было задавать стандартные вопросы, которые покупатели обычно спрашивают у саппорта: об оплате, способе доставки, размерах, вакансиях. Но как понять, чего хочет пользователь? Времени было мало, а сделать хотелось достаточно круто, поэтому решили повысить точность бота за счет полноты. “Умный” бот реагировал на сообщений, в которых содержался только один вопрос, содержащий от трех до десяти слов. Таким образом мы отсеивали обычные сообщения от пользователей и сложные наборы вопросов. Оставались только четкие области тем, на которые мы могли дать четкий и правильный ответ. Если бот не знал, что ответить или сообщение отсеивалось, то мы присылали один из десяти стандартных ответов про то, что бот умный, но не очень. Мы добавили десять разных вариантов ответа для того, чтобы не улететь случайно в спам. Что порадовало, такой подход хорошо сработал, и если покупатель не пытался специально “поломать” бота, то он мог успешно ознакомиться с условиями доставки, оплаты и оформить заказ.
Проблема номер один: как понять, где в сообщении вопросы и как их там найти? Для начала, мы разбивали текст на предложения, а затем рассматривали каждое предложение по отдельности.
Признаки вопросительных предложений были достаточно простые:
1. Вопросительный знак,
2. Одно из вопросительных слов(“где”/”когда”/…),
3. Союз “а” в начале предложения.
Проблема номер два: исправление ошибок в словах. Для решения этой проблемы мы использовали pspell. Для исправления он предлагал слишком много вариантов, поэтому мы фильтровали их с помощью расстояния Левинштейна: вес замены = 1, вес удаления/добавления = 2, выбирали любой вариант из вариантов с меньшим весом.
Проблема номер три: как всё-таки понять, о чем речь? На убер крутое решение с использованием лингвистического анализа и машинного обучения времени не было, поэтому мы просто искали опорные слова. Но, как известно, в русском языке у слов много различных форм. На помощь пришла еще одна технология от Яндекса – Mystem. Mystem – отдельная программа для морфологического анализа русского текста. Она позволяет делать много крутых вещей, вплоть до определения формы слова, но нас интересовало только одно – приведение слова в его нормальную форму.
Что интересно, некоторые люди при общении с ботом пытались подстраиваться под него. Не пытались задавать ему вопросы, как бы они сделали с обычным человеком. А пытались сделать его жизнь проще и посылали ему конкретные слова «доставка/оплата», а он ждал от них вопросов. Так что будущее, видимо, за комбинированными ботами, которые умеют и общаться, и понимать команды.
Как все это работало в жизни?
Судить обещали по пяти критериям: массовость, реализация, удобство, человекоподобность, оригинальность. И отдельно озвучивалось, что бот должен реально работать, но как оказалось, для победы это условие не было обязательным.
Нам показалось, что лучшей презентацией будет дать возможность судьям и участникам совершить реальную покупку через бота, пообщаться с ним, оплатить эту покупку, выбрать способ доставки, а потом получить товар курьером прямо на Хакатоне. Как оказалось, мы переоценили интерес людей. Ни один из судей не совершил покупку и не ощутил на себе, как бот работает и почему мы сделали что-то действительно интересное. При том мы специально заготовили среди товаров деревянные значки с логотипом Яндекс.Денег, чтобы смотивировать как можно большее количество людей совершить покупку.
Бот работает и сейчас, так что можете попробовать сами:
santa12.tk
vk.com/hsstore
telegram.me/hsstorebot
На скриншоте можно увидеть пример, как происходило оформление заказа во ВКонтакте. Пользователь выбирает понравившийся ему товар, нажимает «Купить». В этот момент создается диалог с сообществом, а на складе на 5 минут резервируется соответствующий товар. На этом этапе бот может собирать любую информацию о пользователе: имя, адрес, другие дополнительные поля. Нам было необходимо только имя. Доставка осуществлялась двумя способами: самовывоз с нашего стола или курьером. Оплата проходила через Яндекс.Деньги. Если оплата прошла, то заказу присваивается уникальный код, который отправляется пользователю, чтобы курьер мог передать товар правильному получателю. Кстати, курьер договаривался о встрече на территории проведения Хакатона в том же чатике, а после передачи товара изменял в CRM статус заказа на доставлен. В этот момент пользователь получал сообщение от бота, что заказ доставлен и предложение оставить пожелания по сервису.
К сожалению, победить не удалось. Но все равно спасибо Яндексу за мероприятие и всем участникам. А особенно тем, кто использовал бота и купил значки. Было приятно видеть Ваше удивление от того, как бот работал, и от нашей службы доставки. Кстати, если Вы из Питера, то у нас ещё осталось несколько значков и их всё ещё можно купить за рубль.
Послесловие.
Напоследок хотелось бы отметить, что мы оказались единственной командой на Хакатоне, которая работала с API ВКонтакте. Была ещё одна хорошая команда с ботом для Slack, а все остальные поголовно работали с API Телеграм. Нам даже намекнули, что у судей, скорее всего, нет страниц во ВКонтакте, и они не смогут оценить работу «умного» бота. Конечно, у Телеграма хорошая АПИшка для ботов, но ботов все-таки делают для пользователей. А вот с этим у них пока проблемы. Так что советуем всем не забывать про ВКонтакте, тем более они очень активно принялись работать над API для сообщений сообществ, товарами и скоро добавят массу новых и крутых возможностей.
Автор: Nezd