Как использовать диалоговое окно Fulfillment Inline Editor для сохранения имен пользователей и настроений в базе данных в реальном времени? - PullRequest
0 голосов
/ 29 сентября 2018

Я построил действие в Google, используя диалоговое окно для целей выборки опыта.Идея такова: он спрашивает конкретных пользователей об их настроении 3 раза в день.Затем эти пользователи отправляют каждую неделю еженедельный обзор их настроения после того, как исследователи проанализировали его.

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

Я использую выполнение диалогового потока с index.js для подключения к базе данных Firebase для сохранения записей.Этот агент должен быть интегрирован как действие в Google

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

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с функциями, так как я совершенно незнаком с node.js или базами данных, но я должен сделать это таким образом.

Вот мой код.

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
'use strict';
 
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
 
 
 //initialise DB connection
 const admin = require('firebase-admin');
 admin.initializeApp();
 
 
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
 
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
 
   function saveName(agent) {
       const nameParam = agent.parameters.name;
       const context = agent.getContext('awaiting_name_confirm');
       const name = nameParam || context.parameters.name;
       agent.add('Hi ' + name + ' Are you ready to answer my question?' || 'Hi' + name + 'Have you got a moment for me? '  );
       //agent.add('Hi' + name + 'Have you got a minute for me? ');
       
       return admin.database().ref('/names').push({name: name}).then((snapshot)=>
       {
       
           console.log('database write sucessful: ' + snapshot.ref.toString());
       });
   }
 
  function saveMood(agent) {
       const moodParam = agent.parameters.mood;
       const mood = moodParam; 
       
       agent.add('That is good! keep it up. Thanks for sharing with me! Bye ');
       //agent.add('Hi' + name + 'Have you got a minute for me? ');
       
       return admin.database().ref('/moods').push({mood: mood}).then((snapshot)=>
       {
       
           console.log('database write sucessful: ' + snapshot.ref.toString());
       });
  }
   
  // Run the proper function handler based on the matched Dialogflow intent name
  let intentMap = new Map();
  intentMap.set('Get Name', saveName);
  intentMap.set('Confirm Name Yes', saveName);
  // intentMap.set('Confirm Name Yes', getName);
  intentMap.set('attentiveness', saveMood);

  agent.handleRequest(intentMap);
});

1 Ответ

0 голосов
/ 02 октября 2018

У вас есть несколько проблем в коде и подходе, которые вам нужно будет решить:

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

К счастью, вы делаете одну вещь, которая обычно пропускается - вы делаете свои звонки в базу данных, используя Promises.Так что эта часть работает.

Уникальная идентификация

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

  • Имя не является личностью.Что произойдет, если два человека с одинаковыми именами получат доступ к вашему действию?

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

  • Имена могут быть идентифицирующей личность информацией (PII), поэтому могут быть защищены дополнительными законами о конфиденциальности.

  • Пользователи могут захотеть закрыть свою учетную запись и не могут сделать это без «изменения» своего имени.

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

У вас есть несколько способов справиться с этим:

  • Если выРазрабатывая Google Assistant, вы также можете использовать Google Sign In for Assistant , который сообщит вам идентификатор пользователя Google, который вы можете использовать в качестве уникального идентификатора.Вы также получите их адрес электронной почты и имя как часть их профиля.

  • Вы можете запросить эту информацию (имя, адрес электронной почты и т. Д.) И сохранить ее под идентификатором пользователя, который вы генерируете илиимя пользователя, которое предоставляет пользователь.Этот идентификатор становится идентификатором.Если вы разрабатываете для Google Assistant, вы можете сохранить этот идентификатор в личном хранилище пользователя - только вы и пользователь имеете доступ к нему или можете удалить его.Если нет, вам может понадобиться использовать базу данных для поиска идентификатора.Подробнее об этом позже.

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

Использовать идентичность в одном сеансе

Если вы используете Google Sign In, вам не нужно беспокоиться об этом.Вы будете получать один и тот же идентификатор для каждого сеанса и для каждого вызова во время сеанса.

Если вы используете личное хранилище пользователя с помощью Google Assistant, вы получите его как часть объекта userStore.

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

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

Так что в вашей функции saveName() это может выглядеть примерно так:

   function saveName(agent) {
       const nameParam = agent.parameters.name;
       agent.add('Hi ' + nameParam + ' Are you ready to answer my question?');
       agent.setContext({
         name: 'user',
         lifespan: 99,
         parameters: {
           id: nameParam
         }
       };
   }

В качестве отступления - ваш обработчик, похоже, пытается определить, говорит ли это пользователь свое имя или подтверждает свое имя.Это, вероятно, лучше обрабатывать как отдельные намерения и отдельные обработчики.Попытка их объединить приведет к путанице.

Структурирование и доступ к вашей базе данных

У нас есть идентификатор.У нас есть пользователь, сообщающий данные.Как мы связываем эти два?

Существует много способов структурировать данные, и Firebase подробно разбирается в зависимости от того, как вы собираетесь их использовать, получать к ним доступ и делать их доступными для пользователей илидр.

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

Одна приятная вещь в базе данных Firebase заключается в том, что вы можете (в основном) рассматривать ее как объект Javascript.Если мы подумаем об этом таким образом, это может выглядеть примерно так:

{
  "user": {
    "id1":{...},
    "id2":{...},
    "id3":{
       "moods": [
         {"mood":"good"},
         {"mood":"tired"}
       ]
    },
    "id4":{...}
  }
}

И так далее.В Firebase мы будем ссылаться на настроения пользователя "id3" с помощью пути, например user/id3/moods.Если у нас есть идентификатор пользователя в переменной name, мы могли бы использовать следующий код для получения этой ссылки

var ref = admin.database().ref('user').ref(name).ref('moods');

, а затем использовать такой код, чтобы поместить объект с настроением в массив (и верните обещание, которое нам нужно сделать):

var obj = {
  mood: mood
};
return ref.push( obj ).then( snapshot => {
  // Do stuff, including acknowledge to the user you saved it.
});

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

...