Список чтения с выполнением Dialoglfow из базы данных в реальном времени - PullRequest
0 голосов
/ 11 декабря 2018

Я создаю чат-бота с помощью Dialogflow и встроенного редактора Dialogflow (для облачных функций и базы данных Firebase «База данных в реальном времени»).Я буду интегрировать этого чат-бота с Google Assistant.

Мне нужно прочитать список из базы данных, в которой список имеет несколько дочерних элементов, у немногих из них есть дочерние элементы, а у немногих дочерних элементов есть дочерние элементы.Поскольку выходные данные являются списком и состоят из длинного текста, произнесение всех данных за один раз займет слишком много времени.Поэтому я хотел бы вывести одного ребенка из списка и попросить у пользователя разрешения (Да / Нет) как «Хотите ли вы читать следующего?».Если пользователь скажет «Да», я продолжу читать также до конца.И если пользователь скажет «Нет», я вызову событие.Запрашивать разрешение у пользователя - это правда, прежде чем читать дочерний, даже дочерний, и даже дочерний дочерний элемент.

Подход, который я выбрал, заключается в создании отдельной записи БД для каждого пользователя при первом запросе списка, чтобы отслеживать, где он находится в списке.Когда пользователь говорит «да», получите идентификатор текущего элемента пользователя из базы данных, получите следующий элемент в списке (верните его пользователю с помощью agent.add), а затем обновите запись базы данных пользователя до идентификатора следующего элемента и т. Д., Покапользователь достигает конца списка.После agent.add() запросите разрешение у пользователя agent.setFollowupEvent().Если пользователь говорит нет, просто сбросьте / удалите запись БД для этого пользователя.

Несколько вопросов, которые я хотел бы задать:

  • Как я могу идентифицировать каждого пользователя как личность: по некоторому идентификатору, сеансу или чему-то еще?
  • Когда я запускаю приведенный ниже код в облачной функции return, agent.add переопределяется на agent.setFollowupEvent.Как мне это остановить?
agent.add('I will print the list here!');
agent.setFollowupEvent('SOME_EVENT'); //invoking an intent to ask for the permission. 

1 Ответ

0 голосов
/ 11 декабря 2018

У вас есть несколько вопросов, которые вы пытаетесь поднять здесь, в дополнение к той, с которой вы имеете дело.Глядя на каждый:

Как я могу остановить setFollowupEvent() от переопределения сообщения, которое я установил?

Вы не делаете.Весь смысл setFollowupEvent() состоит в том, чтобы переключиться на другое намерение вместо того, которое сейчас обрабатывается.

Большую часть времени вы думаете, что хотите setFollowupEvent(), вы, вероятно, этого не делаете.Не используйте его.

Итак, как мне добавить вопрос в конце того, что я говорю?

Просто задайте его.

Действительно, это так просто.

Вы можете включить его в строку, которую вы отправляете на agent.add(), или (в зависимости от деталей) вы можете сделать секунду add() с подсказкой.

Но разве мне не нужно вызывать намерение, чтобы получить ответ?

Нет.Это не то, для чего предназначен Intent.

Intents захватывает то, что пользователь говорит , а не то, что вы спрашиваете или что делает ваш агент.Ваше выполнение делает что-то, основываясь как на инициируемом намерении, так и на остальной части состояния, которое вы знаете о разговоре.Но Намерение - только один бит этой информации.

Вы упомянули состояние пользователя.Как я могу отслеживать состояние пользователя во время разговора?

Поскольку похоже, что вы используете библиотеку dialogflow-fulfillment, самый простой способ - сохранить ваше состояние в параметрах в Контекст с очень большой продолжительностью жизни (или тем, что вы продолжаете обновлять).

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

Если я выполняю эту работу, нужна ли мне база данных?

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

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

...