Разработка чат бота – Разработка чат-ботов – заказать создание чат-бота для Telegram, Вконтакте, Facebook и веб-сайтов – Molinos

Содержание

цена создания чат ботов на любой платформе

Разработка чат-ботов – одна из множества качественных услуг, оказываемых фрилансерами и компаниями через YouDo. Исполнители, зарегистрированные на Юду, создают ботов для любых сайтов, мессенджеров и социальных сетей.

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

Chat-bot – стоимость создания

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

  • платформа для создания ПО (Телеграм, Facebook messenger, Slack, Skype и пр.)
  • функциональность (боты могут помочь при оформлении заказов через мобильное приложение, общаться с людьми, добавлять подписчиков и т.п.)
  • сложность написания скриптов, тестирования, обслуживания и техподдержки программного обеспечения
  • необходимость интегрировать в программу сторонние сервисы с открытым API
  • сроки, в которые нужно создать бота

Отсутствие посредников позволяет держать цены на 20-30% дешевле, чем у большинства компаний, производящих приложения для мобильных телефонов. Выгода обращения к Юду очевидна – недорого закажите девелопмент ботов Telegram или любой другой платформы.

Как оформить заказ на Юду

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

  • отзывы предпринимателей, приобретающих ПО под ICQ, Telegram или другие ресурсы
  • рейтинги, примеры выполненных работ
  • прайсы с актуальными ценами

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

Полное руководство по разработке чатботов

Все, что вам нужно знать

Что такое чатботы? Почему они представляют собой такие большие возможности? Как они работают? Как они создаются? Как можно встретиться с людьми, заинтересованными в чатботах?

На эти вопросы мы ответим в данном посте. Готовы? Вперед!

“~90% времени, которое мы проводим на мобильных устройствах, уходит на электронную почту и обмен сообщениями в мессенджерах. Логично направлять команды, занимающиеся разработкой продуктов, туда, где зависают потребители!” – Нико Бонастос, генеральный директор General Catalyst.

1-C9IKKNTNvrXwLw9dfLQU1w

Что такое чатбот?

Чатбот – это сервис, управляемый правилами и иногда искусственным интеллектом, с которым вы взаимодействуете через интерфейс чата. Сервис может включать разные возможности, от функциональных до развлекательных, и сам он может входить в комплект любого чат-продукта (Facebook Messenger, Slack, Telegram, Text Messages и т.д.).

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

Если вы еще не разобрались, не переживайте. Вот пример, который поможет вам визуализировать чатбота.

Пример:

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

Nordstrom

Если в Nordstrom появится бот, в чем я не сомневаюсь, вы бы просто могли связаться с Nordstrom на Facebook. Бот спросил бы, что вы ищете, и вы бы просто… сказали это.

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

Nordstrom на Facebook

Примеры чатботов на Facebook

Посмотрите это видео с недавней конференции F8 (где Facebook оглашает свои последние нововведения). В 7:30 Дэвид Маркус, вице-президент Подразделения месседжинговых продуктов в Facebook, поясняет, как выглядит покупка туфель с помощью бота Facebook Messenger.

Примеры чатботов

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

  • Бот погоды. Получите информацию о погоде по запросу в любое время.
  • Бакалейный бот. Помощь в выборе и заказе продуктов на неделю.
  • Новостной бот. Попросите его рассказать, когда произойдет что-то интересное
  • Бот-советчик. Я расскажу ему свои проблемы, а он поможет мне найти их решение.
  • Бот по личным финансам. Он помогает мне лучше распоряжаться деньгами.
  • Бот-планировщик. Организовал мне встречу с представителями команды Messenger на Facebook.
  • Бот-друг. В Китае есть бот по имени Xiaoice, разработанный Microsoft, с которым общаются более 20 миллионов людей.

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

1-IRFhWNqusUWbTsB1hQXhrQ

Но зачем создавать бота? Конечно, он выглядит круто, использует какую-то суперпродвинутую технологию, но зачем кому-то тратить свое время и силы на него?

Это громная возможность. ОГРОМНАЯ. Я объясню это далее.

1-ecKJvkly4AWkFJw8Clfyfg

Почему чатботы так перспективны?

Вы, наверное, удивляетесь: “Почему кто-то вообще интересуется чатботами? Они выглядят как простенькие текстовые сервисы… в чем секрет?”

Отличный вопрос. Я вам расскажу, почему они интересуют людей.

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

1-7yz2oL1diR_jm6JIB1ugTg

Пусть это повисит тут секундочку.

Люди пользуются приложениями-мессенджерами активнее, чем соцсетями.

“Сейчас люди проводят больше времени в мессенджерах, чем в соцсетях, и это очень важный перелом. Мессенджеры – это платформы будущего, и с помощью ботов их пользователи смогут получать доступ к разным видам сервисов”. – Питер Рохас, предприниматель в Residence на Betaworks

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

“Крупные перемены на больших платформах должны рассматриваться как новые возможности. При этом, нужно быть осторожными, чтобы не судить слишком жестко по ранним прототипам, когда платформы еще далеки от своего конечного вида. В недавнем релизе Facebook я вижу начало новой эры микроприложений. Фундаментальная идея в том, что потребители будут взаимодействовать через небольшие интерфейсы, будь то разговорные и/или виджеты, чтобы удовлетвориться сервисом/брендом через легкий доступ к полному профилю, без всяких сложностей вроде установки родного приложения. Потенциально это очень многообещающая перспектива”. – Аарон Батальон, партнер в Lightspeed Venture Partners

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

1-_OtLHepdbcRd5C2Ofc-Qhw

“Есть надежда, что потребители очень полюбят экспериментировать с ботами. Так было с мобильными приложениями 4+ года назад. Если бы тогда вам кто-то сказал… ‘Я создал приложение для Х’… Скорее всего, вы бы попробовали его. Теперь никто этого не делает. Возможно, слишком поздно основывать компании по разработки приложений. Но с ботами… надеюсь, что внимание потребителей будет также раскрыто и восприимчиво снова! – Нико Бонастос, генеральный директор General Catalyst

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

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

Я поясню.

чатботы

Как работают чатботы

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

Что это значит?

Чатботы, основанные на правилах:

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

Чатботы, работающие на машинном обучении:

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

“Нужно помнить, что у ботов есть иллюзия простоты на фронт-енде, но за этой простотой стоят множество технических сложностей, которые нужно преодолеть для создания удобного, полноценного функционирования. Нужно проделать огромное количество работы. Аналитика, оптимизация сценариев, учет всех обновлений и изменений платформ в условиях отсутствия единого формата. Для более глубоких взаимодействий и реальной коммерческой ценности, как например, в Assist понадобится анализатор ошибок, интеграции с API, маршрутизация и эскалация до живого человеческого понимания, НЛП, отсутствие кнопок “назад” и “домой”, и т.д. Нужно забыть все, чему мы научились за последние 20 лет, чтобы создать потрясающий опыт пользователя в этом новом направлении”. – Шейн Мак, CEO Assist

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

“Обмен сообщениями – это то, на что мы тратим уйму времени и рассчитываем на общение. Действительно смешно, что нам все еще приходится связываться с большинством компаний по телефону”. – Джош Эльман, партнер в Greylock

Greylock

Вы начинаете взаимодействие с ботом путем отправки ему сообщения. Кликните сюда, чтобы отправить сообщение чатботу CNN на Facebook.

чатбот CNN на Facebook

Искусственный интеллект

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

Искусственный интеллект

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

“Все, кто пытаются использовать искусственный интеллект на таком уровне, кажутся слегка опережающими время. Общение с компьютером, который просто не понимает многое из того, что вы говорите, может очень раздражать. Будьте осторожны, давая обещания, и задайте пользователям защитные ограждения от разочарований” – Джош Эльман, партнер в Greylock

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

Как вы встроите искусственный интеллект в своего бота? Не волнуйтесь, я все расскажу в следующей части этого поста.

чатбот

Как создавать чатботов

Разработка чатбота может показаться непостижимой, но на деле все вполне посильно. Вы будете создавать машину для чатов, управляемую искусственным интеллектом (или, конечно, вы всегда можете разработать чатбот с базовым функционалом, без изощренного искусственного мозга, следующего четким правилам).

“Сложность в разработке чатботов не столько техническая, сколько в UX. Самыми успешными ботами будут те, к которым пользователи захотят регулярно возвращаться, которые будут представлять для них постоянную ценность”. – Мэтт Хартман, директор Seed Investments в Betaworks

