энергия данных
Искусственный
интеллект
Корпоративный онлайн-марафон, направленный на поддержку внедрения и развития инструментов расширенной аналитики в деятельность компаний
Введение в использование платформы W11
Изучаем дерево, контекст, слоты, агенты, каналы
Платформа W11 предназначена для разработки цифровых диалоговых ассистентов с использованием машинного обучения.
На платформе W11 можно:
  • создавать разнообразные сценарии работы ЦДА под определенные нужды (автоматизация бизнес-процессов, решение корпоративных задач и пр.);
  • подключать ЦДА к различным каналам связи, в том числе голосовым;
  • осуществлять интеграции с различными внешними системами;
  • просматривать историю общения ЦДА с пользователями и на основе этих данных создавать графики аналитики;
  • общаться с пользователями ЦДА в режиме оператора.

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

Сценарий, в котором прописана логика работы цифрового ассистента, называется диалоговой стратегией и состоит из диалогового дерева и контекста.

Контекст диалоговой стратегии является совокупностью системных переменных и тех, которые задаются при создании агента, либо получаются извне – при сохранении введенных пользователем данных или получении данных при взаимодействии с внешними системами. Например, последняя реплика пользователя всегда хранится в системной переменной client_message.

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

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

Особенности создания слотов:
  • У каждого дерева существует слот Start – корневой слот, с которого начинается и возвращается на него при завершении диалоговая стратегия;
  • Каждому слоту при создании присваивается уникальный ID, который указанное отображается в левом верхнем углу слота;
  • В списке слотов для создания отображаются только те типы слотов, которые можно вставить после родительского слота;
  • Новый слот можно добавить в конец стратегии, после родительского слота, либо в середину, между уже существующими слотами.
На платформе W11 реализованы различные типы слотов:
  • Слот Text предназначен для вывода пользователю некоторой заданной информации, которая может быть прописана в виде текста, либо содержать значения переменной.
  • Слот Wait for input дает возможность пользователю ввести текст, а слот Button menu – выбрать действие или ответ, нажав на кнопку.
  • Работа с контекстом реализована с помощью слота Memory, в нем мы можем задавать, сохранять и обрабатывать необходимые нам переменные.
  • Для проверки сообщения пользователя (client_message), либо значения любой другой заданной переменной на слова-триггеры используется слот Regular expression, в котором прописывается регулярное выражение. После проверки сообщения на соответствие регулярному выражению осуществляется переход через один из дочерних слотов Result со значениями True и False в зависимости от результата проверки значения переменной.
  • Для работы с различными API реализован слот HTTP-request.
  • Для обработки сообщений на естественном языке с целью определить высказанное пользователем намерение (интент) используется слот NLU.
  • Интенты в широком смысле (от англ. intent) — это желания и намерения пользователя, которые стоят за его запросом. Часто это какая-то задача, которую пользователь стремится решить с помощью диалогового ассистента. Интенты – необходимая единица для работы с NLU.
  • Слот Intent на платформе W11 – определенная тематика, к которой нейросеть (модуль NLU) относит реплику пользователя. Для задания такой тематики необходимо прописать обучающие реплики для слота Intent – реплики, которые предположительно может написать цифровому ассистенту пользователь, чтобы решить свою задачу.
  • Чем лучше написаны обучающие реплики для интентов, тем лучше будет распознавание и тем успешнее будет общение пользователя с агентом.
  • Таким образом, слот NLU распознает реплику пользователя, определяет наиболее близкую к ней по смыслу тематику (интент) и в зависимости от распознанного интента диалог идет по соответствующей ветке сценария.
  • С помощью слота Switch dialog происходит перевод пользователя на оператора.
  • Существует также возможность копировать части стратегии в так называемые дополнительные деревья, которые затем можно использовать в стратегии, добавив слот Group. Например, есть какие-то ветки диалогового дерева, состоящие из нескольких слотов, которые необходимо использовать в нескольких частях стратегии – предположим, в каких-то случаях ассистент должен вести себя одним и тем же образом. Тогда мы в частях сценария, где должен быть один функционал, добавляем слоты Group, в которые «свернуто» определенное дополнительное дерево.
  • Ветвление диалога и задание каких-либо правил, по которым должен действовать цифровой ассистент или меняться контекст, происходит с помощью слота Transition rule.

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

