Выполнение определяет диалоговый интерфейс вашего действия для получения пользовательского ввода и логику для обработки ввода и в конечном итоге выполнения действия.
Определите свой разговор
Теперь, когда вы определили Actions , вы можете создать соответствующий диалог для этих Actions. Вы делаете это, создавая намерения Dialogflow, которые определяют грамматику или то, что пользователи должны сказать, чтобы вызвать намерение, и соответствующее выполнение для обработки намерения при его срабатывании.
Вы можете создать столько намерений, сколько захотите, чтобы определить грамматику всего вашего разговора.
Создание намерений
Нажмите знак + возле пункта меню «Намерения» в левой части навигации Dialogflow. Появится редактор намерений, в котором вы можете ввести следующую информацию:
- Имя намерения — это имя намерения, отображаемое в IDE.
- Контексты позволяют ограничить срабатывание намерения конкретными случаями. Прочтите документацию Dialogflow по контекстам для получения дополнительной информации.
- События вызывают намерения без необходимости пользователям что-либо говорить. Одним из примеров события является событие
GOOGLE_ASSISTANT_WELCOME
, которое позволяет Google Assistant вызвать ваше действие. Это событие используется в качестве Action по умолчанию для вашего Action. Дополнительную информацию о встроенных вспомогательных намерениях можно найти в нашей документации. - Тренировочные фразы определяют, что пользователи должны сказать (грамматику), чтобы вызвать намерение. Введите здесь несколько фраз (5–10) о том, что пользователи могут сказать, чтобы вызвать намерение. Dialogflow автоматически обрабатывает естественные варианты предоставленных вами примеров фраз.
Действие и параметры определяют, какие данные передавать для выполнения, если для этого намерения включено выполнение. Сюда входят данные, проанализированные на основе пользовательского ввода, и имя, которое вы можете использовать при выполнении, чтобы определить, какое намерение было активировано. Вы будете использовать это имя позже, чтобы сопоставить свое намерение с соответствующей логикой выполнения. Дополнительные сведения об определении действий см. в разделе «Действия и параметры» в документации Dialogflow.
Responses — это построитель ответов Dialogflow, в котором вы можете определить ответ на это намерение непосредственно в Dialogflow, не вызывая выполнения. Эта функция полезна для статических ответов, не требующих выполнения. Вы можете использовать это для отправки простых приветственных или прощальных сообщений. Тем не менее, вы, скорее всего, будете использовать выполнение, чтобы отвечать своим пользователям в большинстве случаев.
Выполнение указывает, хотите ли вы вызвать выполнение при срабатывании этого намерения. Скорее всего, вы включите это для большинства целей в своем агенте Dialogflow. Чтобы увидеть этот пункт в намерении, у вас должно быть включено выполнение для агента в меню «Выполнение» .
Создание ответов в Dialogflow
Для некоторых намерений вам может не потребоваться, чтобы ваше выполнение вернуло ответ. В этих случаях вы можете использовать построитель ответов в Dialogflow для создания ответов.
В области «Ответы» укажите текстовый ответ, который вы хотите вернуть пользователям. Текстовые ответы по умолчанию — это простые текстовые ответы TTS, которые могут работать в нескольких интеграциях Dialogflow. Ответы для Google Ассистента описаны на странице «Ответы» .
Создание ответов на выполнение заказов
Ваш код выполнения размещается в логике выполнения веб-перехватчика для действия. Например, в примере Silly Name Maker эта логика находится в index.js
для Cloud Function для Firebase.
Когда срабатывает намерение, использующее выполнение, вы получаете запрос от Dialogflow, содержащий информацию о намерении. Затем вы отвечаете на запрос, обрабатывая намерение и возвращая ответ. Этот запрос и ответ определяются вебхуком Dialogflow .
Мы настоятельно рекомендуем вам использовать клиентскую библиотеку Node.js для обработки запросов и возврата ответов. Вот общий процесс использования клиентской библиотеки:
- Инициализируйте объект Dialogflow . Этот объект автоматически обрабатывает прослушивание запросов и их анализ, чтобы вы могли обработать их при выполнении.
- Создайте функции для обработки запросов . Эти функции обрабатывают ввод пользователя и другие компоненты намерения и создают ответ для возврата в Dialogflow.
Инициализируйте объект Dialogflow
Следующий код создает экземпляр Dialogflow
и выполняет стандартную настройку Node.js для облачных функций Google:
'use strict'; const {dialogflow} = require('actions-on-google'); const functions = require('firebase-functions'); const app = dialogflow({debug: true}); app.intent('Default Welcome Intent', (conv) => { // Do things }); exports.yourAction = functions.https.onRequest(app);
public class DfFulfillment extends DialogflowApp { private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class); @ForIntent("Default Welcome Intent") public ActionResponse welcome(ActionRequest request) { // Do things // ... }
Создание функций для обработки запросов
Когда пользователи произносят фразу, вызывающую намерение, вы получаете запрос от Dialogflow, который обрабатываете с помощью функции, выполняющей ваше задание. В этой функции вы обычно выполняете следующие действия:
- Выполните любую логику, необходимую для обработки пользовательского ввода.
- Создайте свои ответы, чтобы реагировать на триггерные намерения. Учитывайте поверхность, которую ваши пользователи используют для построения соответствующих ответов. См. возможности поверхностей для получения дополнительной информации о том, как обеспечить реакцию на различные поверхности.
- Вызовите функцию
ask()
с вашим ответом.
В следующем коде показано, как создать два ответа TTS, которые обрабатывают намерение вызова ( input.welcome
) и намерение диалога ( input.number
), которое приветствует пользователя к вашему действию и отображает число, которое пользователь произнес для намерения Dialogflow. с именем:
const app = dialogflow(); app.intent('Default Welcome Intent', (conv) => { conv.ask('Welcome to number echo! Say a number.'); }); app.intent('Input Number', (conv, {num}) => { // extract the num parameter as a local string variable conv.close(`You said ${num}`); });
@ForIntent("Default Welcome Intent") public ActionResponse defaultWelcome(ActionRequest request) { ResponseBuilder rb = getResponseBuilder(request); rb.add("Welcome to number echo! Say a number."); return rb.build(); } @ForIntent("Input Number") public ActionResponse inputNumber(ActionRequest request) { ResponseBuilder rb = getResponseBuilder(request); Integer number = (Integer) request.getParameter("num"); rb.add("You said " + number.toString()); return rb.endConversation().build(); }
Пользовательский входной номер намерения, который сопровождает приведенный выше код, использует сущность @sys.number
для извлечения числа из высказываний пользователя. Затем намерение отправляет параметр num
, который содержит номер пользователя, в функцию при выполнении.
Вместо того, чтобы иметь отдельные обработчики для каждого намерения, вы можете добавить резервную функцию. Внутри резервной функции проверьте, какое намерение ее вызвало, и выполните соответствующие действия соответствующим образом.
const WELCOME_INTENT = 'Default Welcome Intent'; const NUMBER_INTENT = 'Input Number'; const NUMBER_PARAMETER = 'num'; // you can add a fallback function instead of a function for individual intents app.fallback((conv) => { // intent contains the name of the intent // you defined in the Intents area of Dialogflow const intent = conv.intent; switch (intent) { case WELCOME_INTENT: conv.ask('Welcome! Say a number.'); break; case NUMBER_INTENT: const num = conv.parameters[NUMBER_PARAMETER]; conv.close(`You said ${num}`); break; } });
// you can add a fallback function instead of a function for individual intents @ForIntent("Default Fallback Intent") public ActionResponse fallback(ActionRequest request) { final String WELCOME_INTENT = "Default Welcome Intent"; final String NUMBER_INTENT = "Input Number"; final String NUMBER_ARGUMENT = "num"; // intent contains the name of the intent // you defined in the Intents area of Dialogflow ResponseBuilder rb = getResponseBuilder(request); String intent = request.getIntent(); switch (intent) { case WELCOME_INTENT: rb.add("Welcome! Say a number."); break; case NUMBER_INTENT: Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT); rb.add("You said " + num).endConversation(); break; } return rb.build(); }
Повторное приглашение без совпадений
Когда Dialogflow не может соответствовать ни одной из входных грамматик, определенных в ваших намерениях « Обучающие фразы », активируется резервное намерение. Резервные намерения обычно повторно предлагают пользователю ввести необходимые данные для вашего действия. Вы можете предоставить фразы повторного запроса, указав их в области «Ответ » резервного намерения, или вы можете использовать веб-перехватчик для предоставления ответов.
Если ответ пользователя не соответствует обучающим фразам вашего действия, Google Assistant пытается обработать введенные данные. Такое поведение позволяет пользователям менять действия в середине разговора. Например, пользователь спрашивает: «Какие фильмы идут на этой неделе?» а затем меняет контекст в середине разговора: «Какая завтра погода?» В этом примере, потому что «Какая завтра погода?» не является допустимым ответом на разговор, инициированный первоначальным запросом, Ассистент автоматически пытается обработать совпадение и переместить пользователя в соответствующий разговор.
Если Ассистент не может найти подходящее действие, соответствующее вводу пользователя, пользователь возвращается в контекст вашего действия.
Поскольку Ассистент может прервать ваше действие, чтобы отреагировать на допустимый сценарий несоответствия, не используйте резервные намерения как способ выполнения запросов пользователя. Вам следует использовать резервные намерения только для повторного запроса пользователя на действительный ввод.
Чтобы создать резервное намерение:
- Нажмите «Намерения» в меню навигации Dialogflow.
- Нажмите ⋮ рядом с надписью «Создать намерение» и выберите «Создать резервное намерение» . (Либо щелкните Резервное намерение по умолчанию, чтобы отредактировать его.)
Укажите фразы для повторного запроса, чтобы ответить пользователям. Эти фразы должны быть разговорными и быть максимально полезными для текущего контекста пользователя.
Чтобы сделать это без исполнения : Укажите фразы в области Ответ намерения. Dialogflow случайным образом выбирает фразы из этого списка, чтобы ответить пользователям, пока не сработает более конкретное намерение.
Чтобы сделать это с выполнением :
- Переключите Включить вызов веб-перехватчика для этого намерения в разделе « Выполнение намерения».
- В своей логике выполнения обрабатывайте резервное намерение так же, как и любые другие намерения, как описано в разделе Создание функций для обработки запросов .
Например, следующая функция использует объект
conv.data
(произвольные полезные данные, которые можно использовать для поддержания состояния) из клиентской библиотеки Node.js для хранения счетчика, который отслеживает, сколько раз срабатывает резервное намерение. Если оно сработало более одного раза, действие завершается. Хотя это не показано в коде, вам следует сделать так, чтобы другие намерения сбрасывали этот счетчик в 0, когда срабатывает намерение, не допускающее отката. (Подробную информацию о том, как это реализовать, см. в примере Number Genie .)Node.js app.intent('Default Fallback Intent', (conv) => { conv.data.fallbackCount++; // Provide two prompts before ending game if (conv.data.fallbackCount === 1) { conv.contexts.set(DONE_YES_NO_CONTEXT, 5); conv.ask('Are you done playing Number Genie?'); } else { conv.close(`Since I'm still having trouble, so I'll stop here. ` + `Let's play again soon.`); } });
Ява @ForIntent("Default Fallback Intent") public ActionResponse defaultFallback(ActionRequest request) { final String DONE_YES_NO_CONTEXT = "done_yes_no_context"; ResponseBuilder rb = getResponseBuilder(request); int fallbackCount = request.getConversationData().get("fallbackCount") == null ? 0 : (Integer) request.getConversationData().get("fallbackCount"); fallbackCount++; request.getConversationData().put("fallbackCount", fallbackCount); if (fallbackCount == 1) { rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5)); rb.add("Are you done playing Number Genie?"); } else { rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon") .endConversation(); } return rb.build(); }
Использование контекстов
Используйте контексты, если вы хотите, чтобы Dialogflow запускал резервные намерения только в определенных ситуациях. Это полезно, если вы хотите иметь разные резервные намерения для разных сценариев несоответствия.
- Если вы не задаете контексты для резервного намерения, оно считается глобальным резервным намерением, которое Dialogflow запускает, когда никакое другое намерение не соответствует. Вам следует определить только один из них, если вы решите его использовать.
Если вы устанавливаете контексты ввода для резервного намерения, Dialogflow запускает это резервное намерение, когда выполняются следующие условия:
- Текущие контексты пользователя представляют собой надмножество контекстов, определенных в намерении.
- Никакие другие намерения не совпадают.
Это позволяет использовать несколько резервных намерений с различными контекстами ввода, чтобы настроить повторное приглашение без совпадения для конкретных сценариев.
Если вы устанавливаете выходной контекст для резервного намерения, вы сохраняете пользователя в том же контексте после запуска и обработки резервного намерения.
Дополнительные сведения см. в разделе Контексты диалогового потока .
Повторное приглашение без ввода данных
См. страницу «Повторные запросы» для получения подробной информации о том, как действовать, когда пользователь не вводит дальнейшие данные на голосовом устройстве, таком как Google Home, которое требует постоянного взаимодействия.