Вам нужно определить, какую задачу вы будете решать с помощью бота, выбрать, в какой платформе будет жить ваш бот (Facebook, Slack и т.д.), настроить сервер, откуда запускать бота и выбрать сервис для его разработки.

“Мы полагаем, что вам не нужно уметь программировать, чтобы разработать бота. Это и вдохновило нас год назад в Chatfuel, когда мы начали работу над бот-билдером. Мы увидели, что боты становятся гиперлокальными, например, бот для футбольной команды для связи с фанами или бот небольшого арт-сообщества. Боты очень эффективны, и возможность легко их создавать очень кстати”. – Дмитрий Думик, основатель Chatfuel

Вот некоторые ресурсы вам для старта.

Документация по платформам:

Полезные сервисы для разработки ботов:

“Очень сложно балансировать эту лихорадку вокруг всего нового, когда ты чувствуешь, что вокруг все одержимы какой-то идеей, а ты как будто позади всего этого. Но в итоге всегда выигрывает качество. Каждый будет впереди, если сфокусируется на создании хороших ботовых продуктов, которые отличаются качеством”. – Райан Блок, со-основатель Begin.com

Другие ресурсы:

Не хотите создавать свой?

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

1-nPwGGm-N9nAdchZaBdG2xQ

Как встретить людей, заинтересованных в чатботах?

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

Если вы читаете это, возможно, вы принадлежите к одной из этих категорий:

  1. Вы хотите узнать, как разрабатывать чатботы.
  2. Вы сейчас работаете над созданием чатбота, или уже разработали его (если это вы, я бы очень советовал попробовать получить $200 тыс. от Botcamp или $25 тыс. от Telegram).
  3. Вы хотите разработать чатбот, но нужен кто-то еще вам в помощь.
  4. Вы исследуете тему чатботов, чтобы оценить, стоит ли вам и вашей команде разрабатывать такие продукты.
  5. Вы инвестор, потенциально заинтересованный во вложении средств в стартапы, занимающиеся чатботами.

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

1-Zp3XIox90hyvHQr0771U3Q

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

В этой группе есть инвесторы, владеющие капиталом более $2 миллиардов, работники Facebook, Instagram, Fitbit, Nike и Ycombinator, и хакеры со всего мира.
Присоединяйтесь! Запросите приглашение в приватную группу Chatbots.

Я также создал встречу Silicon Valley Chatbots Meetup, можно зарегистрироваться здесь и получать уведомление по расписанию наших ивентов.

На сегодня все!

Желаю вам удачи в создании собственных чатботов и погружении в мир искусственного интеллекта (если вы еще не погрузились в него).

Разработка чат-бота — снижаем нагрузку на рабочий персонал компании

Вкалывают роботы, а не человек
(с) Приключения электроника

Бизнесу нужно идти в ногу с пользователем. Когда-то для контакта с клиентом нужен был только сайт. Сайт нужен и сегодня, но теперь нужны еще и SMM-сообщества, E-mail и SMS-рассылки, мобильное приложение и, конечно же, общение в мессенджерах. Мессенджеры стали популярными в использовании, и многие компании рассматривают в аудитории мессенджеров потенциальных клиентов. В связи с этим появились чат-боты, которые способны не только упростить работу пользователя, но и снизить нагрузку на рабочий персонал компании. И тут речь не только про виджет с консультантом на сайте и новостные каналы в Telegram. Чат-бот может отвечать на общие вопросы клиента в режиме 24/7, подсказывать цены и наличие товара, помогать оформлять заказ.

Чат-бот своими возможностями напоминает приложение, однако его возможности зависят от ограничений мессенджера, для которого его создают. Если сравнивать по быстроте разработки между приложением и чат-ботом, то тут выигрывает чат-бот. Кроме того, пользователю не нужно ничего скачивать — сейчас почти у каждого установлено по 2-3 мессенджера или клиента социальных сетей.

Для простых справочных чат-ботов есть удобные и мощные конструкторы. Есть даже самообучающиеся боты, с которыми можно относительно свободно поговорить о компании, продуктах или услугах. Но как только речь заходит об учете остатков, актуальных ценах или программе лояльности, о конструкторе можно забыть — этого они не умеют. В таком случае требуется индивидуальная разработка чат-бота.

Решаемая задача

В 2019 году к нам обратился один из клиентов (федеральная сеть аптек) за разработкой чат-бота для трех платформ (Алиса, ВК, Facebook). Основная цель — автоматизация типовых запросов за счет модной фишки. Дополнительные цели — разгрузка SMM-специалистов и создание нового канала продаж.

Начать решили с простых задач:

  1. Выдача справочной информации
  2. Поиск товаров в наличии по региону

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

Как мы решали задачу

Функции бота

Сайт клиента разработан на Битриксе, так что код чат-бота разместили прямо на сайте в скрытом разделе. Это позволило обращаться к базе данных сайта и использовать интерфейс Битрикса для управления данными бота.

Сначала нам потребовалось точно описать все взаимодействия пользователя и чат-бота. Для самых запутанных случаев рисовали конечный автомат (диаграмма состояний лучше всего описывает логику бота).

Выдача справочной информации

Бот должен отвечать на вопросы («Как оформить заказ?», «Как позвонить?») заданными ответами. Ответы и формулировки вопросов хранятся на сайте в виде файлов. При желании контент-менеджер может их изменять в интерфейсе администратора Битрикс.

Выбор города

Процедура кажется простой, она самая разветвленная. Все просто, если пользователь правильно написал свой город, город найден в базе и такой город только один. Но на каждый ошибочный сценарий предусмотрены свои «пути отступления». Если пользователь опечатался в названии города, он может его исправить. Если городов несколько — чат-бот просит уточнить субъект РФ.

Диалог с Алисой: выбор города

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

Поиск товаров в наличии

Пользователь может написать чат-боту: «хочу купить» и бот переспросит, что именно. Альтернативный сценарий: сразу спросить «у вас есть анальгин?» (и еще десяток вариаций этой фразы).

Реализация этой команды показала все выгоды нашего подхода (разместить чат-бот прямо на сайте). Сайт уже умел выполнять поиск с учетом наличия товаров в городе и выводить цены. Нам оставалось только превратить запрос к чат-боту в еще один поисковый запрос.

Особенности платформ

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

Схема общения

Т.е. общение между сервером мессенджера и обработчиком чат-бота всегда происходит по надежному протоколу HTTPS.

Ближе всех к разработчикам, несомненно, Telegram — создать «пустого» бота и опубликовать его для всех пользователей мессенджера можно за несколько минут. А вот у самого популярного мессенджера, WhatsApp, пока что закрытое API. Есть неофициальные способы создания чат-бота, но ими пользоваться нужно на свой страх и риск.

Задача заключалась в разработке чат-ботов для 3-х платформ, с которыми ранее уже работали: Алиса, Вконтакте, Facebook. 

В таблице ниже приведены ограничения мессенджеров на отправку текстовых сообщений.


ВКонтакте

Facebook

Алиса

Сообщения

Кол-во символов в сообщении

4096

2000

1024

Кол-во символов в сообщении с прикрепленными кнопками

Неограниченно

640

1024

Обычные кнопки

Кол-во кнопок

10

Неограниченно

Кол-во символов на кнопках

40

125

Можно сделать кнопку ссылкой на сайт?

Нет

Да

Кнопки в сообщении

Кол-во кнопок

3

Неограниченно

Кол-во символов на кнопках

20

50

Можно сделать кнопку ссылкой на сайт?

Да

Да

Вконтакте

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

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

Диалог с чат-ботом ВКонтакте

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

Начало беседы с чат-ботом

Facebook

Аналогично ВКонтакте в Facebook чат-бот представляет собой сообщество. Однако настройка чат-бота и его возможностей производится отдельно в приложениях , которое закрепляется за конкретным сообществом в Facebook.

Чат-бот доступен в Messenger. Вся переписка с сообществом сохраняется и доступна администраторам сообщества.

Диалог с чат-ботом Facebook

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

Первый диалог с чат-ботом

Когда чат-бот находится в разработке он реагирует только на сообщения владельца сообщества и приложения. Это удобно в том случае, если чат-бот подключается и разрабатывается на существующем сообществе. После прохождения модерации (2-12 недель) навыка чат-бот становится доступен всем пользователям.

Яндекс Алиса

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

Диалог с Яндекс Алисой

Настраивается чат-бот очень просто, достаточно задать уникальное имя и url-адрес, на котором расположен скрипт чат-бота.

В процессе разработки навык доступен только разработчику. Модерация и релиз навыка занимает до 3 дней.

Проблемы

