Глава 3: Концепции Dialogflow Essentials
Разработчики или UX-дизайнеры могут обучать агента Dialogflow Essentials (модель машинного обучения) через веб-консоль Dialogflow. Она основана на намерениях. Намерение категоризирует намерение конечного пользователя для одного шага разговора. Ваш агент Dialogflow будет содержать много намерений. Каждое намерение содержит обучающие фразы, контексты и ответы.
В этой главе будут подробно рассмотрены детали обучения агента Dialogflow Essentials. Будет рассказано, как работают намерения и как вы можете создавать намерения. Обсуждаются сущности и работа с контекстами. В конце главы вы протестируете своего агента в симуляторе Dialogflow.
Намерения в деталях
В качестве примера, Рисунок 3-1 показывает страницу намерения для покупки игровой консоли.
Рисунок 3-1. Создать намерение с обучающими фразами
Dialogflow может интерпретировать значение человеческого разговора, когда агент был обучен на заданном помеченном наборе данных обучающих фраз.
Когда пользователь общается с чат-ботом с помощью письменного текста или устной речи (высказывания пользователя), Dialogflow выполнит классификацию намерений. Благодаря механизму NLP (который постоянно совершенствуется), не имеет значения, написано ли высказывание пользователя по-другому или содержит орфографические/грамматические ошибки. Он поймет, что было сказано, и сопоставит это, проверив все намерения, добавленные в агент Dialogflow. Как только произойдет совпадение намерения, он вернет выполнение/ответ намерения.
Dialogflow не самообучается так, как это делает целеориентированный ИИ, такой как AlphaZero*. Google не раскрывает все детали реализации (секретный соус) базовых технологий, таких как механизмы NLP или Speech to Text, просто потому, что они могут быстро меняться и устаревать вместе с документацией.
* Узнайте больше об AlphaZero, https://en.wikipedia.org/wiki/AlphaZero
Настройка намерений
Намерение — это объект сообщения, описывающий действие. Когда вы визуализируете разговор как часть древовидной диаграммы (Рисунок 3-2), все ветви дерева являются (последующими) намерениями.
Рисунок 3-2. Визуализация разговора в виде древовидной диаграммы. Каждый узел является намерением
Войдите в консоль Dialogflow Essentials. Откройте в браузере: https://dialogflow.cloud.google.com/.
Вы можете создавать новые намерения, щелкнув пункт меню Намерения, а затем кнопку Создать новое намерение. Это откроет экран намерений (Рисунок 3-3). Вам нужно будет указать имя намерения, обучающие фразы и ответы.
Рисунок 3-3. Создание нового намерения
Совет: В Dialogflow Essentials нет системы папок для намерений. Поэтому вам нужно будет проявить творческий подход к именованию намерений. Я видела, как компании присваивают намерениям числовые идентификаторы в диапазонах, которые, вероятно, сопоставляются с выполнениями в базах данных. Я также видела, как компании именуют намерения, чтобы лучше их группировать: UseCase.MainCategory.SubCategory, например: webshop.console.order и webshop.videogame.cancelorder.
В конце концов, вы должны решить для себя, что работает лучше всего. Если это небольшой агент, такая структура, вероятно, не имеет значения, но имейте в виду, что ваш агент со временем будет масштабироваться.
Давайте создадим крутого чат-бота, который может помочь, предоставляя информацию о видеоиграх, такую как предстоящие релизы игр. Также должна быть возможность вести разговор с чат-ботом о видеоиграх. Если бы вы вели разговор в реальной жизни с другом на эту тему, как бы это выглядело? Вероятно, примерно так:
Я: В какие видеоигры ты сейчас играешь?
Друг: О, на Nintendo Switch я играю в Animal Crossing, а на PlayStation я сейчас играю в последнюю игру Star Wars. А ты?
Я: Я играю в Call of Duty.
Я: Какая твоя любимая видеоигра?
Друг: Мои любимые игры — Heavy Rain и Beyond to Souls. Мне также понравилась серия Uncharted.
Я: Heavy Rain? Разве это не скучное приключение с быстрым временем реакции?
Друг: Я больше всего люблю одиночные игры. Мои любимые игры — это игры с сюжетом. Истории этих игр великолепны.
Я: О. Для какой системы она вышла?
Друг: PlayStation 3 и 4.
Я: Я больше люблю многопользовательские игры. Какая твоя любимая многопользовательская игра?
Друг: Я иногда играю в Call of Duty. Но я не очень хорош в ней. Думаю, мне больше нравится Heart Stone на iPad.
Анализируя этот разговор, вы можете ясно видеть, что есть три темы разговора:
- Сбор информации пользователя о текущей игре
- Сбор информации пользователя о любимой игре в целом
- Сбор информации пользователя о любимой многопользовательской игре
Если бы мы взяли этот разговор и обучили его в Dialogflow, эти три темы обучения были бы намерениями.
Намерение категоризирует намерение пользователя. Для каждого агента Dialogflow вы, как UX-дизайнер (моделировщик агента) или разработчик, можете определить много намерений, где ваши объединенные намерения могут обрабатывать полный разговор. Определяя намерения, будет обучена базовая модель машинного обучения.
Когда конечный пользователь пишет или говорит что-то в чат-боте, называемое выражением пользователя или высказыванием, Dialogflow сопоставляет выражение с лучшим намерением вашего агента Dialogflow на основе обучающих фраз и встроенного NLP, на котором была обучена базовая модель машинного обучения Dialogflow. Сопоставление намерения также известно как классификация намерений или сопоставление намерений. Сопоставленное намерение может вернуть ответ, собрать параметры (извлечение сущностей) или вызвать код веб-перехватчика (fulfillment) (например, для извлечения данных из базы данных).
Намерение в Dialogflow содержит следующее:
- Контекст: Используя контексты, вы можете управлять потоком разговора при смене реплик, например, на основе нашего примера разговора. В какой-то момент друг (или чат-бот) упомянет свою любимую видеоигру. Был задан уточняющий вопрос: «На какой системе она вышла?» Он относится к любимой видеоигре, которая была упомянута ранее. Мы обсудим установку контекстов позже в этой главе.
- Обучающие фразы: См. Рисунок 3-4. Это набор данных, который вы используете для обучения каждого отдельного намерения. Когда пользователь что-то говорит, это будет сопоставлено с этими обучающими фразами. Не имеет значения, написано ли высказывание пользователя по-другому или сказано по-другому. При правильной настройке Понимание естественного языка (NLU) Dialogflow, скорее всего, поймет, что имелось в виду, и сможет определить, какое намерение соответствует.
Совет: При предоставлении обучающих фраз хорошей практикой является наличие не менее 15-20 различных примеров, в зависимости от сложности вашего намерения. Не делайте эти фразы слишком похожими.
Предположим, мы создадим намерение Собрать информацию пользователя о текущей игре в Dialogflow. Обучающие фразы могли бы быть:
- В какие видеоигры ты сейчас играешь?
- В какую игру ты сейчас играешь?
- В какие игры ты играл в последнее время?
- Ты играл в какие-нибудь видеоигры в последнее время? Какие?
- Во что ты играешь прямо сейчас?
- Какая твоя последняя покупка игры?
- В какую самую последнюю игру ты играл?
Рисунок 3-4. Обучающие фразы намерения
- События: (См. Рисунок 3-5.) Намерения обычно вызываются, когда выражение пользователя соответствует обучающей фразе намерения. Однако вы также можете вызывать намерения с помощью событий, механизма для вызова кода после определенной функции или действия, например, события платформы, такого как событие Приветствия Google Assistant, которое будет вызвано при запуске действия Google Assistant, или пользовательского события приветствия, когда ваш веб-чат-бот запускает агент Dialogflow при загрузке страницы.
Совет: Некоторые пользователи Dialogflow Essentials используют пользовательские события, чтобы сделать намерения многоразовыми. В Dialogflow Essentials нет функции для повторного использования намерений. Если вы думаете о разговоре как о древовидной диаграмме, то будут ветви дерева (например, потоки входа в систему или потоки да/нет), которые возвращаются в определенные моменты разговора. Вы могли бы вручную поддерживать это при работе с событиями. В реализациях кода выполнения вы бы вызывали пользовательские события, устанавливая поле followupEventInput в WebhookResponse. Вы можете необязательно установить поле followupEventInput.parameters для предоставления параметров намерению. Намерения Dialogflow могут быть настроены на прослушивание этих событий перед возвратом ответа.
Рисунок 3-5. Намерение может иметь событие для вызова
- Действие: Эта функция имеет наибольший смысл для разработчиков, работающих с SDK Dialogflow. В консоли Dialogflow вы можете определить имя действия для каждого намерения. Dialogflow предоставляет имя действия вашей реализации, которая интегрирует агент Dialogflow через SDK при сопоставлении намерения. Например, если мы создадим новое намерение для получения релизов игр определенного месяца, результаты видеоигр не будут жестко закодированы в интерфейсе Dialogflow. Вместо этого разработчики вызовут веб-сервис с базой данных, который будет фильтровать и возвращать результаты видеоигр. В Dialogflow я мог бы установить имя действия на fetch_videogames, что могло бы (в зависимости от вашей реализации выполнения) вызвать функцию в вашей кодовой базе.
- Параметры: Когда намерение сопоставляется во время выполнения, Dialogflow предоставляет извлеченные значения из выражения пользователя как параметры, которые могут быть отправлены в код выполнения/бэкэнд-код. Мы подробнее обсудим параметры в следующем разделе.
- Ответы: Вы определяете текстовые, речевые или визуальные ответы для возврата конечному пользователю. Они могут предоставлять пользователю ответы, запрашивать у пользователя дополнительную информацию или завершать разговор.
В нашем примере ответ чат-бота мог бы быть: О, на Nintendo Switch я играю в Animal Crossing, а на PlayStation я сейчас играю в последнюю игру Star Wars.
Возможно указать несколько разных ответов. Dialogflow будет чередовать выбор ответа, поэтому ваш ответ может быть уникальным каждый раз. Альтернативный ответ мог бы быть: Я недавно купил игру Death Stranding, но еще не начал в нее играть.
Ответы также могут иметь пользовательскую полезную нагрузку (custom payload). Некоторые платформы поддерживают ответ с пользовательской полезной нагрузкой для обработки нестандартных, расширенных ответов. Эти пользовательские полезные нагрузки предоставляются в формате JSON, определенном в документации платформы. Вы бы использовали это для создания, например, расширенных карточек. В зависимости от интеграций, которые вы включили для Dialogflow, вы увидите разные вкладки ответа для ввода пользовательских полезных нагрузок.
И ответы имеют переключатель конца разговора. Вы можете указать, является ли ответ концом разговора. Это остановит разговор. Например, на определенных платформах, таких как Google Assistant, это закроет действие (приложение).
- Переключатели выполнения (Fulfillment switches): Когда ответ на этот разговор не жестко закодирован в Dialogflow, а поступает из другой системы, вы должны пометить включить вызов веб-перехватчика для этого намерения. Когда намерение сопоставляется во время выполнения, агент Dialogflow продолжает собирать параметры от пользователя до тех пор, пока пользователь не предоставит данные для каждого из требуемых параметров. Этот процесс называется заполнением слотов (slot filling). По умолчанию Dialogflow не отправляет запрос веб-перехватчика выполнения до тех пор, пока не соберет все необходимые данные от пользователя. Dialogflow отправляет запрос веб-перехватчика выполнения для каждого шага разговора во время заполнения слотов, если включен веб-перехватчик для заполнения слотов.
На экране выполнения вы можете настроить веб-перехватчик. Мы подробно обсудим выполнение в Главе 10.
Когда вы начинаете новый проект Dialogflow, вы всегда получаете два предопределенных намерения: намерение приветствия, которое будет вызвано при начале разговора, и глобальное резервное намерение, которое будет активировано, когда Dialogflow вообще не сможет найти совпадение намерения.
Агент Dialogflow может обрабатывать 2 тыс. различных намерений. Если вам нужно больше намерений, вы можете рассмотреть возможность использования функции мега-агента; см. Главу 9. Каждое намерение может иметь 2 тыс. максимальных обучающих фраз на язык или 100 тыс. всего на агента Dialogflow на язык.
Сущности в деталях
Сущность — это (переменный) объект сообщения для выполнения действия. Это как параметр, который собирает значение для определенного ключа.
В Dialogflow вы можете создавать пользовательские сущности или использовать системные сущности. Пользовательские сущности могут быть созданы в агенте Dialogflow. Dialogflow распознает системные сущности, такие как названия месяцев, валюты и названия стран, из коробки.
Создание пользовательских сущностей
Чтобы создать пользовательские сущности, в строке меню щелкните Сущности ➤ Создать сущность. (См. Рисунок 3-6.)
На этом экране вы можете дать вашей сущности имя и список возможных значений. Первое значение записи будет использоваться для отправки на бэкэнд; все остальные варианты значений (синонимы) будут использоваться для распознавания записи. Вы можете использовать клавишу табуляции для создания большего количества синонимов.
После создания пользовательской сущности не забудьте нажать кнопку Сохранить.
Наш чат-бот пока не содержит такой продвинутой логики. После завершения предыдущего рецепта ваш чат-бот может только вести простой разговор с вами. Представьте, что вы также могли бы запросить последние даты релиза для определенной игровой консоли, например:
«Какие игры были выпущены для PlayStation 5 в этом месяце?»
PlayStation 5 — это переменная часть. Я мог бы спросить PlayStation 5, Xbox Series X, Nintendo Switch или Windows, чтобы вернуть мне разные результаты. PlayStation 5 — это пользовательская сущность. Фактически, если бы я подключил этот разговор к веб-сервису, он отправил бы параметр для фильтрации ответов в бэкэнд-систему, например:
platform = PS5
Чтобы Dialogflow понял, что PlayStation 5 — это сущность, нам нужно было бы создать сущность «platform», содержащую все возможные варианты.
Рисунок 3-6. Создание пользовательских сущностей
Есть более простой способ ввести все записи сущности. Когда вы щелкаете три точки рядом с кнопкой сохранения (кнопка опций), это позволяет вам переключиться в режим Raw. Здесь вы можете ввести записи в формате JSON или CSV. Листинг 3-1 показывает пример кода в JSON.
Листинг 3-1. Пример сущностей в формате JSON
JSON:
[
{
"value": "xbox-series-x",
"synonyms": [
"xbox-series-x",
"Xbox Series X",
"newest xbox",
"next gen xbox",
"Microsoft Xbox Series X"
]
},
{
"value": "playstation-5",
"synonyms": [
"playstation-5",
"PS5",
"Next gen PlayStation",
"newest PlayStation",
"Sony Playstation 5"
]
},
{
"value": "xboxone",
"synonyms": [
"xboxone",
"Xbone",
"Xbox1",
"Microsoft Xbox One"
]
},
{
"value": "ps4--1",
"synonyms": [
"ps4--1",
"Playstation 4",
"PS4",
"Sony Playstation 4"
]
},
{
"value": "win",
"synonyms": [
"win",
"PC",
"Microsoft PC",
"Windows"
]
},
{
"value": "switch",
"synonyms": [
"switch",
"Nintendo Switch"
]
},
{
"value": "new-nintendo-3ds",
"synonyms": [
"new-nintendo-3ds",
"N3DS",
"3DS",
"Nintendo 3DS",
"New Nintendo 3DS"
]
}
]
Листинг 3-2 показывает пример кода в формате CSV.
Листинг 3-2. Пример сущностей в формате CSV
"xbox-series-x","xbox-series-x","Xbox Series X","newest xbox","next gen xbox","Microsoft Xbox Series X"
"playstation-5","playstation-5","PS5","Next gen playstation","newest playstation","Sony Playstation 5"
"xboxone","xboxone","Xbone","Xbox1","Microsoft Xbox one"
"ps4--1","ps4--1","Playstation 4","PS4","Sony Playstation 4"
"win","win","PC","Microsoft PC","Windows"
"switch","switch","Nintendo Switch"
"new-nintendo-3ds","new-nintendo-3ds","N3DS","3DS","Nintendo 3DS","New Nintendo 3DS"
Также возможно импортировать или экспортировать сущности с экрана Сущности. Нажмите кнопку опций (три точки) рядом с кнопкой Создать сущность. Нажмите Загрузить сущность и выберите для загрузки файл JSON или CSV, содержащий сущности. Для загрузки файлов они должны соответствовать следующим правилам:
- Каждая запись соответствует новой строке.
- Ссылочное значение и синонимы должны быть разделены запятыми.
- Каждое ссылочное значение и синоним должны быть заключены в двойные кавычки.
- Ссылочное значение должно быть в начале строки.
- Включите ссылочное значение дважды, если вы хотите, чтобы оно было сопоставлено сущностью.
Программно также возможно добавлять сущности. Это имеет смысл, если у вас есть обширный список сущностей, который необходимо автоматически импортировать из базы данных.
Метод API Dialogflow projects.agent.entityTypes.batchUpdate мог бы это сделать.
Агент Dialogflow может обрабатывать 250 различных пользовательских сущностей. Если вам нужно больше сущностей, вы можете рассмотреть возможность использования функции мега-агента; см. Главу 8. Каждая сущность может иметь 30 тыс. различных записей, 200 синонимов на запись сущности. Агент Dialogflow имеет максимум 1 млн значений и синонимов сущностей.
Продвинутые пользовательские сущности
По умолчанию сопоставление сущностей требует точного совпадения одной из записей сущности. Если ваши клиенты неправильно напишут сущность, например, напечатают PayStation 4 вместо PlayStation 4, ясно, что была сделана опечатка. Нечеткое сопоставление (Fuzzy matching) позволяет вам идентифицировать неточные совпадения вашей сущности. Просто установите флажок Fuzzy Matching и сохраните тип сущности.
С помощью флажка разрешить автоматическое расширение вы позволяете Dialogflow извлекать другие параметры, отличные от тех, что были указаны в пользовательской сущности. Если мы используем ту же сущность video-game-platform, вы можете видеть, что мы не определяем запись сущности для «GBA / Gameboy Advanced». При включенном автоматическом расширении он принимает точный ввод пользователя и будет использовать его как параметр video-game-platform.
Также возможно создавать списки и составные сущности. Сущность-список можно сравнить с полем выбора (select dropdown) в HTML. Вы можете выбрать одно или несколько значений из списка. Например, я мог бы создать сущность FirstPersonShooter Games со значениями:
- Call of Duty
- PUBG
- Fortnite
- Battlefront
- Doom
Как видно на Рисунке 3-7, допустим, я скажу чат-боту: «Мои любимые игры — Call of Duty, Fortnite и PUBG». Параметр, который получил извлеченные значения (которые будут отправлены на бэкэнд), будет выглядеть как массив:
fps_games = ["Call of Duty", "Fortnite", "PUBG"]
Рисунок 3-7. Создание пользовательских сущностей-списков. Обратите внимание на значение в симуляторе; это массив значений!
Составная сущность — это более продвинутый объект; составная сущность может состоять из других сущностей. Допустим, у меня есть сущность под названием @product, которая состоит из других пользовательских сущностей:
@platform @product_edition @product_color
Как видно на Рисунке 3-8, допустим, я спрошу чат-бота: «Я хотел бы купить PlayStation 4 Pro Black edition». Параметр, который получил извлеченные значения (которые будут отправлены на бэкэнд), теперь будет выглядеть как объект JSON:
product = {
platform: "Playstation 4",
product_color: "Black",
product_edition: "Pro"
}
Рисунок 3-8. Создание составных сущностей, обратите внимание на значение в симуляторе, которое является объектом!
Чтобы создать составные сущности, вам нужно будет отключить флажок синонимов, а затем вы можете начать ссылаться на другие сущности, используя нотацию @.
Последняя более продвинутая функция — это регулярные выражения в сущностях.
Некоторым сущностям нужно сопоставлять шаблоны, а не конкретные термины — например, национальные идентификационные номера, идентификаторы, номера продуктов, номерные знаки и так далее. С помощью сущностей regexp вы можете предоставлять регулярные выражения для сопоставления.
Он использует движок RE2 от Google, библиотеку программного обеспечения для регулярных выражений через конечный автомат. Конечный автомат (FSM) — это математическая модель вычислений. Это абстрактная машина, которая может находиться ровно в одном из конечного числа состояний в любой момент времени. Поэтому он работает немного иначе по сравнению с другими движками регулярных выражений. Вы можете найти ссылку на синтаксис в разделе «См. также».
Вам нужно будет включить флажок regex; это автоматически отключит синонимы, и вы можете начать писать регулярные выражения в качестве значений записей (см. Рисунок 3-9), например:
(MS|Nintendo|Sony)\d{8}
поймает: MS12345678
- Фиксированное слово, Sony, Nintendo или MS
- Цифры
- Повторить последнее, восемь раз
Рисунок 3-9. Создание сущностей regex
Исходный код для этой книги доступен на GitHub через страницу продукта книги, расположенную по адресу www.apress.com/978-1-4842-7013-4.
Сущности, которые я использовал для этих примеров:
- @fps_games
- @platform
- @product
- @products_color
- @products_edition
- @producttype
Создание намерений с сущностями в обучающих фразах
Обычно, когда вы хотите создать новые намерения, и эти намерения должны извлекать ваши предопределенные пользовательские сущности, вы сначала убедитесь, что сущности были созданы.
Затем, в ваших обучающих фразах намерения, вы можете начать подавать ему примеры. Dialogflow автоматически аннотирует переменные объекты на основе того, что объявлено в ваших сущностях.
Когда Dialogflow начинает помечать определенные слова в обучающих фразах (Рисунок 3-10), вы будете знать, что извлечение сработало. В противном случае вы можете выбрать слова из обучающих фраз и начать помечать их самостоятельно, указывая на правильные сущности из всплывающего окна.
Рисунок 3-10. Наведите курсор на слово в обучающей фразе и назначьте ему пользовательскую или системную сущность
Помеченные сущности должны быть назначены параметрам. Это то, что вы получите в бэкэнд-системе, когда включите выполнение. В симуляторе Dialogflow вы можете нажать кнопку Diagnostic Info, как только вы отправите текстовый запрос.
Это покажет вам ответ RAW API JSON, как видно в Листинге 3-3.
Листинг 3-3. Ответ RAW API JSON, обратите внимание на раздел параметров
{
"responseId": "5c1ccce4-6445-42fc-be98-fa37f726d633-0f0e27e1",
"queryResult": {
"queryText": "What are the latest releases for Switch?",
"parameters": {
"platform": [
"switch"
]
},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"intent": {
"name": "projects/dialogflowcookbook/agent/intents/188fe06c-e630-494a-8fff-961d0d73866e",
"displayName": "Get_Release_Games"
},
"intentDetectionConfidence": 1,
"languageCode": "en"
}
}
Назначение параметров обычно происходит автоматически, после аннотации сущности в обучающей фразе, но если это не сработало, вы можете настроить следующее. См. Таблицу 3-1, которая описывает все настройки сущности.
Имя настройки | Описание |
---|---|
имя действия | Вы можете указать имя действия, которое будет показано в ответе API (queryResult). |
флажок "обязательно" | Если сущность необходима для завершения разговора, этот флажок должен быть установлен. |
имя параметра | Ключ параметра показывает, как он будет показан в ответе API. |
имя сущности | Сущность, с которой он был сопоставлен. Это может быть системная сущность. |
значение | Значение извлечения для сущности из высказывания пользователя. |
флажок "список" | Если это сущность-список, вам нужно будет включить этот флажок, чтобы получить массив в качестве параметра. |
подсказка | Когда установлен флажок "обязательно", вы можете ввести уточняющий вопрос, чтобы спросить отсутствующий требуемый параметр. |
Сохранение контекста
Контекст представляет собой дополнительную информацию, включенную во ввод пользователя или в намерение, возвращаемое API Dialogflow.
Существует два способа установки контекста: с помощью уточняющих вопросов или путем ручной установки ввода и вывода.
Dialogflow может запоминать контекст. Например, давайте рассмотрим этот поток:
«Давай поговорим подробнее о любимых играх».
> «Какая твоя любимая игра?»
«Это Call of Duty Modern Warfare».
> «О, я играл в нее. Ты застрял в игре? Нужна помощь?»
«Ты знаешь хорошее прохождение для 4-го уровня этой игры?»
> «Вот видео прохождения Call of Duty Modern Warfare 4-го уровня на YouTube».
В предыдущем сценарии «разговор о любимых играх» контекст управляется через уточняющие вопросы. Разговор принимает различные обороты; они автоматизированы как уточняющий ответ на вопросы (из Dialogflow или вашего кода выполнения). Он продолжит разговор.
Как и человек, Dialogflow может помнить, что во второй и третьей смене реплик «игра» относится к Call of Duty Modern Warfare. Он может отслеживать предыдущие высказывания пользователя. Другими словами, контексты полезны для различения пользовательского ввода, который может быть расплывчатым. Контексты также могут быть установлены через дополнительные детали из вашего приложения, такие как настройки пользователя и предпочтения, предыдущий ввод пользователя, когда пользователь находится в вашем приложении, географическое местоположение и так далее.
Также возможно устанавливать контексты для других намерений разговора, не управляя разговором. Вы можете парковать параметры в контекстах на потом. Для этого и предназначена ручная установка ввода и вывода. Подумайте об этом сценарии:
«Самая первая игра, в которую я играл, была Doom».
> «А, да, я тоже играл в нее».
... (Тем временем, возможно, были заданы другие типы вопросов.)
«Самая первая игровая консоль, которую я купил, была Dreamcast».
> «Это там ты играл в Doom?»
Возможно иметь максимум пять входных контекстов на намерение и максимум тридцать выходных контекстов на намерение, так как к намерению может быть применено несколько выходных контекстов. Когда намерение сопоставляется, все используемые выходные контексты для намерения становятся активными.
Настройка последующих намерений
Настроить последующие намерения довольно просто. Вы начнете с создания нового намерения. Вам нужно будет убедиться, что ваш ответ заканчивается еще одним вопросом, чтобы продолжить разговор. Нажмите Сохранить.
Вернитесь на страницу обзора намерений.
Наведите курсор мыши на ранее созданное (новое) намерение. (См. Рисунок 3-11.)
Появится гиперссылка Добавить последующее намерение.
Рисунок 3-11. Настройка следующих намерений
Когда вы щелкнете ссылку добавить последующее намерение, появится всплывающее окно (Рисунок 3-12) со всеми опциями последующих намерений.
Рисунок 3-12. Использование предопределенных последующих намерений
Нажмите custom.
Вы увидите, что было создано новое дочернее намерение, вложенное под вашим первым намерением. (См. Рисунок 3-13.)
Рисунок 3-13. Вложение последующих намерений
Вы можете щелкнуть дочернее намерение и продолжить, предоставляя обучающие фразы и ответы (и вкладывать еще глубже, используя ту же процедуру).
При открытии этих дочерних намерений вы заметите, что входные и выходные контексты автоматически устанавливаются с предопределенными именами и номерами счетчиков времени жизни по умолчанию. (См. Рисунок 3-14.)
Входной контекст в родительском всегда пуст. Дочерние намерения используют входной контекст для предоставления предыдущего (родительского) намерения. Выходной контекст может быть последним намерением, если в разговоре нет выходных контекстов (см. Рисунок 3-14).
Рисунок 3-14. Предопределенный контекст в последующих намерениях
Существуют различные типы предопределенных последующих вопросов на выбор. Преимущество использования предопределенного последующего намерения заключается в том, что оно поставляется с обучающими фразами из коробки на всех поддерживаемых языках Dialogflow. Таблица 3-2 показывает обзор различных последующих намерений.
Последующее намерение | Описание |
---|---|
custom | Напишите свои пользовательские выражения. |
fallback | Резервное намерение, если никакое другое выражение не вызвано. |
yes | Общие выражения для захвата утвердительного ответа. |
no | Общие выражения для захвата отрицательного ответа. |
later | Общие выражения, чтобы сделать что-то позже. |
cancel | Общие выражения для отмены действия или выхода. |
more | Общие выражения для получения дополнительной информации или управления списками. |
Ручная установка ввода и вывода в «обычных» намерениях
Вместо использования последующих намерений вы также можете указать ввод и вывод самостоятельно в «обычных» намерениях.
Создайте новое намерение, если это намерение должно сохранить параметр пользователя в контексте для последующего использования. Вы можете указать имя в выводе.
Когда вы создаете другое новое намерение, которому нужно что-то сделать с сохраненным контекстом, вам нужно будет указать то же имя контента, что и раньше, но теперь во вводе.
Входные контексты в намерении имеют основную функцию: они ограничивают срабатывание этого намерения, когда контекст неактивен.
Примечание: Если вы применяете более одного входного контекста к намерению, они работают по логике И. Это означает, что оба контекста должны быть активны, если вы хотите, чтобы это намерение было вызвано.
Время жизни
Контексты не активны вечно в сеансе чата; они существуют при определенных критериях времени жизни:
- Контексты истекают, когда сопоставляется намерение и контекст был извлечен.
- После количества запросов DetectIntent, указанного параметром lifespan_count.
- Через 20 минут, если для запроса DetectIntent не сопоставлены никакие намерения.
Время жизни по умолчанию составляет пять шагов разговора для обычных намерений, где ввод и вывод устанавливаются вручную. Время жизни по умолчанию для последующих намерений составляет два шага разговора. Вы можете переопределить значения по умолчанию, выбрав номер времени жизни (Рисунок 3-15) и введя новый номер счетчика времени жизни.
Рисунок 3-15. Номер времени жизни
Когда вы выходите из сеанса чата, ваш контекст будет потерян. Если вы хотите как-то сохранить это для следующего визита вашего пользователя, вам понадобится бэкэнд-код выполнения, который получает и устанавливает контекст через SDK и сохраняет его, например, в базе данных. Обычно это работает при работе с входом пользователей в систему.
Примечание: Существуют некоторые лучшие практики для именования контекстов:
- Используйте буквенно-цифровые имена (например, mycontext1).
- Используйте - или _ вместо пробелов (my_context1/my-context1).
- Имена не чувствительны к регистру (myContext123 и mycontext123 считаются эквивалентными).
- Все имена контекстов в нижнем регистре при использовании API (mycontext123).
Сохранение контекста с помощью SDK
В реальном приложении вы будете извлекать параметры контекста через SDK в коде выполнения.
Фактически, если мы посмотрим на предыдущий сценарий, возможно, что пользователь сначала запустит намерение игровой консоли. Таким образом, первая игра еще не была установлена в контексте. Когда вы работаете с SDK в коде выполнения, вы можете проверить, был ли установлен контекст для first-game-chosen, и если да, то ваш ответ будет другим.
Если вы хотите получить контекст через SDK, вы можете получить это из вызова detectIntent типа Sessions. Он будет содержать поле queryResult.outputContexts, которое предоставит список всех активных контекстов.
Иногда вы можете захотеть установить контекст во время выполнения из вашего кода выполнения вместо разработки контекста в намерениях из консоли Dialogflow. Например, возможно, вы хотите захватить местоположение устройства, пока пользователь взаимодействует с вашим (живым) агентом. Вы бы просто сделали вызов запроса detectIntent и указали queryParams.context как объект.
Листинг 3-4 показывает, как будет выглядеть JSON для запроса detectIntent.
Листинг 3-4. Пример POST-запроса detectIntent
POST https://dialogflow.googleapis.com/v2/{session=projects/*/agent/sessions/*}:detectIntent
{
"queryInput": {
"text": {
"languageCode": "en-US",
"text": "I would like to add pizza to my shopping cart."
}
},
"queryParams": {
"contexts": [
{
"name": "projects/project-id/agent/sessions/session-id/contexts/product-chosen",
"lifespanCount": 5,
"parameters": {
"product": "Pizza",
"device-location": "@52.3377871,4.8698096,17z"
}
}
]
}
}
Однако возможно указывать на параметры контекста в консоли Dialogflow как жестко закодированные тексты ответов. Нотация выглядит так: #context-name.$parameter-name. Если параметр указан в последнем ответе (вместо контекста), вы можете сослаться на него с помощью долларовой нотации: $parameter-name.
Например, вот прохождение видео на YouTube для #fav-game-chosen.$fav-game уровня: $level.
Тестирование в симуляторе
Вы можете вести разговор со своим агентом Dialogflow, говоря или печатая сообщения в симуляторе Dialogflow в любое время (Рисунок 3-16). Это полезный инструмент для проверки того, что ваш агент ведет себя так, как ожидалось.
Симулятор Dialogflow находится в правой части экрана.
Вверху вы можете начать писать свои пользовательские высказывания или произнести их. Он имеет встроенную интеграцию с микрофоном браузера. Чтобы использовать это, новым пользователям нужно будет разрешить всплывающее окно разрешений микрофона при загрузке Dialogflow.
Рисунок 3-16. Тестирование в симуляторе
Раздел «Пользователь говорит» возвращает результаты встроенной модели Dialogflow Speech to Text, захваченные при использовании функции микрофона. В противном случае он повторяет введенный текстовый запрос.
Как только намерение было сопоставлено, блок ответа по умолчанию покажет ответ из Dialogflow или возвращенный из выполнения.
Существует выпадающий список интеграций; если у вас включен Google Assistant или любая другая интеграция, вы увидите вывод из этих каналов. (Это может отличаться в зависимости от того, как вы ввели это в ответе намерения.)
Когда включен Text to Speech (на вкладке Настройки ➤ Речь), определенные языки могут иметь автоматический аудиоответ; он синтезирует текст ответа. Вы можете нажать кнопку воспроизведения, чтобы услышать аудио-голос. Аудио-голос можно настроить на вкладке Речь, если вы хотите слушать другой голос или с другой скоростью.
Далее вниз вы увидите сопоставленное намерение со ссылкой для открытия страницы намерения Dialogflow, если вы хотите его отредактировать.
Под этим находится блок с действием и параметрами. Через извлечение сущностей собранные значения будут отправлены в виде пар ключ-значение на бэкэнд, если включено выполнение.
Именно поэтому есть кнопка Diagnostic Info. Когда вы нажмете эту кнопку, вы получите необработанный ответ API JSON (Рисунок 3-17). Это может быть полезно для тестирования/отладки; это то, что должен ожидать ваш бэкэнд-код при интеграции с SDK Dialogflow.
Рисунок 3-17. Предварительный просмотр Diagnostic info ➤ RAW API ответа
Резюме
Эта глава предоставила вам всю информацию о концепциях Dialogflow Essentials.
Она рассматривает следующие задачи:
- Вы хотите добавить части разговора к своему агенту Dialogflow, чтобы обучить модель Dialogflow с помощью намерений.
- Вы хотите создать пользовательские предопределенные переменные объекты (сущности).
- Вы хотите извлекать переменные объекты из разговора с помощью предопределенных сущностей.
- Вы хотите разрешить смену реплик и сохранить контекст в разговоре.
- Вы хотите проверить, правильно ли работает ваш агент Dialogflow.
Если вы хотите создать этот пример, исходный код для этой книги доступен на GitHub через страницу продукта книги, расположенную по адресу www.apress.com/978-1-4842-7013-4. Ищите папку _dialogflow-agent.
Намерения, которые я использовал для примеров намерений:
- Collect_Current_Playing_Game
- Collect_Fav_Game
- Collect_Fav_Multiplayer_Game
Намерения, которые я использовал для примеров сущностей:
- Get_Release_Games
- Get_Favorite_FPS_Games
- Buy_Console
Намерения, которые я использовал для примеров контекста:
- GetWalkthrough-Context-FollowUp
- MyFirstGame-SetContext
- MyFirstGame-Console-GetContext
Дополнительные материалы
- Документация Dialogflow по намерениям
https://cloud.google.com/dialogflow/es/docs/intents-overview - Документация Dialogflow по обучающим фразам
https://cloud.google.com/dialogflow/es/docs/intents-training-phrases - Документация Dialogflow по событиям
https://cloud.google.com/dialogflow/es/docs/events-overview - Документация Dialogflow по пользовательским событиям
https://cloud.google.com/dialogflow/es/docs/events-custom - Документация Dialogflow по заполнению слотов
https://cloud.google.com/dialogflow/es/docs/fulfillment-webhook-slot-filling - Документация Dialogflow по сущностям
https://cloud.google.com/dialogflow/es/docs/entities-overview - Документация Dialogflow по пользовательским сущностям
https://cloud.google.com/dialogflow/es/docs/entities-custom - Документация Dialogflow по системным сущностям
https://cloud.google.com/dialogflow/es/docs/entities-system - Документация по автоматическому расширению
https://cloud.google.com/dialogflow/es/docs/entities-options#expansion - Документация по составным сущностям
https://cloud.google.com/dialogflow/es/docs/entities-options#comp - Документация по сущностям-спискам
https://cloud.google.com/dialogflow/es/docs/intents-actions-parameters#lists - Документация по сущностям regex
https://cloud.google.com/dialogflow/es/docs/entities-regexp - Синтаксис регулярных выражений RE2
https://github.com/google/re2/wiki/Syntax - Документация Dialogflow по контексту
https://cloud.google.com/dialogflow/es/docs/contexts-overview - Документация Dialogflow по входным и выходным контекстам
https://cloud.google.com/dialogflow/es/docs/contexts-input-output - Документация Dialogflow по последующим намерениям
https://cloud.google.com/dialogflow/es/docs/contexts-follow-up-intents
https://cloud.google.com/dialogflow/es/docs/reference/follow-up-intent-expressions - Документация SDK по установке и получению контекстов
https://cloud.google.com/dialogflow/es/docs/reference/rpc/google.cloud.dialogflow.v2beta1#google.cloud.dialogflow.v2beta1.Contexts
Другие статьи по этой теме:
- Практическое руководство по созданию агентов ИИ
- Выявление и масштабирование сценариев использования ИИ
- Агенты ИИ