Создание собственного агента Duplex AI с использованием Rasa и Twilio

Мы все можем пережить разочарование при звонке в компанию, использующую систему IVR: нажмите 2, чтобы поговорить с отделом продаж, нажмите 3, чтобы ждать вечно. Даже современные системы, использующие распознавание речи для навигации по дереву, по-прежнему кажутся неуклюжими и часто требуют, чтобы в конце концов человек разрешил запрос. Поэтому, когда Google представил Duplex, огромное количество людей были потрясены компьютером, который мог беспрепятственно и убедительно взаимодействовать с человеком по телефону. После этого Интернет загорелся комментариями о том, что тест Тьюринга провалился, что мораль мертва и что мы все обречены. Независимо от социальных последствий, явную впечатляющую демонстрацию нельзя было игнорировать.

Что самое захватывающее, такая естественная, плавная беседа с машиной не ограничивается залами исследовательского крыла Google! Прямо сейчас можно использовать удобные для разработчиков технологии, такие как Rasa Stack с открытым исходным кодом, и такие сервисы, как Twilio, для создания телефонного агента на базе искусственного интеллекта. В этой статье я собираюсь проиллюстрировать, как вы можете создать своего собственного Duplex-подобного агента для автономной обработки телефонных звонков. Мы собираемся подойти к проблеме с другой стороны - позвонить в компанию и поговорить с машиной (а не с машиной, звонящей в компанию).

Обзор

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

На схеме ниже описана система, использованная в демонстрации:

Подобная система состоит из 3 основных частей:

  1. Способ подключения к телефонной сети
  2. Системы для работы с речью (преобразование речи в текст и преобразование текста в речь)
  3. Автономный агент, способный вести разговор и действовать.

Телефония

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

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

Для демонстрации выше я использовал два разных пакета программного обеспечения для обработки вызовов. Первый пакет, Kamailio, служит балансировщиком нагрузки VoIP и маршрутизатором. Он находится за пределами брандмауэра нашей системы и к нему подключается Twilio. Затем Kamailio направляет вызов внутри брандмауэра на второй пакет, Asterisk. Asterisk - это платформа Public Branch eXchange (PBX), которая может выполнять все виды задач - от размещения ящиков голосовой почты до включения конференц-связи и настраиваемых приложений, подобных нашему. Asterisk управляет вызовом (ответ, отбой и т. Д.), А также передает звук в речевые подсистемы и обратно.

Транскрипция и синтез речи

Итак, у нас есть соединение с телефонной системой, теперь нам нужен способ справиться с lingua franca телефона - аудио. За последние несколько лет методы машинного обучения позволили значительно улучшить транскрипцию и синтез речи - мы переживаем своего рода ренессанс программного обеспечения для обработки речи. Что касается транскрипции, такие компании, как Google и Microsoft, заявляют о почти человеческих уровнях понимания в различных средах. Между тем, в области синтеза такие усилия, как WaveNet и Tacotron, приносят более человеческие результаты, даже воссоздают сложные ритмы и интонации носителей языка (это, вероятно, то, что используется в демо Duplex).

В демонстрации, показанной выше, использовался Google Cloud Speech-To-Text для транскрипции и Amazon Polly для синтеза - оба сервиса поддерживают потоковые интерфейсы, которые помогают уменьшить общую задержку и обеспечивают более человеческое взаимодействие. При этом вы можете смешивать и подбирать речевые системы в соответствии с вашими собственными требованиями.

Создание автономных агентов

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