Модерации в ВКонтакте и Яндекс Алисе проходит быстро и почти без проблем.

Самый сложный релиз осуществляется в Facebook. Для того, чтобы прикрепить готового чат-бота к сообществу необходимо пройти комплекс мер: существующее сообщество в FB, подтвердить аккаунт в Business Analytics, пройти верификацию компании по предоставленным документам. Этот процесс может занимать несколько месяцев.

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

Чат-бот — это инструмент для вашего бизнеса, который поможет разгрузить сотрудников и уменьшить трудозатраты. Если вы интересуетесь созданием своего чат-бота в ВКонтакте, Телеграме, Алисе или Facebook заполните форму ниже и мы с вами свяжемся.

Оцените статью:

Спасибо, ваш голос успешно добавлен!

Создание чат-бота с помощью службы Azure Bot / Microsoft corporate blog / Habr

Сегодня у нас практическое занятие по созданию чат-ботов с использованием Azure Bot Service и Microsoft QnA Maker. Всего за пару часов практического изучения вы сможете освоить эти технологии. Присоединяйтесь!
Просим обратить внимание

Для лучшего освоения курса стоит отвести на него около двух часов времени. В ходе вас ждет много практики и работы на виртуальной машине. Кроме того, просим заложить время и на настройку инфраструктуры, которая потребуется для прохождения этого модуля (Все пароли для входа в виртуальную машину вы найдете на вкладке «Resources»).


Служба Azure Bot вместе с QnA Maker предоставляют средства разработки, необходимые для создания и публикации интеллектуальных ботов, которые естественным образом взаимодействуют с пользователями с помощью диапазона служб.

В этом модуле вы узнаете, как выполнять следующие задачи:

  • Создание бота веб-приложения Azure для размещения бота.
  • Создание базы знаний, ее заполнение данными и подключение бота к ней.
  • Внедрение ботов в код и выполнение отладки созданных ботов.
  • Публикация ботов и использование непрерывной интеграции для поддержания в актуальном состоянии.
  • Выполнение локальной отладки ботов с помощью Visual Studio Code и эмулятора Microsoft Bot Framework Emulator.

Важно!

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

Создание бота веб-приложения Azure


Первым шагом в создании бота является предоставление места для размещения бота в Azure. Компонент «Веб-приложения Azure» Службы приложений Azure идеально подходит для размещения приложений ботов, а служба Azure Bot предназначена для их подготовки. В этом уроке будет использоваться портал Azure для создания бота веб-приложения Azure.

1. Войдите на портал Azure, открыв portal.azure.com в браузере виртуальной машины.

2. Выберите + Создать ресурс, затем Искусственный интеллект и машинное обучение и Бот веб-приложения.

3. В поле Имя приложения введите имя, например qa-factbot. Это имя должно быть уникальным в пределах Azure. Убедитесь, что рядом с именем отображается зеленая галочка.

4. В разделе Подписка и Группа ресурсов выберите имеющиеся ресурсы.

5. Выберите верное расположение (обычно не требуется менять уже выбранный вариант).

6. Выберите ценовую категорию S1.

7. Затем выберите Шаблон бота. Выберите SDK v3 в качестве версии, Node.js в качестве языка пакета SDK и Вопрос и ответ в качестве типа шаблона. Затем в нижней части колонки нажмите Выбрать.

8. Нажмите План службы приложений или расположение, затем щелкните Создать и после этого создайте план службы приложений с именем «qa-factbot-service-plan» или другим подобным в том же регионе, выбранном на предыдущем шаге. Как только это будет сделано, нажмите Создать в нижней части колонки бота веб-приложения, чтобы начать развертывание.

Примечание

Развертывание обычно занимает две минуты или меньше.


9. После завершения развертывания нажмите Группы ресурсов в ленте слева на портале Azure.

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

Должно отобразиться несколько ресурсов, созданных для вашего бота веб-приложения Azure. Во время развертывания бота веб-приложения Azure произошло несколько событий. Был создан и зарегистрирован бот, создано веб-приложение Azure для его размещения, бот был настроен для работы с Microsoft QnA Maker. Следующий шаг — создать базу знаний с вопросами и ответами с помощью QnA Maker, чтобы наделить бот «интеллектом».

Создание базы знаний с помощью службы Microsoft QnA Maker


QnA Maker входит в пакет Azure Cognitive Services, который включает службы и API-интерфейсы для создания интеллектуальных приложений на основе искусственного интеллекта и машинного обучения. Вместо того, чтобы включать в код бота реакцию на все возможные вопросы пользователей и все необходимые ответы, его можно подключить к базе знаний с вопросами и ответами, созданной в службе QnA Maker. Распространенный сценарий использования — создание базы знаний на основе списка URL-адреса страницы вопросов и ответов, которая позволяет боту отвечать на специализированные вопросы вида «Как найти ключ продукта Windows?» или «Где можно скачать Visual Studio Code?»

В этом упражнении вы примените QnA Maker для создания базы знаний с некоторым набором вопросов, например «Какие команды NFL выиграли больше всего суперкубков?» и «Какой самый крупный город в мире?» Затем вы развернете эту базу знаний в веб-приложении Azure, чтобы она стала доступна через конечную точку HTTPS.

1. Откройте портал QnA Maker, открыв www.qnamaker.ai в браузере виртуальной машины, и выберите Вход, чтобы выполнить вход с использованием той же учетной записи лаборатории, с которой вы входили на портал Azure.

2. Выберите меню «гамбургер» и нажмите Создать базу знаний.

3. Нажмите Создать службу QnA.

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

5. Выберите Использовать существующую в разделе Группа ресурсов, а затем выберите предварительно созданную для этого упражнения группу ресурсов.

6. Выберите расположение из раскрывающегося списка (обычно не требуется менять уже выбранный вариант).

7. Выберите F0 для параметра Ценовая категория управления.

8. Выберите F для параметра Ценовая категория поиска.

9. Убедитесь, что Имя приложения является уникальным в Azure.

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

11. Выберите Группы ресурсов на ленте в левой части портала и откройте предварительно созданную для этого упражнения группу ресурсов. Дождитесь, пока надпись «Идет развертывание» в верхней части колонки сменится строкой «Выполнено успешно», которая обозначает успешное развертывание службы QnA и связанных с ней ресурсов. Если сообщение исчезнет, можно выбрать значок колокольчика в строке меню, чтобы просмотреть состояние. Вы также можете нажать Обновить в верхней части колонки, чтобы обновить состояние развертывания.

12. Вернитесь к разделу Создать базу знаний, открыв www.qnamaker.ai/Create в браузере виртуальной машины, и прокрутите вниз до Шаг 2 для подключения к нашей службе QnA.

13. В разделе Идентификатор каталога Microsoft Azure выберите Размещение Microsoft Learn.

14. Выберите Размещение Microsoft Learn из раскрывающегося списка Имя подписки Azure.

15. В разделе службы Azure QnA выберите службу QnA, имя которой вы указали ранее. Если в списке нет служб, обновите страницу.

16. Затем присвойте базе знаний имя, например «База знаний Factbot».

17. Вопросы и ответы можно вносить в базу знаний QnA Maker вручную или импортировать из списка часто задаваемых вопросов (FAQ), размещенного в Интернете или сохраненного в локальных файлах. Поддерживаются следующие форматы: текстовые файлы с разделителями табуляции, документы Microsoft Word, электронные таблицы Excel и PDF-файлы.

Для демонстрации откройте github.com/MicrosoftDocs/mslearn-build-chat-bot-with-azure-bot-service/blob/master/Factbot.tsv.zip в браузере виртуальной машины и загрузите файл Factbot.tsv.zip. Эта ZIP-папка содержит текстовый файл с именем Factbot.tsv. Извлеките и скопируйте файл на локальный компьютер. Прокрутите вниз страницу портала QnA Maker в браузере виртуальной машины, щелкните + Добавить файл и выберите файл Factbot.tsv. Этот файл содержит 20 вопросов и ответов в текстовом формате с разделителями табуляции.

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

19. Убедитесь, что вопросы и ответы из файла Factbot.tsv появились в базе знаний. Затем щелкните Сохранить и обучить и дождитесь, пока завершится обучение.

20. Нажмите кнопку Тестировать справа от кнопки Сохранить и обучить. Введите в окне сообщения «Hi» (Привет) и нажмите клавишу ВВОД. Убедитесь, что получаете ответ «Welcome to the QnA Factbot» (Вас приветствует бот QnA Factbot), как показано ниже.

