Битва Роботов На Хакатоне Яндекс.деньги

11-12 марта прошло Хакатон Яндекс.

Деньги , в котором приняли участие мы, команда Happy Santa из Санкт-Петербурга.

О победителях уже есть отдельная статья .

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



Битва роботов на хакатоне Яндекс.
</p><p>
Деньги

Как вы выбрали идею? За 24 часа им пришлось решить не самую простую задачу: организаторы Хакатона попросили предложить интересные идеи и необычные кейсы, выходящие за рамки «продажи» ботов (спойлер: в конце концов, это был именно такой бот, который выиграл).

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

Оценив свои силы, мы решили сделать бота, который совершает покупки, информирует о статусе заказа, отвечает на популярные вопросы пользователей и собирает отзывы.

Кроме того, необходимо было создать склад с резервированием товаров и CRM для заказов и курьеров в минимальном рабочем состоянии.

Чтобы было еще интереснее, мы решили поддерживать два типа ботов: Проще для Telegram, который реагирует на статические команды.

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

Как мы это сделали? Для нас это не первый хакатон; однажды мы даже заняли второе место на хакатоне ВКонтакте.

А как мы уже знали, самая главная задача на таких мероприятиях — хорошо разложить задачи (на самом деле приятно подать идею и произвести впечатление на судей, но вот кому интереснее).

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

Подводя итог, можно выделить три категории задач: Веб + интеграция с Яндекс.

Деньгами.

Транспортный уровень – прием и отправка сообщений в мессенджерах.

Мозг – принятие решений о том, как реагировать на сообщение.

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

Куча.

Хакатон — это не то место, где есть время узнать что-то новое, поэтому мы выбрали знакомый нам стек: PHP 5, MySQL, RabbitMQ, Redis. Было желание попробовать PHP7, но решил не рисковать.

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

MySQL — хранилище наших заказов и их статусов.

Redis — кеширование, блокировка.

Проблемы, с которыми мы столкнулись.

Основные проблемы были на транспортном уровне.

Ранее мы делали ботов для ВК и Telegram и были знакомы с особенностями, плюсами и минусами каждой платформы.

Сообщения скачивались из мессенджеров через Long Pool, что значительно облегчило разработку; кроме того, ВК и Telegram реализовали это практически одинаково.

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

Во ВКонтакте иногда возникает проблема с отправкой сообщений через API: отправить сообщение с первого раза не получается, поэтому отправку приходится повторять.

Здесь RabbitMQ очень помог с поддержкой отложенных сообщений (ttl + недоставленное письмо).

Тот же метод использовал Telegram. У них похожая проблема: периодически на любой запрос начинает выдавать ошибку 502. Это можно вылечить временем или перевыпуском токена бота (но не всегда).

Как мы писали выше, было решено сделать две версии бота.

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

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

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

«Умный» бот отвечал на сообщения, содержащие всего один вопрос, содержащий от трех до десяти слов.

Таким образом мы отфильтровали обычные сообщения от пользователей и сложные наборы вопросов.

Остались только ясные области тем, на которые мы могли дать четкий и правильный ответ. Если бот не знал, что ответить или сообщение удалялось, то мы отправляли один из десяти стандартных ответов о том, что бот умный, но не очень умный.

Мы добавили десять разных вариантов ответа, чтобы случайно не попасть в спам.

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

Проблема номер один: как понять, где в сообщении находятся вопросы и как их там найти? Для начала мы разбили текст на предложения, а затем рассмотрели каждое предложение по отдельности.

Знаки вопросительных предложений были довольно простыми: 1. Вопросительный знак, 2. Одно из вопросительных слов («где»/«когда»/…), 3. Союз «а» в начале предложения.

Проблема номер два: исправление слов с ошибками.

Для решения этой проблемы мы использовали пспелл .

Чтобы это исправить, он предлагал слишком много вариантов, поэтому мы отфильтровали их по расстоянию Левенштейна: вес замены = 1, вес удаления/добавления = 2, выбрать любой вариант из вариантов с меньшим весом.

Проблема номер три: как вы все-таки понимаете, о чем мы говорим? Времени на сверхкрутое решение с использованием лингвистического анализа и машинного обучения не было, поэтому мы просто искали ключевые слова.

Но, как известно, в русском языке слова имеют много разных форм.

На помощь пришла еще одна технология от Яндекса — Мистем .

Mystem — отдельная программа для морфологического анализа русского текста.

Он позволяет делать много классных вещей, в том числе определять форму слова, но нас интересовало только одно — приведение слова в нормальную форму.

Интересно, что некоторые люди при общении с ботом пытались под него подстроиться.

Они не пытались задавать ему вопросы, как обычному человеку.

И они старались облегчить ему жизнь и присылали ему конкретные слова «доставка/оплата», а он ждал от них вопросов.

Так что будущее, судя по всему, за комбинированными ботами, которые умеют и общаться, и понимать команды.

Как все это происходило в жизни? Обещали судить по пяти критериям: массовость, реализация, удобство, человекоподобие, оригинальность.

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

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

Хакатон.

Как оказалось, мы переоценили интерес людей.

Никто из судей не совершил покупку и не узнал, как работает бот или почему мы сделали что-то действительно интересное.

Более того, мы специально подготовили среди товаров деревянные значки с логотипом Яндекс.

Денег, чтобы мотивировать как можно больше людей совершить покупку.

Бот все еще работает, поэтому вы можете попробовать его сами: santa12.tk vk.com/hsstore telegram.me/hsstorebot На скриншоте вы можете увидеть пример того, как был оформлен заказ в ВКонтакте.

Пользователь выбирает понравившийся товар и нажимает «Купить».

В этот момент создается диалог с сообществом, и соответствующий товар резервируется на складе на 5 минут. На этом этапе бот может собрать любую информацию о пользователе: имя, адрес, другие дополнительные поля.

Нам нужно было только имя.

Доставка осуществлялась двумя способами: самовывоз с нашего стола или курьером.

Оплата производилась через Яндекс.

Деньги.

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

Кстати, курьер договорился о встрече на территории Хакатона в том же чате и после передачи товара сменил статус заказа в CRM на доставлен.

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



Битва роботов на хакатоне Яндекс.
</p><p>
Деньги

К сожалению, нам не удалось победить.

Но в любом случае спасибо Яндексу за мероприятие и всем участникам.

И особенно для тех, кто воспользовался ботом и купил значки.

Было приятно увидеть ваше удивление работой бота и нашей службой доставки.

Кстати, если вы из Питера, то у нас осталось еще несколько значков и вы еще можете купить их за рубль.

Послесловие.

Напоследок хотелось бы отметить, что мы были единственной командой на хакатоне, которая работала с API ВКонтакте.

Была еще одна хорошая команда с ботом для Slack, а все остальные работали с Telegram API. Нам даже намекнули, что у судей, скорее всего, нет страниц во «ВКонтакте», и они не смогут оценить работу «умного» бота.

Конечно, у Telegram есть хороший API для ботов, но боты все равно делаются для пользователей.

Но с этим у них до сих пор проблемы.

Так что советуем всем не забывать про ВКонтакте, тем более, что там очень активно начали работать над API сообщений сообщества, продуктов и скоро добавят много новых и крутых функций.

Теги: #Яндекс #хакатон #Яндекс.

деньги #боты #Telegram #vkontakte #API ВКонтакте #Разработка электронной коммерции

Вместе с данным постом часто просматривают: