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

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

13 советов при разработке голосовых приложений

11 Октября, 2019 Автор: Максим М

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

1. Сосредоточьтесь на содержании, а не только на машинном обучении

13 уроков. Сосредоточьтесь на содержании

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

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

Мы использовали машинное обучение только для управления диалогами. Машинное обучение не дает ответов в нашем случае (за исключением одного исключения, к которому мы доберемся позже). Он классифицирует намерение, находит сущности или находит чувства и эмоции пользователя. Содержание диалога сделано нами вручную. Таким образом, мы можем обеспечить, чтобы диалог был увлекательным и последовательным. Если это не так, мы можем перенастроить его.

2. Модель Seq2Seq не работает

13 уроков. Модель Seq2Seq не работает

Этот момент тесно связан с предыдущим пунктом. Я считаю это достаточно важным, чтобы поставить его в отдельную точку. Есть статья «Нейронная модель общения». Оно описывает, как вы можете применить стандартную архитектуру Seq2Seq для машинного перевода к диалогам. Есть удивительные примеры диалогов, созданных с использованием этой модели. Мы были поражены когда впервые увидели это. Однако когда мы попытались использовать его самостоятельно, это не дало таких результатов. Ответы модели являются более короткими и общими. В качестве обучающих наборов данных мы использовали субтитры к фильмам и комментарии Reddit. Мы потратили не менее двух месяцев, пытаясь заставить его работать, но все без какого-либо значительного успеха.

Однако мы нашли применение этой модели. Мы называем это «болтовня». Он используется только в случае неудачи других методов генерации ответа. «Болтовня» обычно отвечает на такие вопросы, как «Как дела?» Или «Что вы будете делать сегодня вечером». Мы допускаем только три ответа в строке, созданных этой моделью, а затем рекомендуем пользователю новую тему. Это правило важно. В противном случае пользователь застрянет в скучной беседе ни о чем. «Болтовня» - наш единственный метод, основанный на машинном обучении, для генерации ответов.

3. Стройте диалоги из готовых частей

13 уроков. Стройте диалоги из готовых частей

Наш последний подход состоял в том, чтобы представлять диалог как государственные автоматы. У нас есть автомат для каждой темы (спорт, фильмы, музыка и т. Д.). Каждое состояние автомата имеет функции «выполнить» и «переход». Состояние может обрабатывать ввод пользователя или получать доступ к некоторому API, например, в функции «Переход». Функция «переход» решает, какое состояние будет выполнено следующим. Решение основывается на результате функции «выполнить».

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

Наши готовые состояния:

  • Произнесите предложение, дождитесь сообщения пользователя и перейдите в следующее состояние
  • Произнесите предложение, не ждите сообщения пользователя и переходите в следующее состояние
  • Произнесите предложение "A" при каждом n-м посещении штата и произнесите предложение "B" в противном случае, переходите к следующему состоянию (Это полезно, если вы хотите напомнить пользователю некоторую информацию, например: «Помните, что вы можете сказать «Давайте поговорим о спорте». В любой момент). Давай вернемся к книгам. Какой твой любимый автор? »)
  • Ожидание сообщения пользователя и переход в следующее состояние
  • Распознать Да или Нет (согласие, несогласие) в сообщении пользователя и перейти в одно из двух следующих состояний на основе результата распознавания
  • Распознать сущность в сообщении пользователя
  • Переключиться на другой автомат

Эти состояния составляли примерно 60% - 80% наших автоматов. Остальные штаты редки, поэтому они не окупились.

4. Разделите диалоги как можно чаще для удобства обслуживания

13 уроков. Разделяйте диалоги как можно чаще

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

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

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

13 уроков. Цель развлечь пользователя

Наш первоначальный подход к дизайну диалогов состоял в том, чтобы спросить пользователя о его любимой сущности (фильм, видеоигра, спорт…), дать ему некоторую информацию о сущности (к какому жанру она принадлежит, актер, который снялся в ней…), задать ему какой-нибудь общий вопрос («Почему вам это нравится?», «Какая ваша любимая роль?», «Вы часто играете в эту игру?»…) И снова спросить его о следующей любимой игре. Пользователь был в цикле разговора, и продолжительность разговора увеличивалась. Однако эта стратегия работает только до определенного момента. Пользователь делает только два раунда, и после ему становится скучно. Есть три основных причины этой проблемы. Первая - это та же или очень похожая структура диалога. Во-вторых, мы даем пользователю общую информацию о его любимой сущности, которую он, вероятно, уже знает (потому что это его любимая). В-третьих, мы не реагируем на ответы на наш общий вопрос (мы отвечаем только «Я вижу» или «Это интересно»).

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