21. Введите вопрос «What book has sold the most copies?» (Копий какой книги продано больше всего?) в окно сообщения и нажмите клавишу ВВОД. Какой вы получили ответ?

22. Чтобы закрыть панель тестирования, повторно нажмите кнопку Тестировать.

23. Теперь щелкните Публикация в меню в верхней части страницы, а затем нажмите кнопку Опубликовать в нижней части страницы, чтобы опубликовать созданную базу знаний. Публикация сделает базу знаний доступной в виде конечной точки HTTPS.

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

Следующие части руководства проходите на нашем обновленном ресурсе Microsoft Learn: продолжение.

Структура Чат-бота: алгоритм создания, советы

Автор Игорь Лобода На чтение 6 мин. Просмотров 1.8k. Опубликовано

Структура чат-бота — это возможность наглядно показать и оценить функционал приложения в определенной нише бизнеса.

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

Где разрабатывать структуру чат-бота?

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

Используем следующие сервисы:

  • Xmind;
  • Realtimmeboard;
  • Coggle.
  • и др.

Стартовая информация

Перед началом разработки структуры необходимо собрать определенный пакет информации:

  • Информация о продукте и нише;
  • Информация о компании;
  • Часто задаваемые вопросы клиентов;
  • Акции и бонусы, которые уже функционируют в бизнесе;
  • Чем посетители интересуются на сайте или в социальных сетях, если таковые имеются;
  • Что отталкивает посетителей от покупки или заказа — самые важные параметры;
  • Информация о том, как происходит обработка заявок в бизнесе на данный момент.

«Robochat» — конструктор чат-ботов для Вконтакте

Читайте также: Обзор «Robochat»

Алгоритм разработки

  1. Продумать концепцию чат-бота (общую идею). Будет ли этот бот — сервисом для регулярного взаимодействия (личным кабинетом с системой лояльности), или информационным ботом (где мы можем только получить информацию о компании и услугах, а также контакты), или же гибридным вариантом с полным функционалом.Возможны и другие варианты, например, бот, который напрямую участвует в процессе предоставления услуги клиентам (бот для обучающего учреждения, который взаимодействует с учениками и содержит разнообразные тестовые задания, а также обучающую информацию).
  2. Поставить себя на место клиента. Выписать все возможные потребности, которые могут у него возникнуть во время касания с компанией.
  3. Разделить эти проблемы на несколько разделов (Информационный раздел, личный кабинет, Калькулятор стоимости и другие, которые удастся выделить.)
  4. Приступить к реализации и продумыванию ответов бота на каждую потребность. Если существует необходимость решить проблему пользователя в два-три шага — это необходимо делать, главное грамотно информировать фразами бота.Например, проблема “Оставить заявку на покупку”. В таком случае пользователю предлагается 3 шага : Указать “Имя > Наименование желаемого продукта > Способ доставки”. Мы это прописываем в схеме, каждый шаг и фразу, которую бот говорит и предлагает на каждом.
  5. Проработка переадресации на другие разделы. Может возникнуть ситуация, когда нужно клиента отправить на другой раздел, чтобы он мог дальше удобно изучать информаци. Это мы тоже указываем в схеме. Например, пользователь перешел в раздел “О компании”, а в конце, после текста ему предлагается 2 варианта взаимодействия “Ознакомиться с контактами компании” и “Ознакомиться с нашими услугами”, которые переадресуют его на другие разделы бота.

  1. Продумать систему лояльности клиентов (акционную и рекомендательную систему). Например, приведи 3 людей в чат-бот и получи 10% на следующую покупку. Данная система — основная точка развития бота. Если предложить что-то действительно ценное, то пользователи сами начнут раскручивать ваше приложение. Никому не составит труда скинуть ссылку на бота друзьям, чтобы получить ценный подарок.
  2. Очень важно иметь точки входа (выход на связь с компанией) для новых клиентов, которые приходят в чат-бот. Их должно быть несколько и в правильных местах, чтобы это было ненавязчиво и удобно.Например, сделать пункт “Рассчитать стоимость услуги” и в конце предложить связаться в удобное время. Или, например, пункт “Посмотреть фото наших работ” — бот скидывает несколько фото и спрашивает: “Хотите сделаем Вам также?”. Это интересно и затягивает потенциального клиента в процесс и работает лучше, чем втупую заходить с вопросом “Оставить заявку”. Необходимо этот момент также проработать и указать в структуре.
  3. Продумать систему уведомлений, которые будут приходить всем людям, которые добавились в чат-бота. Эта система — одна из основных и важных частей работы чат-бота. Попадая в чат-бот, клиент попадает в вашу подписную базу, что дает возможность рассылать письма прямо в личку каждому. Это следующий уровень e-mail-маркетинга. Это опциональная вещь, поэтому детально прописывать не стоит, нужно просто указать направления.Например, “уведомления о скидках”, “уведомления об акциях” и т.д..
  4. Добавить полуавтоматические элементы. Это тот функционал, где уведомления о решениях пользователей будут приходит непосредственно руководителю. Например, отзывы о работе сотрудников, которые будут поступать лично владельцу компании, заказы особых услуг или вопросы т.д. В схеме нужно будет указать, куда будет поступать введенная пользователем информация.

Советы

  • Не углубляться в технические детали в структуре. Эти элементы будут лишними. Схема должна показывать весь функционал только в теоретическом варианте;
  • Сделать идеальную схему изначально невозможно, поэтому нужно готовиться к дальнейшей доработке функционала;
  • Необходимо обсуждать схему с владельцем бизнеса и формировать общее мнение. Владелец, как никто другой, знает своих клиентов и их желания и потребности;
  • Оформляйте пункты бота цифрами, так будет удобнее ориентироваться.
  • Прописывайте ответы чат-бота — именно то, что будет говорить чат-бот, а не какие варианты ответов будет предлагать для пользователя (варианты должны идти отдельными блоками, как указано на примере). Они должны быть приятны, интересны, как будто вы лично говорите с клиентом.
  • Обязательно изучайте информацию о бизнесе перед разработкой структуры, иначе можно собрать совсем неподходящий функционал.

Если Вы выполните данные рекомендации и ознакомитесь с примерами, которые мы прикрепили, то сможете собрать свою схему!

Примеры

Структура чат-бота для гостевого дома (отеля). Здесь можно узнать информацию о свободных номерах и ознакомиться с фотографиями. В структуре реализован личный кабинет с бонусной программой, бронирование номеров и часто задаваемые вопросы (FAQ): Структура чат-бота для компании по установке натяжных потолков. В структуре присутствует удобный калькулятор расчета стоимости с выводом на заявку, личный кабинет с бонусной системой в виде накопления баллов за определенные действия (фото в инстаграм, отзыв, приглашение друзей). Также есть информационный блок, где пользователь сможет узнать информацию о компании и примерах работ. Структура информационного чат-бот, который призван ответить на вопрос «Что такое чат-бот и зачем он нужен для моей компании?» и вывести человека на заказ услуги, если он понял ценность чат-бота для своей ниши. В бота вшит тест с подарочным материалом, а также примеры применения из разных ниш:

Рассчитай стоимость чат-бота «под ключ»

Разработка чат-бота с заданной личностью. Лекция в Яндексе / Яндекс corporate blog / Habr

Важная особенность задач по машинному обучению заключается в том, что одинаково хороший результат достижим разными методами. Это и придаёт азарт ML-конкурсам: даже обладая другими компетенциями, чем у заведомо сильного соперника, вы всё равно можете выиграть. Команды Tensorborne и Neurobotics имели практически равные шансы на победу в хакатоне DeepHack и в итоге заняли первые два места. На тренировке Яндекса представители обеих команд выступили с одним объёмным докладом. В расшифровке вас ждут детальные разборы решений и советы начинающим конкурсантам.


И конечно, берите отпуск на хакатон. Когда вы участвуете в недельном хакатоне и одновременно еще и работаете, это плохо. Вы приходите в 7 вечера, немножко поработавший, садитесь и компилите Docker с TensorFlow, Keras, чтобы все это запустилось на каких-то удаленных серверах, к которым у вас даже доступа нет. Где-то в два ночи вы ловите катарсис, и у вас это работает — без Docker, без всего, потому что вы поняли, что можно и так.

Виталий Давыдов:
— Всем привет! У нас должно было быть два доклада, но мы решили их объединить в один большой, потому что рассказываем про первое и второе место в соревновании DeepHack. Мы представляем две команды. Наша команда Tensorborne заняла 2 место, а команда Григория Neurobotics — первое.


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