Чтобы решить эту проблему, команда Rasa создала потрясающий набор инструментов с открытым исходным кодом для создания агентов на базе искусственного интеллекта. Rasa NLU использует современные методы машинного обучения для классификации необработанного текста на структурированные намерения и извлечения сущностей (например, имен, дат, количества) из этого текста. Между тем, Rasa Core использует рекуррентную нейронную сеть (RNN) для построения вероятностной модели того, как должен протекать разговор. Эта основанная на RNN модель не только учитывает то, что только что сказал пользователь, но также запоминает соответствующую информацию для информирования своего ответа. Эта память принимает две формы: (1) предыдущие повороты в разговоре (например, ранее пользователь сказал, что хочет изменить расписание, поэтому переместите встречу, а не создавайте новую) и (2) факты (Раса называет эти слоты), полученные из заявлений пользователя (например, «Стрижка - это услуга, о которой мы говорим, а Карлос - желаемый стилист).

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

Ниже приведен пример некоторых данных обучения NLU в формате JSON:

[
  ...
  {
    "text": "I'd like to get a beard trim on Saturday.",
    "intent": "schedule",
    "entities": [
      {
        "start": 18,
        "end": 28,
        "value": "beard trim",
        "entity": "service_name"
      },
    ]
  },
  ...
]

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

Точно так же мы предоставляем примеры разговоров для обучения Rasa Core в формате уценки:

## Schedule intent with valid service name
* schedule{"service_name":"beard trim"}
- action_service_lookup               
- slot{"service_id": 12345}
- action_confirm_appointment
## Schedule intent with invalid service name
* schedule{"service_name":"jelly beans"}
- action_service_lookup
[note the lack of slot setting here compared to above]
- action_apologize_for_misunderstanding
- action_prompt_for_service
## Schedule intent with no service name
* schedule
- action_prompt_for_service

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

  1. Если указано имя службы (т.е. сущность service_name была установлена ​​в намерении), выполните действие поиска (action_service_lookup).
  2. Если имя службы не указано (т. Е. Сущность service_name не задана), запросите у пользователя имя службы.
  3. Если поиск службы завершился успешно (т.е. слот service_id установлен как часть action_service_lookup), подтвердите встречу.
  4. Если поиск службы завершился неудачно (т. Е. Слот service_idslot не установлен как часть action_service_lookup), извинитесь и попросите состояние пользователя предоставить имя службы.

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

В приведенной выше демонстрации использовался вручную подобранный набор обучающих данных (например, список всех способов, которые вы можете придумать, чтобы сказать «Когда вы открыты?») - примерно 1300 примеров предложений для обучения Rasa NLU и несколько сотен примеров разговоров для Rasa Основная подготовка. Эти обучающие данные были объединены с специально написанными программными действиями, которые выполняли такие вещи, как «поиск свободного места для встречи» или «подтверждение временного интервала для встречи», и были представлены Расе для использования в разговоре. Агент решал, какое из этих действий запускать в ответ на ввод пользователя, и ответ от этих действий использовался для информирования будущих ответов (например, был ли найден слот встречи в запрошенное время).

Собираем все вместе

Мы рассмотрели 3 основных компонента системы - телефонию, речь и агента. Соберем все вместе:

Эта приблизительная диаграмма архитектуры описывает структуру вышеприведенной демонстрации. Он работал в кластере Kubernetes, управляемом Google Kubernetes Engine, в архитектуре, сильно ориентированной на микросервисы. Каждая коробка представляла собой более или менее один модуль Kubernetes (на самом деле было несколько модулей, которые были здесь опущены для краткости). Специальное программное обеспечение было написано на комбинации Go, Python и Node.js в зависимости от поставленной задачи.

Заключение

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

Приложение

Ресурсы

Как отмечалось выше, существует ряд речевых систем, вот несколько ссылок для начала, хотя это ни в коем случае не исчерпывающий список.

Системы преобразования речи в текст

Системы преобразования текста в речь

об авторе

Джош Конверс - основатель Dynamic Offset, бутик-консалтинговой фирмы, специализирующейся на улучшении качества обслуживания клиентов с помощью мобильных, веб-интерфейсов и диалоговых интерфейсов. До консультации он был техническим руководителем в Google и Apple. Напишите привет - [email protected]!