Мы обнаружили, что предоставление пользователю пустяков и забавных фактов решает вторую проблему. Не давайте ему только необработанные данные, рассмотрите их в перспективе. Отличным источником забавных фактов является Reddit (https://www.reddit.com/r/todayilearned или https://www.reddit.com/r/Shower), которым мы часто пользовались. Пользователь говорит о матрице? Ищите «Матрицу» в сегодняшнем subreddit и отвечайте «Знаете ли вы? Уилл Смит отказался от роли Нео в «Матрице» (1999). Вместо этого он принял участие в фильме «Дикий запад», который был огромным провалом в кассе». Это гораздо лучше, чем «Матрица была выпущена в 1999 году». Не так ли?

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

  • - Бот: «Тебе нравится этот фильм?»
  • - Пользователь: «Да, но моя девушка ненавидит его».
  • - Бот: «Понятно!»

Он может ответить вам и спросить одновременно:

  • - Бот: «Тебе нравится этот фильм?»
  • - Пользователь: «Да, мне нравится этот фильм. Почему ты спрашиваешь об этом?"
  • - Бот: «Понятно!»

Или он может сказать что-то совершенно неуместное.

  • - Бот: «Тебе нравится этот фильм?»
  • - Пользователь: «У меня было яйцо на завтрак».
  • - Бот: «Понятно!»

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

6. Сделайте диалог не зависимым от пользователя (иногда)

13 уроков. Сделайте диалог не зависимым от пользователя

Вы хотите привести пользователя к какой-то точке разговора. Например, мы хотели провести пользователя через наш начальный чат в начале разговора. Мы спросили его, как прошел его день или как его зовут. Если он отвечал на какую-то ерунду, мы просто продолжали что-то вроде: «Хорошо, вам не нужно говорить нам об этом. В конце концов, это не такая важная информация». Таким способом вы можете привести пользователя к более интересным частям диалога. Однако не злоупотребляйте этим.

7. Если вы спросите «У вас есть любимый актер?», Не ждите только имени. Ожидайте «да» или «нет»

13 уроков. Ожидайте от пользователя все что угодно

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

8. Посмотрите на неожиданных входных данных пользователя и предложите новые темы

13 уроков. Смотрите на данные

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

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

9. Завершайте каждый ответ вопросом или предложением, что делать дальше

13 уроков. Завершайте каждый ответ наводящим вопросом

ЭТО СУПЕР ВАЖНО! Каждый раз, когда вы что-то говорите пользователю, заканчивайте вопросом или предложением, что делать дальше. Этот подход имеет несколько преимуществ. Это помогает поддерживать разговор. А также уменьшает количество возможных сообщений пользователя, потому что пользователь будет делать то, что вы предлагаете большую часть времени. Вы также можете привести его к разговорной теме, которую он еще не пробовал.

10. Будьте готовы выпрыгнуть из контекста и вернуться к нему

13 уроков. Будьте готовы выпрыгнуть из контекста

Мы включили модуль ответов на вопросы так называемый модуль «однострочные ответы» в нашу систему. Модуль вопросов-ответов отвечал на вопросы общего характера, а модуль «однострочные ответы» обрабатывал вопросы, на которые мы жестко закодировали ответы, например «Как тебя зовут?» Или «Сколько тебе лет?». Оба эти модуля можно использовать в любое время в течение разговор, и он изначально выглядел так:

  • - Бот: «Вы были в Бразилии?»
  • - Пользователь: «Какова численность населения Бразилии?»
  • - Бот: «Это около 200 000 000»
  • - Пользователь: «Хорошо, хорошо.»

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

  • - Бот: «Вы были в Бразилии?»
  • - Пользователь: «Какова численность населения Бразилии?»
  • - Бот: «Это около 200 000 000. В любом случае, я говорил, вы были в Бразилии?»
  • - Пользователь: «Нет, еще нет».
  • - Бот: «Бразилия - захватывающая страна ...»

11. Делайте ответы как можно более разнообразными

13 уроков. Делайте реплики разнообразными

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

book_not_enjoy:

  • - «(| Хм.) Мне не (нравится | очень нравится) (это | тот) (| очень) сильно».
  • - «Это меня не очень (| очень) впечатлило».

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

  • Хм. Мне это не очень понравилось.
  • Мне это не очень понравилось.
  • Мне это не очень понравилось.
  • Это меня не сильно впечатлило.
  • Это меня не очень впечатлило.
  • ...

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

12. ASR не идеален

13 уроков. ASR не идеален

Автоматическое распознавание речи (ASR) не идеально. Сложности возникают, в основном, когда вы находитесь в шумной обстановке, или если пользователь не является носителем английского языка. Это было проблемой для всей нашей команды. Я боролся с такими фразами, как «Давайте поговорим о фильмах». Он был признан «Что говорят о фильмах» и был классифицирован менеджером диалогов как вход в наш модуль для ответов на вопросы.

Ошибки ASR были причиной многих наших проблем с распознаванием намерений и сущностей. Мы попытались решить это, посмотрев на показатели доверия. Если показатель достоверности не превышал пороговое значение, мы просили пользователя повторить его сообщение («Я вас не понял. Вы можете повторить?»).

Мы попробовали A/B-тестирование позже в разработке. Мы отключили показатель доверия для половины пользователей. Знаете, что случилось? Рейтинги для обеих групп остались практически одинаковыми. Так что либо решайте ошибки ASR более умным способом, чем мы, либо вообще не беспокойтесь об этом. Алгоритмы ASR улучшаются, поэтому эта проблема, вероятно, не будет существовать в будущем.

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

13 уроков. Отшлифуйте все ответы

Ненормативная лексика... это была самая распространенная причина, по которой Amazon остановил нашего чат-бота. Сказать ненормативную лексику, конечно, не было нашей целью. Причина была в том, что мы использовали много текстов из интернета. Reddit комментирует болтовню, забавные факты из Reddit и т. Д.

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

Это работало до некоторой степени (хотя мы должны были добавить намного больше фраз, которые мы обнаружили с течением времени). Но этот подход не обнаруживает ненавистнические высказывания, не содержащие ненормативную лексику. Одним из таких примеров является ответ «Убей своих родителей». Поэтому мы использовали машинное обучение для обучения детектора ненавистнических высказываний. Мы обучили его на двух наборах ненавистнических высказываний из Твиттера. Этот детектор улучшил систему, но есть некоторые проблемы, которые мы постепенно устраняем. Я рекомендую вам потратить время на разработку способа проверки всех текстов, которые вы не написали самостоятельно.

На этом все

13 уроков. Спасибо за внимание

Это мои 13 советов, которые мы рекомендуем каждому, кто пытается создать собственный разговорный ИИ. Они основаны на моем опыте, который наша команда собрала за один год участия в конкурсе Amazon Alexa Prize 2017. Я надеюсь, что этот список поможет вам создать что-то умное и похожее на человека, потому что одна из моих мечтаний - иметь по-настоящему умного разговор с ИИ. Удачи и продолжайте раздвигать границы!

Информация взята и переведена из статьи: 13 Lessons We Have To Learn From Amazon Alexa Prize

Рекомендую к прочтению следующие статьи

Умный дом Яндекса, поддерживаемых устройств стало ещё больше!

Умный дом Яндекса, поддерживаемых устройств стало ещё больше!

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

Читать статью

Кто такая Алиса, где она живет и как можно её использовать

Кто такая Алиса, где она живет и как можно её использовать

В статье я расскажу Вам о том, как правильно пользоваться Алисой. Узнаем, где именно она живет, как её запустить и использовать в повседневной жизни, а также я расскажу вам о навыках.

Читать статью

Как проектировать голосовые интерфейсы пользователя

Как проектировать голосовые интерфейсы пользователя

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

Читать статью

Навыки Алисы теперь можно размещать в Яндекс.Облаке бесплатно и просто

Навыки Алисы теперь можно размещать в Яндекс.Облаке бесплатно и просто

Отличные новости для разработчиков голосовых приложений Алисы! Теперь любой разработчик или компания могут размещать свои голосовые навыки Алисы совершенно бесплатно в Яндекс.Облаке.

Читать статью

Тестирование навыков умного дома прямо в Яндекс.Диалогах

Тестирование навыков умного дома прямо в Яндекс.Диалогах

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

Читать статью

Комментарии

Оставить комментарий

Как со мной связаться?

Свяжитесь со мной по любому вопросу!
Я с радостью отвечу на все вопросы!

Телефон:

+7(909) 281 35-20

Дополнительная почта:

info@maxim-m.ru

Я в социальных сетях:

Вверх 👆