Прежде чем говорить про DeepHack, надо отметить, что он является небольшим подмножеством другого очень большого глобального соревнования ConvAI2, который в прошлом году запустил Facebook. В этом году вторая итерация. В какой-то момент Facebook проспонсировал МФТИ, и на базе лаборатории Физтеха создалось соревнование DeepHack.


Подробнее про сам ConvAI. Какую проблему он пытается решить? Он специализируется на диалоговых системах. Проблема диалоговых систем в том, что не существует единой оценочной тулзы, evaluation tool, чтобы понять качество диалогов. Это вещь очень субъективная от человека к человеку: кому-то разговор может понравиться, кому-то нет. Общая глобальная задача ConvAI — придумать общую единую метрику для оценивания диалогов, которой пока нет. Приз — 20 тыс. долларов на AWS Mechanical Turk. Это не кредиты на Amazon, это кредиты только на Mechanical Turk, который по факту является аналогом Яндекс.Толоки. Это краудсорсинговый сервис, который позволяет вам производить разметку на данных.

Задача, которая строится на ConvAI, — построить chit-chat-бота, с которым можно производить какой-то диалог. Они выбрали три метрики: Perplexity, Hits@1 и F1. Дальше я покажу таблицу, которая была на момент нашего сабмита.

Evaluation, по которому они пытались это делать, проходил в три этапа. Первый этап — автоматические метрики, далее — оценка на AWS Mechanical Turk, и дальше живой чат с волонтерами.

Так как ConvAI спонсируется Facebook, он активно продвигает свою библиотеку для создания диалоговых систем ParlAI. Она довольно сложная, но думаю, все участники использовали эту библиотеку. Мы довольно долго с ней разбирались, она не совместима с Python 3.6, например, и с ней есть ряд проблем.

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

Но здесь есть три базовых бэйзлайна. Чтобы отобраться на DeepHack, надо было пробить этот бэйзлайн, и топ-10 лучших команд попадали в финал. По секрету скажу, что решения отправили всего 8 команд, и все вышли в финал. Это было не очень сложно.

Задача DeepHack была чуть более понятная и прямолинейная. Нам надо было опять построить робота-болталку, но который будет эмулировать какую-то заданную личность. То есть роботу на вход подавалось описание какой-то личности, и во время разговора с ним он должен был ее раскрыть. Приз был довольно интересный — поездка на NIPS этой осенью, которая полностью спонсируется.

Метрика, в отличие от ConvAI, уже была другой. Было две метрики, и суммарная метрика — взвешенная между этими двумя. Первая метрика — overall quality, оценка того, насколько бот адекватно отвечал, насколько с ним было интересно общаться, не писал ли он какую-то чушь и т. д. Вторая метрика — role-playing, либо 0, либо 1. Она означает, попал ли бот в то описание, которое ему дали. Человек, который общается с ботом, описание не видит. Evaluation происходил в Telegram, то есть был единый Telegram-бот, и когда пользователь начинал с ним общаться, он попадал на какого-то случайного бота из всех сабмитов, чтобы было честно. Яндекс и МФТИ, видимо, налили немного трафика туда, и было в районе 10 тыс. диалогов, насколько помню.

Про квалификационный раунд уже сказал. Финал был очный. Он проходил в течение семи дней работы в МФТИ, был предоставлен какой-то кластер, место, мы там сидели и работали. Evaluation был по факту каждый день, и финальный score, оценка бота в конце, высчитывался таким образом. Соревнование начиналось в понедельник, первый сабмит был во вторник, и evaluation происходил на следующий день. Решение, которое вы отправили во вторник, эвальюировалось в среду с весом 1,5. То, что вы отправили в среду, — с весом 1,4 и т. д.

Про датасет, который Facebook дал для обучения. Он называется Persona-Chat и представляет из себя описание двух личностей и какой-то набор диалогов. Есть описание первой личности и второй. В процессе описания диалога они пытаются друг друга раскрыть. Это все, что было дано. Однако, как всегда, в соревновании не запрещалось пользоваться другими, сторонними датасетами.

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

Григорий расскажет про первое место.

Григорий Рашков:
— Я бы хотел рассказать про наш опыт участия в соревновании, нашу стратегию и наше решение.

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

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

И третье — отсутствие валидации. Участники не могли внести небольшое изменение и сразу получить фидбек.

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


Ссылка со слайда

Коротко про бэйзлайн: Seq2Seq плюс attention, который немного адаптирован под данную конкретную задачу. Как именно? На вход подаются фразу, embedding берется из GloVe, но дальше считается представление каждой фразы как взвешенные embedding. Веса выбираются исходя из обратной частоты слова. Чем более редко встречающееся слово попадается, тем больший вес оно вносит.


Ссылка со слайда

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

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


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

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


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

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

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

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


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


Ссылка со слайда

Возникает интересный локальный минимум у бота: он очень хорошо реагирует на любые оскорбления, он с ними соглашается, и чтобы это пофиксить, мы решили воспользоваться имеющимся Kaggle конкурсом на toxic comments analyzer, написали классификатор очень простенький, тоже с RNN вниманием. В том датасете были следующие классы, перекрывающиеся: оскорбления, угрозы… Мы под это решили не учить отдельно модельку, которая будет говорить, потому что такая проблема встречалась, но она была не очень частой. Поэтому мы просто написали какую-то затычку, которую отвечал бот, и все были довольны.


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

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

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

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

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

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


Наша команда.

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

Сергей Колесников:
— Меня зовут Сергей Колесников, я буду представлять решение Tensorborne.

Мы придумали красивое название, прошли на конкурс, придумали много разных штук, чтобы выпустить две статьи после этого, но не выиграли хакатон. Поэтому и называться это будет: «Как не выиграть хакатон, но все-таки опубликовать чертовы две статьи». Академики, сэр.

Особенности конкурса, в котором мы участвовали, превзошли нашу мотивацию. Ввиду того, что оценка производилась ежедневно, то посылки приходилось делать также ежедневно, а конечный reward определялся, как мы любим в RL, дисконтированным суммированием. Все это переросло в то, что нам надо было каждый день отсылать хоть что-то, чтобы она работала, и мы получали хоть какой-то score. В итоге это и вправду переросло в то, что хочешь — не хочешь, а приходилось грести.

Что же у нас было? Превью на всю неделю.

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

Изначально нас собралось пятеро, все хорошие академичные выпускники или около того Физтеха, поэтому в понедельник мы пришли и накидали много предложений, идей, что можно попробовать, какие deep learning модельки попробовать. Мы, правда, не экспериментировали с GAN, потому что уже экспериментировали с ними для текстов и это не работает, поэтому взяли что-то более простое, к тому же были очень похожие конкурсы и у нас были pretrain модельки. Во вторник мы даже смогли запустить что-то на deep learning, ML был везде, где можно, мы запускали замечательные докеры с поддержкой GPU и прочего для Tensorflow и Keras, нам отдельную медаль надо дать за это, ввиду того, что это не так тривиально, как хотелось бы.

По результатам вторника — они были многообещающими, и мы решили немножко улучшить наш ML небольшими эвристиками и прочим, и провалились на седьмое место. Но благодаря нашим товарищам по команде, кто-то нашел ElasticSearch, и попробовали. Был очень неловкий момент, когда ElasticSearch заработал отлично, а DL-модельки и ML, и прочее было немножко не столь робастным. Конец конкурса близился. И как было замечено предыдущим докладчиком, мы решили погрести в ту сторону, что работает. Взяли ElasticSearch, небольшие эвристики и подумали, что good enough, и правда good enough ввиду того, что второе место мы заняли.

Подробнее. Реально DL-решений было несколько. Первое DL-решение было довольно простым. Кто помнит, в позапрошлом или прошлом году был конкурс Quora paraphrase detection, а в этом году проходил конкурс от Яндекса для Алисы по построению диалогов и прочему. Можно заметить, что задачи там очень близкие. В первом требовалось сказать, парафразы ли эти две фразы, а во втором надо было продолжить диалог. Мы подумали, что раз мы разрабатываем диалоговые системы, то давайте мы тоже просто будем хорошо продолжать диалог. И это отлично работало, диалог с Quora был очень даже ничего.

В основном все это выглядело так, что у нас был некоторый encoder, обычно мы все тренируем на обычных наших RNN, а лучше LSTM с attention и прочим. А дальше мы стандартно использовали либо CosaineEmbedding Loss, представленный ниже на слайде, либо другой embedding loss по типу Tripler Loss или чего-то другого, который эмбеддинги парафраз или ответов на конкретный диалог сближает, а не парафраз наоборот отдаляет, и прочее. Это было первое решение, именно оно было на Tensorflow, Keras, оно готовое, мы попробовали, и было довольно неплохо.

