Сохранение данных в разговоре (Dialogflow)

Исследуйте в Dialogflow

Нажмите «Продолжить» , чтобы импортировать наш образец данных сохранения в Dialogflow. Затем выполните следующие действия, чтобы развернуть и протестировать образец:

  1. Введите имя агента и создайте новый агент Dialogflow для примера.
  2. После завершения импорта агента нажмите Перейти к агенту .
  3. В главном навигационном меню перейдите в раздел «Выполнение» .
  4. Включите встроенный редактор и нажмите «Развернуть» . Редактор содержит пример кода.
  5. В главном меню навигации выберите «Интеграции» и нажмите «Google Ассистент» .
  6. В появившемся модальном окне включите автоматический просмотр изменений и нажмите «Тест» , чтобы открыть симулятор действий.
  7. В симуляторе введите Talk to my test app , чтобы протестировать образец!
Продолжить

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

Требования немного различаются в зависимости от того, нужно ли вам сохранять данные внутри разговора или между разговорами. Чтобы сохранить данные в разговоре, вы можете использовать поле conversationToken вашего объекта AppResponse .

Чтобы сохранить данные между разговорами, вместо этого выполните следующие действия:

  1. Определите, проверен ли пользователь или является гостем.
  2. Храните пользовательские данные или получайте к ним доступ, используя поле userStorage вашего объекта AppResponse .

Сохранение данных между раундами разговора

Поле conversationToken — это строка, содержащая непрозрачный токен, который повторно передается в действие при каждом ходе разговора. Например, если вы установили значение "count=1" в вашем AppResponse для первого этапа диалога, AppRequest , полученный вашим действием для второго этапа диалога, будет содержать "count=1" в его conversationToken .

Токен всегда инициализируется пустой строкой в ​​начале диалога. Если вы используете клиентскую библиотеку Actions on Google Node.js , вы можете взаимодействовать с токеном разговора как с объектом JSON, используя conv.data , где conv — это ваш экземпляр Conversation .

В следующем примере показано, как сохранить счетчик в поле conversationToken вашего AppResponse :

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика, который использует outputContexts вместо conversationToken .

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

Практический пример использования см. в нашем руководстве «Предоставьте полезные подсказки и изящно провалите неудачу ».

Сохранение данных во время разговоров

Поле userStorage вашего объекта AppResponse представляет собой строку, содержащую непрозрачный токен, предоставленный действием, который сохраняется во всех разговорах для конкретного пользователя. Например, игра может сохранять наивысший балл пользователя в userStorage и использовать его значение в приветственном сообщении каждый раз, когда пользователь начинает новый разговор.

Определение и обработка статуса проверки пользователя

Статус проверки пользователя может иметь значение GUEST или VERIFIED . В начале каждого разговора Actions on Google устанавливает статус проверки пользователя на основе различных индикаторов начала разговора. Например, пользователь, вошедший в Google Assistant на своем мобильном устройстве, имеет статус проверки VERIFIED .

Ниже приведены возможные причины, по которым пользователь имеет статус проверки GUEST :

  • У пользователя отключены персональные результаты .
  • Пользователь отключил свою историю приложений и веб-поиска . Имейте в виду, что у некоторых пользователей этот параметр может быть отключен на уровне домена.
  • Если на устройстве включена функция Voice Match, и сопоставление не удалось или пользователь вызывает Ассистента, не используя свой голос (например, долгое нажатие на Google Home).
  • Пользователь не вошел в систему.

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

Если вы используете клиентскую библиотеку Actions On Google для Node.js , вы можете взаимодействовать с пользовательским хранилищем как объект JSON, используя conv.user.storage , где conv — это ваш экземпляр Conversation . В следующем примере показано, как сохранить счетчик в поле userStorage вашего AppResponse :

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Джава

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

Практический пример использования см. в нашем руководстве «Персонализация разговора с учетом предпочтений пользователя ».

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

Срок действия хранилища пользователя

Когда Ассистент может сопоставить идентификатор с пользователем, срок действия содержимого userStorage никогда не истекает, и только пользователь или само действие могут его очистить.

Если Ассистент не может сопоставить личность пользователя, содержимое userStorage очищается в конце разговора. Вот несколько примеров случаев, когда Ассистент не может сопоставить личность пользователя:

  • Голосовое совпадение настроено, но совпадения нет.
  • Пользователь отключил персональные данные.

Очистите содержимое поля userStorage.

Вы можете очистить содержимое поля userStorage вашего действия, установив для поля resetUserStorage вашего AppResponse значение true. Если вы установите значение userStorage в пустую строку, значение userStorage останется неизменным на следующем этапе разговора. Это позволяет избежать отправки обратно всего userStorage по очереди, где его содержимое не изменилось.

Если вы используете клиентскую библиотеку Actions On Google для Node.js , вы можете просто установить для conv.user.storage значение {} (пустой объект).

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Джава

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Джава

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

Обратите внимание, что приведенный ниже JSON описывает ответ веб-перехватчика.

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

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

  1. Откройте приложение «Ассистент» на своем телефоне.
  2. Нажмите значок ящика.

  3. На вкладке «Обзор» найдите действие, для которого вы хотите просмотреть или очистить пользовательское хранилище, и коснитесь его, чтобы открыть страницу сведений.
  4. Прокрутите страницу вниз.
    • Чтобы просмотреть содержимое поля userStorage , нажмите [Просмотр сохраненных данных] .
    • Чтобы удалить сохраненные данные пользователя, нажмите «Запретить $action запомнить меня» .