Список чтения с выполнением Dialoglfow из базы данных в реальном времени
Я создаю чат-бота с помощью 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 ответ
У вас есть несколько вопросов, которые вы пытаетесь поднять здесь, в дополнение к той, с которой вы имеете дело. Глядя на каждого:
Как я могу остановиться setFollowupEvent()
от переопределения сообщения, которое я установил?
Вы не Весь смысл setFollowupEvent()
это переключиться на другое намерение вместо того, которое в настоящее время обрабатывается.
Большую часть времени вы думаете, что хотите setFollowupEvent()
вы, вероятно, нет. Не используйте это.
Итак, как я могу добавить вопрос в конце того, что я говорю?
Просто спроси это.
На самом деле, это так просто.
Вы можете включить его в строку, которую вы отправляете agent.add()
или (в зависимости от деталей) вы можете сделать секунду add()
с подсказкой.
Но мне не нужно вызывать намерение, чтобы получить ответ?
Нет. Это не то, для чего предназначен Намерение.
Intents - это то, что говорит пользователь, а не то, что вы спрашиваете или что делает ваш агент. Ваше выполнение делает что-то, основываясь как на инициируемом намерении, так и на остальной части состояния, которое вы знаете о разговоре. Но Намерение - только один бит этой информации.
Вы упомянули состояние пользователя. Как я могу отслеживать состояние пользователя во время разговора?
Так как похоже, что вы используете dialogflow-fulfillment
библиотека, самый простой способ - сохранить ваше состояние в параметрах в контексте с очень долгим сроком службы (или тем, что вы продолжаете обновлять).
Таким образом, при первом запуске вы можете проверить контекст. Если нет контекста или идентификатора, вы должны сгенерировать случайный идентификатор пользователя и сохранить его в контексте. Впоследствии вы будете использовать этот идентификатор для поиска информации о пользователе в базе данных в реальном времени.
Если я делаю эту работу, мне нужна база данных?
Нету! Если вы просто храните немного информации о пользователе, и эта информация просто продлит срок жизни разговора, вы можете сохранить все это непосредственно в параметрах контекста. Вы должны убедиться, что имена этих параметров не конфликтуют с какими-либо параметрами, имеющимися в ваших намерениях, но в противном случае они будут длиться дольше, чем это делает контекст.
Если вам нужно хранить информацию об этом человеке между разговорами, то вам нужно искать другие методы. Для действий доступен идентификатор пользователя, но он устарел и планируется удалить. Есть также поля хранения сеанса и хранения пользователя, которые Assistant делает доступными, но их немного сложнее использовать с помощью библиотеки dialogflow-выполнения, если они вам не нужны.