Другое решение было рождено за дня два хакатона по вечерам. Есть замечательный парень Джереми Ховард, он пропагандирует DL и ML для всех, у него есть замечательные два курса, которые вводят вас в курс этого дела и прочего, и под этот курс он написал свою либу FastAI. Все это работает на PyTorch, и во многом даже переписывает PyTorch, это один из минусов этой либы. Но из плюсов, Джереми к НЛП имеет мало отношения, в этом году в марте с еще одним студентом выпустили статью, где они обучили LSTM по всем лучшим практикам в замечательном FastAI, с многими трюками, которые он пропагандирует в своем курсе, и получили SOTA практически для всего.

Так как я являюсь небольшим евангелистом PyTorch, я все-таки смог выкорчевать данную модельку из FastAI, запихнуть, уже можно сказать, в свой фреймворк для PyTorch, и даже обучить все это дело под эту задачу. В основном у нас был некий диалоговый контекст, по сути, это даже если у нас было несколько предложений, вы просто конкатинируете это в одно здоровенное предложение. А дальше у нас был answer, некоторое предложение. Все это можно подать в тот самый кодировщик из FastAI, называется Universal Language Model — а дальше сложно — Encoder.

После этого мы получаем контекст, который, положим, состоит из 1 до Т таймстепов, как мы любим в seq2seq. Дальше получается после энкодера вырождается Т таких последовательностей. Энкодер энкодит каждое предложение и переводит каждое слово в некий вектор, и дальше используется специальный пулинг, который был предложен в FastAI — Concat poolling. В чем суть? Мы берем последнее представление предложения как в обычных seq2seq, которые даже без attention. Дальше берем maxpool и minpool от всех последовательностей этих векторов, и получаем новый вектор размерностью в три раза больше, который и энкодит все наше предложение.

На самом деле, даже если забыть про этот хакатон, этот замечательный пулинг работает просто на ура, и даже в картиночных конкурсах, если у вас объединен maxpool и minpool, работает просто отлично. После этого мы заэнкодили контекст, и наш возможный ответ — в некоторое представление H, Hc и Ha. Эти вектора передаются на дополнительные линейные модели, обычные типичные feedforward сеточки, и получаются некоторые эмбединги. После того, как мы получили некоторые эмбединги, мы можем учить, по сути, любой metric learning. В нашем случае мы использовали самый простой способ — CosineEmbedding Loss, он доступен в PyTorch.

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

Это наше DL-решение. ElasticSearch, эвристики и прочее.

Что оказалось более робастным? Было очень обидно, когда в какой-то момент ElasticSearch заработал лучше. Где-то в среду или в четверг нами был распарсен все-таки Persona Dataset ввиду того, что формат данных, которые предоставлял Facebook, скажем так, не очень удобный, но распарсить его все-таки возможно. И мы его перевели во что-то близкое или понятное нам. У нас был диалоговый контекст из массивов предложений, у нас был контекст Персоны, опять же, массив предложений, и у нас был правильный ответ ввиду того, что Persona Dataset содержал как раз эти нужные диалоги, в которых замечательные люди на Amazon Mechanical Turk долго обсуждали и пытались выяснить, кто же кто.

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

Однако хотелось чего-то большего. У нас были хорошие показатели по диалоговому скору, однако по скору Persona все было не так гладко, ввиду того, что в нашей обучающей выборке, по сути, не было тех персон, на которых проводился evaluation. Пришло время замечательных heuristic solutions.

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

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

Также у нас был небольшой dirty hack. Когда пришел последний день, мы решили поставить все на кон и использовать то, что разрешалось рассказывать о своей персоне меньше пентаграмм. Поэтому нашу персону можно было легко понять. Опять же — пришлось использовать много эвристик, чтобы не говорить об этом в лоб.

Какие итоги? Неприятный итог лично для меня состоит в том, что иногда не-DL-решение работает намного робастнее и стабильнее и лучше, чем замечательный DL, который мы попробовали изначально. Дело в том, что вам требуется время, чтобы много чего протюнить, проверить и прочее. А в нашем случае у нас не было никакой валидации. По сути, мы отправляли что-то, обычно часа в два ночи, и надеялись, что это полетит. К сожалению, был один слайд, где наша команда оказалась внизу. Это когда оно не полетело. Мы отправили, оно упало, и мы потеряли день. После этого на DL мы начали смотреть немножко с укором ввиду того, что ElasticSearch объективно работает.

Можно видеть, как эвристики увеличивали именно personality score. Немного магии, немного иф-элсов, и у вас практически 0,25–0,3 улучшения, что дает большой буст на итоговый скор. К нашей печали, это ухудшает диалоговое значение, потому что иф-элсы всегда ухудшают ваше решение.

Примеры. По поводу первой эвристики — в конце первой строки мы нагло и ужасно используем правило организаторов, но черт возьми, вечер пятницы, а ты сидишь и отправляешь в Docker ElasticSearch, с которой ты познакомился на этой неделе. Мы делали все, что могли. Следующая эвристика. Все помнят замечательный сценарий диалог. Мы долго шли к Also, try to guess… Он спрашивает, и ты говоришь — нет, funny you. И замечательно, что эта комбинация настолько general, что работала. Нам было очень хорошо, особенно в два часа ночи, когда мы это отправили.

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

Что осталось за кадром и что надо бы сделать? ConvAI еще не близко, он будет только к NIPS, и мы даже можем попытаться сделать что-то более приличное.

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

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

И я не знаю, почему мы не взяли бэйзлайн. Это историческая несправедливость, поскольку мы прошли на этот конкурс благодаря бэйзлайну. Никто из нас не знает, почему мы не попробовали его дальше. Просто мы такие — да у нас pre-trained-модельки (неразборчиво — прим. ред.), используем. Много вопросов.

Конечно, в наших proposals лично я говорил, что я сделаю RL bandits и заэнсамблю за два дня. Под это лучше не коммититься, не выйдет. Все это можно улучшить — бот и правда будет намного лучше. И возможно, надо было улучшить эвристики. Кажется, что правильно добавленные эвристики, даже с теми же замечательными смайлами и прочим, и возможно, правильные реакции на всякие toxic-комменты дают еще один небольшой буст. Это кажется логичным.

На хакатон вы должны идти с одной целью — взять и победить. В реальности в нашей команде также был Денис Антюхов, и мы участвовали с ним в DeepHacks еще года два назад. Мы знаем NLP, и на этот DeepHack мы пришли с мыслью, цитирую, «опустить лидерборд». Не опустили, к сожалению. Но цель кажется очень логичной. Если вы хотите участвовать в конкурсах, хакатонах, кегглах, в чем угодно, то вы должны идти с целью не просто поучаствовать, а победить и порвать всех.

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

Начинайте с бэйзлайнов! Серьезно. Даже не надо использовать свои pre-trained-модельки. Начать с бэйзлайнов, возможно, лучше.

И конечно, берите отпуск на хакатон. Когда вы участвуете в недельном хакатоне и одновременно еще и работаете, это плохо. Вы приходите в 7 вечера, немножко поработавший, садитесь и компилите Docker с TensorFlow, Keras, чтобы все это запустилось на каких-то удаленных серверах, к которым у вас даже доступа нет. Где-то в два ночи вы ловите катарсис, и у вас это работает — без Docker, без всего, потому что вы поняли, что можно и так.

Кажется, что если вы участвуете в большом конкурсе, то все-таки выделите под него чуть больше времени, чем сколько можно не спать в неделю, и участвуйте. Идите и выигрывайте. Спасибо!

основы / RUVDS.com corporate blog / Habr

Чат-боты, поддерживающие общение с человеком на естественном языке, весьма популярны и востребованы. Сегодня мы хотим поделиться с вами первой частью перевода материала о разработке чат-ботов с помощью ChatScript (CS), написанного сотрудником WebbyLab на основе опыта, приобретённого им в ходе работы над одним из недавних проектов компании. Здесь, в частности, речь пойдёт об основах работы с CS, рассмотренных с точки зрения программиста-практика. ChatScript хорош тем, что на нём можно сравнительно просто разрабатывать масштабные системы с возможностями искусственного интеллекта, и тем, что его несложно интегрировать в проекты, написанные на JavaScript.


Постановка задачи