Подключить агента к одному или нескольким каналам можно непосредственно на платформе W11.
Введение в распознавание естественной речи.
Немного теории про распознавание интентов. Распознавание интентов на W11, NLU-слот и слоты Intents. Модель распознавания интентов, регулярные выражения.
Для того, чтобы с агентом можно было общаться на естественном языке, он должен уметь корректно обрабатывать реплики пользователей:

  • распознавать задачу/вопрос, который хочет решить пользователь (например, отменить заказ);
  • извлекать необходимые детали (например, номер заказа).

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

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

В большинстве случаев качество работы обученной модели NLU зависит от того, на каких данных она обучалась. От качества и количества наших обучающих примеров зависит то, как хорошо NLU будет понимать и уметь делать то, что мы от него хотим. В случае если фраза пользователя не была распознана с достаточным порогом уверенности (treshold — некоторая граница, выше которой объекты считаются похожими по смыслу достаточно, чтобы быть отнесенными к одной тематике), стратегия будет проходить через слот Fallback. Это означает, что реплика не была отнесена ни к одному из интентов.

Соответственно, для получения качественной модели NLU, нужно:

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

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

Пример регулярного выражения для проверки адреса электронной почты:


^([\wA-Z.-_]+)@([\wA-Z.-_]+).([a-zA-Z]{2,7})$


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

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

Разветвление диалога может происходить не только с помощью регулярных выражений и NLU, но и с помощью так называемых правил, которые вы задаете в стратегии. Для этого на платформе используется слот Transition rule, после которого можно добавлять дочерние слоты Condition.

Правила могут быть самыми разными, такими как: есть ли переменная в контексте, равна ли она определенному значению, или же более сложные правила, где должны выполняться одновременно несколько условий или хотя бы одно из условий. Условий в одном блоке (слотов Condition) может быть несколько, они проверяются сверху вниз, и это необходимо учитывать при построении стратегии.

Пример блок-схемы с несколькими условиями:
При построении стратегии также нужно учитывать так называемый выход из правила. Не должно быть такого, что в первом условии вы проверяете, что переменная равна 1, во втором – 2, и других условий больше нет, а у нас каким-то образом переменная равна другому значению или не появилась в контексте. Для таких случаев нужно продумывать условие выхода и делать его самым последним из слотов Condition.

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

|| – оператор ИЛИ, хотя бы одно условие должно быть истинно;
&& – оператор И, оба условия должны быть истинными.

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

Примеры:
Примеры блоков диалоговой стратегии, основанные на правилах
  • Приветственное сообщение при первом обращении.
Для того, чтобы поприветствовать пользователя при первом его обращении, мы можем проверять на старте, был ли диалог ранее или нет. Если вы используете Телеграм-коннектор, то сделать это можно проверкой, что переменная client_message равна «/start».

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

  • Повторное попадание в Fallback NLU.
С помощью контекстной переменной и правил мы можем задать, сколько раз подряд пользователь может попасть в Fallback. Для это мы создаём переменную, некоторый счётчик, и каждый раз, когда ассистент нас не понимает, увеличиваем счётчик на 1. Если, например, при последующем попадании в Fallback счетчик равен 3, а правило у нас установлено такое, что переменная должна быть равна 3 и более, то в таком случае можно, например, переводить на оператора.

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

  • Использование данных Телеграма для предоставления доступа к диалоговому ассистенту.
При общении через Телеграм-коннектор в системную переменную messenger_data сохраняются данные о пользователе.

В слоте Memory можно получить значение переменной user_name следующим образом – задать для нее значение {{ @messenger_data }}[‘user_name’], тогда при прохождении через этот слот Memory переменная приобретет то значение, которое имеет user_name в messenger_data.

Затем можно сделать условие на user_name, равно ли оно, например, вашему имени в Телеграме. Если условие истинно, то продолжать диалоговую стратегию, если нет – то у пользователя нет доступа к ассистенту.