Однажды перед компанией, где я работаю, WebbyLab, встала задача по разработке интеллектуального чат-бота для страховой компании из США. На момент начала работ у клиента уже был пользовательский интерфейс для чата в Facebook. Нам нужно было сделать так, чтобы бот, который «сидит» за этим интерфейсом, понимал бы сообщения пользователей и осмысленно на них отвечал, анализируя фразы и извлекая нужную ему информацию из введённых данных. Мы решили разделить высказывания пользователей по их возможным намерениям и реализовать механизм распознавания этих намерений на основе набора фраз. Кроме того, нужно было учесть и то, что намерения могут содержать в себе различные параметры (например — площадь дома, дата, модель автомобиля), которые чат-боту тоже нужно было распознавать. В качестве платформы для реализации проекта был выбран ChatScript.

ChatScript


Для начала взглянем поближе на ChatScript. Это движок для создания чат-ботов, программы, созданные на котором, четыре раза получали премию Лёбнера. Его разработали Сью и Брюс Уилкокс. CS основан на правилах и работа с ним может напоминать декларативный подход к программированию, похожий на написание конфигурационного файла или грамматики для интерпретатора. Впрочем, работа с CS ближе к императивному программированию, так как тут, кроме того, приходится использовать команды для того, чтобы сообщить движку о том, как реагировать на то или иное сообщение. CS написан на C++, у движка имеются бинарные сборки для платформ Windows, Linux и MacOS.

Разработка простого бота


Лучший способ освоить программный инструмент заключается в том, чтобы опробовать его на практике, создать с его помощью нечто простое и лёгкое для понимания. Именно таким проектом мы сейчас и займёмся. Кроме того, советую посмотреть эту статью о и пройти официальное учебное руководство по ChatScript.

Прежде всего стоит подготовить удобное рабочее место. Для этого советую установить инструменты разработки, поддерживающие подсветку синтаксиса CS. Вот плагины для Sublime Text 3, Visual Studio Code и Atom. Я использовал Sublime, так как иногда нужно было открывать огромные файлы, а этот редактор быстро справляется с подобной задачей, однако вы можете выбрать тот редактор, который нравится именно вам.

Для того, чтобы разъяснить базовые вещи, я рассмотрю пошаговый пример разработки действующего чат-бота. В моём примере используется Ubuntu 16.04 и CS 7.4., но вы можете пользоваться любой другой поддерживаемой платформой.

1. Клонируем репозиторий CS с GitHub:

git clone https://github.com/bwilcox-1234/ChatScript.git

2. Перейдём в директорию ChatScript и создадим папку для чат-бота с файлом для основных топиков (о том, что это такое, мы поговорим ниже), и с файлом filesfood.txt, который содержит список топиков, включаемых в приложение:
bash

cd ChatScript/RAWDATA

mkdir FOOD

touch FOOD/food.top

touch filesfood.txt

3. Скопируем файл simplecontrol.top из RAWDATA/HARRY в папку FOOD. Это — скрипт, необходимый для взаимодействия с ботом. Тут, хотя это и необязательно, можно поменять значение переменной $botprompt в 9-й строке файла simplecontrol.top на строку, которая будет подставляться перед каждым сообщением бота. Однако, можно оставить всё как есть (по умолчанию там стоит HARRY), так как на поведение бота это не влияет. В моём примере я использую следующую настройку этой переменной: $botprompt = ^"fastfood>.
bash

cp HARRY/simplecontrol.top FOOD/simplecontrol.top

4. Добавим следующий код в файл food.top:
topic: ~fastfood keep repeat []

t: Hello in our online fastfood. Please make your order.

u: BURGER (I [want need take] _[burger potato ice-cream])

  $order = _0

  Okay, you want $order . Something else?

5. Добавим в файл filesfood.txt список файлов, которые будут использоваться при сборке бота:
RAWDATA/FOOD/simplecontrol.top

RAWDATA/FOOD/food.top

6. И, наконец, соберём и запустим бота. Для этого надо выполнить следующую команду из директории ChatScript:
./BINARIES/ChatScript local

7. На данном этапе можно выбрать любое имя пользователя. Далее, в консоли CS, надо выполнить две команды (первая собирает базовый уровень чат-бота, вторая настраивает его на конкретную тематику):
:build 0

:build food

После выполнения всех этих шагов у нас окажется работающий чат-бот. В настоящий момент он понимает лишь несколько фраз (вроде «I need a burger» и «I want ice-cream»), но его можно расширять, добавляя новые правила и топики. После любого изменения файла food.top нужно снова выполнить команду :build food. Ниже мы поговорим подробнее о синтаксисе и конструкциях, использованных в этом примере.

Основные конструкции ChatScript


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

▍Топики


Топик (topic) — это набор правил, которые предполагается использовать совместно. Если предложить системе задействовать конкретный топик, то, до тех пор, пока с ним работают, действовать будут лишь правила из этого топика. Топики объявляют с использованием ключевого слова (topic:), за которым следует имя, начинающееся со знака «~» (~fastfood) и список функций (keep repeat), которые должны использоваться для всех правил внутри топика (функции keep и repeat нужны для возврата к этому топику после вызова каждого правила внутри него). В конце объявления идут квадратные скобки — []:
topic: ~fastfood keep repeat []

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

▍Правила


Правило (rule) — это вызов действия при совпадении шаблона внутри него с данными, отправленными чат-боту. Правила нужно размещать после объявления топиков.
u: BURGER (I want ari-burger) Okay, your order is hamburger

Описания правил обычно включают в себя тип (u:), метку (например — BURGER; это необязательно, но полезно для целей отладки и самодокументирования кода), шаблон (всё, что находится в скобках). Описание правила, кроме того, можно разделить на несколько строк для того, чтобы улучшить читаемость кода. CS не обращает внимание на переводы строки, признаком окончания правила является объявление нового правила или топика. В правиле можно пользоваться командой перехода к другому топику — функцией ^respond:
u: BURGER (I want ari-burger)

   ^respond(~answers)

В данном случае входные данные будут обработаны правилами из топика, переданного функции ^respond. Этот подход может дать нам возможность делить CS-скрипты на части, или, например, помещать форматирование ответов для фраз в отдельные топики.

▍Переменные и работа с памятью


Переменные в CS — это механизм для хранения данных, введённых пользователем. Существуют переменные для краткосрочного хранения информации — их значения очищаются после выхода из шаблонов, и пользовательские переменные, долгосрочные хранилища информации, которые хранят значения до тех пор, пока их не очистят. Вот пример кода правила, в котором используются краткосрочные переменные:
u: ORDER (I want _)

   $order = _0

   Okay, your order is $order

Знак подчёркивания указывает на краткосрочную переменную (можно задать — сколько именно слов нужно запомнить в такой переменной, используя, например, конструкцию _*, что соответствует всем словам, или _*2, что соответствует двум словам, и так далее). В результате, если сработает вышеприведённый код, слово из введённых данных, которое идёт после «I want», будет сохранено в кратковременной памяти. Для того, чтобы получить к нему доступ, во второй строке используется конструкция _0. Шаблон может включать в себя столько подобных переменных, сколько нужно (обычно — не более 20, но этого, как правило, вполне достаточно), в то время как получение значений из них выполняется с использованием имён, состоящих из знака подчёркивания и порядкового номера совпадения внутри шаблона. В данном примере $order — это пользовательская переменная, в которую записано то, что хранится в _0.

▍Шаблоны


Шаблон (pattern) используется для описания порядка и набора слов, появление которых ожидается в том, что будет вводить пользователь, общаясь с ботом. На мой взгляд, весьма примечательная возможность шаблонов CS заключается в том, что при их описании не нужно добавлять все формы каждого слова. В системе есть встроенная поддержка механизма, в ходе работы которого в шаблоне, включающем в себя лишь одну форму слова, могут быть найдены все формы этого слова.

Например, возьмём глагол «be». Добавление его в шаблон так же включит в него этот глагол во всех его формах: am, is, are, was, were, been. Однако, для обработки данных, содержащих вспомогательные глаголы (will, have, do), их надо добавлять в явном виде — CS может автоматически обрабатывать разные формы только для отдельных слов. Для этой цели я советую использовать ещё одну возможность шаблонов — необязательное слово в фигурных скобках:

u: BURGER (I {will} take _burger)

То же самое касается существительных и местоимений — достаточно добавить слово в именительном падеже единственного числа, после чего CS будет искать совпадения для всех вариантов слова, используя свои внутренние механизмы. В шаблонах можно также расширять варианты фраз, которые соответствуют некоему высказыванию, используя наборы слов в определённых позициях шаблона. Расширяя наш пример, мы можем добавить в него следующее:
u: BURGER (I {will} [want need take] [_burger hamburger potato ice-cream])

   $order = _0

   Okay, your order is $order

Данное правило будет соответствовать всем предложениям, введённым пользователем, с комбинациями указанных слов (например — «I want a hamburger», «I will take a potato», «I need ice-cream»). Ещё одна важная особенность работы мемоизации, описания которой я не нашёл в официальной документации к CS, заключается в том, как краткосрочные переменные работают в наборах (если найдёте эту тему в документации — дайте знать пожалуйста). На самом деле, в подобной ситуации в краткосрочной памяти, в переменной _0 будет сохранено любое совпавшее слово из набора. Пользовательская переменная $order, в любом случае, когда будет обнаружено совпадение, получит некое значение.

Кроме того, можно контролировать начало и конец введённых пользователем фраз, используя знаки < и >:

u: BURGER (< I {will} [want need take] [_burger hamburger potato ice-cream] >)

Внутри шаблонов, на самом деле, можно делать ещё много всего интересного. Например — проверять значения на соответствие каким-то критериям. Например, вот что можно сделать, если внутри некоего диапазона нас интересуют лишь цифры:
u: OLD_ENOUGH (I be _~number _0>21 _0<120)

   You are old enough for this.

u: TOO_YOUNG (I be _~number _0<21)

   $missed_age = 21 - _0

   You are too young for this, come after $missed_age years.

▍Концепты


Концепт (concept) — это набор слов или комбинаций слов, привязанных к одному ключевому слову (имени концепта). Объявление концептов похоже на объявление топиков. Список слов, относящихся к концепту, приводится в квадратных скобках:
concept: ~food_type [burger potato salad ice-cream]

После объявления концепта его можно использовать как псевдоним в правилах вроде этого (теперь наш шаблон обнаружит совпадения только для слов, заданных в концепте ~food_type):
u: BURGER (I want _~food_type)

 $order = _0

 Okay, your order is $order

Более того, одни концепты можно вкладывать в другие, создавая дополнительный уровень абстракции, группируя разные наборы слов в одном родительском концепте:
concept: ~dessert [ice-cream sweets cookie]

concept: ~burger [burger hamburger cheeseburger vegeterainburger]

concept: ~food_type [~burger ~dessert potato salad]

Если нужно выяснить, к какому именно концепту принадлежит слово, с которым обнаружено совпадение, можно использовать ключевое слово pattern. В следующем примере значение, сохранённое в переменной $drink проверяется на предмет его принадлежности к концепту ~alcohol. Для этой цели мы используем ключевое слово pattern и знак ? в выражении if, разделяя им то, что мы проверяем, и целевое значение концепта (CS поддерживает конструкции if-else):
concept: ~drink_type [~alcohol ~non_alcohol]

concept: ~alcohol [rum gean wiskey vodka]

concept: ~non_alcohol [cola juice milk water]

u: DRINK (^want(_~drink_type))

   $drink = _0

   if (pattern $drink?~alcohol) {

       ^respond(~age_checker)

   } else {

       Ok, take and drink your $drink .

   }

Если нужно находить совпадения не только с отдельными словами пользовательского ввода, но и с комбинациями слов, их тоже можно добавить в концепт, заключив в кавычки, или используя знаки подчёркивания между разделяемыми словами в одной фразе (этот подход также используется, когда нужно найти совпадения со знаками препинания):
concept: ~vegburger ["vegeterian burger" "vegeterian’s burger" vegan_burger vegan_’s_burger]

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

Ещё одна интересная возможность CS заключается в наличии стандартных концептов, определённых на уровне движка. Они позволяют пользоваться уже подготовленными наборами для наиболее часто используемых в естественном языке фраз и отдельных слов с одинаковым или схожим значением. Среди них — концепты ~yes и ~no, включающие в себя фразы, которые могут быть интерпретированы в естественном языке как положительные и отрицательные. Например, в концепте ~yes имеются такие слова и фразы, как yes, yeah, ok, okay, sure, of_course, alright, и многие другие (всего 183). В концепте ~no имеется 138 соответствующих слов и фраз. Вот ещё некоторые концепты, которые пригодились нам при работе над проектом:

  • ~number — помогает искать совпадения с числами.
  • ~yearnumber — является подмножеством ~number, которое содержит только значения от 999 до 10000.
  • ~dateinfo — помогает находить в тексте даты, используя формат записи со слэшем. Например mm_dd_yy или mm_dd_yyyy будут распознаны как строки «mm / dd / yy» или «mm / dd / yyyy».
  • ~timeword — при использовании этого концепта, например, для «1 July 2017» и для «July 1 2017» будет возвращено «July 1 2017». Кроме того, этот концепт включает в себя огромный набор слов, связанных со временем, вроде second, yesterday, already, и так далее).

Вот раздел документации CS, где можно найти сведения обо всех встроенных концептах.

Если, по какой-то причине, вам нужно расширить существующие стандартные концепты, вы можете добавлять записи в файл LIVEDATA_ENGLISH_SUBSTITUTES/interjections.txt:

<roger_that> ~yes

После этого достаточно перезапустить движок ChatScript и фраза «roger that» будет добавлена в концепт ~yes. Угловые скобки в начале и в конце фразы означают, что совпадением будут считаться только эти два слова, и ничего больше.

Кроме того, существующие концепты можно расширить другим путём — новые значения в них можно добавлять, используя ключевое слово MORE:

concept: ~food [burger potato]

concept: ~food MORE [ice-cream]

▍Макросы


Для того, чтобы обеспечить повторное использование кода, в CS имеются макросы — функции, которые разрабатывает программист, вызываемые для формирования выходных данных или для использования их в шаблонах. В нашем проекте используется JSON, в результате выходные данные должны быть соответствующим образом отформатированы для того, чтобы их можно было передать в класс-обёртку JS. Для этой цели я решил подготовить строку, которую можно легко разобрать в JavaScript. Каждый раз, когда система генерирует некие выходные данные, я преобразую их в JSON-строку. Однако, в CS есть и методы для работы с JSON. Если задействовать всё это с использованием outputmacro, мы получим простой и удобный способ форматирования выходных данных для API бэкенда приложения:
outputmacro: ^formated_in_json(^param_from_rule)

{

   $_result = ^jsoncreate(object)

   $_result.first_level_param = ^param_from_rule

   $_result.nested_object = ^jsoncreate(object)

   ^jsonwrite($_result)

}

Использование макросов в правилах выглядит точно так же, как применение вышеописанной стандартной функции ^respond:
u: FOOD (I want _~food_type)

   ^formated_in_json(_0)

Так как макросы можно писать для различного форматирования выходных данных в зависимости от параметров, можно создавать их и для шаблонов с похожими конструкциями для множества правил, используя patternmacro:
patternmacro: ^want(^appendix)

   [i we] * [want need take] ^appendi

Часть шаблона, возвращённого макросом, может быть переиспользована во множестве других шаблонов, что позволяет упростить скрипт:
u: FOOD (^want(_~food_type))

   If you want _0, you should get \_0 .

u: DRINK (^want(_~drink_type))

   Ok, take and drink your _0 .

Схема чат-бота


На следующей схеме показано место каждой из конструкций CS, о которых мы говорили, в чат-боте.
Схема чат-бота

Как видите, топики, концепты и макросы должны быть объявлены во внешнем слое бота. Правила вложены в топики. Каждое правило, в качестве входной точки, имеет шаблон, и нечто вроде респондера, или тела правила, которое выполняется только в том случае, если вызывается текущий шаблон. Концепты и макросы шаблона, объявленные за пределами топика, затем используются внутри правила с переменными для краткосрочного хранения данных, содержащими значения, необходимые для формирования ответа. В то же время, в респондере может быть вызван макрос для обработки выходных значений. Переменные для долговременного хранения данных используются для передачи данных из краткосрочных переменных в другие топики в том случае, если респондер вызывает команду вида ^respond(~another_topic). Это означает, что обработкой данных, которые затем будет выведены пользователю, займутся правила в другом топике.

Итоги


Сегодня вы узнали об основах ChatScript, а значит, если хотите использовать этот движок для разработки собственного бота, можете приступать к планированию проекта. Из следующей части этого материала вы узнаете об окружении CS, об отладке CS-проектов, об интеграции CS и JavaScript, и о том, как справляться с проблемами, которые могут возникать при разработке чат-ботов на ChatScript.

Уважаемые читатели! Занимаетесь ли вы созданием чат-ботов? Если да — расскажите пожалуйста о том, какими инструментами вы пользуетесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *