Zapisywanie danych w rozmowie (Dialogflow)

Przeglądaj w Dialogflow

Kliknij Dalej, aby zaimportować próbkę zapisanych danych w Dialogflow. Następnie wykonaj poniższe czynności, aby wdrożyć i przetestować przykład:

  1. Wpisz nazwę agenta i utwórz nowego agenta Dialogflow na potrzeby przykładu.
  2. Po zakończeniu importowania agenta kliknij Otwórz agenta.
  3. W głównym menu nawigacyjnym kliknij Fulfillment (Realizacja).
  4. Włącz Edytor wbudowany, a potem kliknij Wdróż. Edytor zawiera przykładowy kod.
  5. W głównym menu nawigacyjnym kliknij Integracje, a następnie Asystent Google.
  6. W wyświetlonym oknie modalnym włącz Automatyczny podgląd zmian i kliknij Przetestuj, aby otworzyć symulator Actions.
  7. W symulatorze wpisz Talk to my test app, aby przetestować próbkę.
Dalej

Jedną z korzyści zapewnianych użytkownikom jest często możliwość zapisywania danych między kolejnymi etapami rozmowy lub podczas wielu rozmów z użytkownikiem. Jest to przydatne, gdy przekazujesz pomocne powtórzenia w jednej rozmowie, zapisujesz wyniki gry w różnych sesjach lub zapamiętujesz drobne informacje dla użytkownika.

Wymagania różnią się nieznacznie w zależności od tego, czy chcesz zapisywać dane w rozmowie, czy w poszczególnych rozmowach. Aby zapisać dane w rozmowie, możesz użyć pola conversationToken obiektu AppResponse.

Aby zapisać dane w rozmowach, wykonaj te czynności:

  1. Ustal, czy użytkownik jest zweryfikowany czy gość.
  2. Przechowuj dane użytkownika lub uzyskują do nich dostęp w polu userStorage obiektu AppResponse.

Zapisywanie danych między kolejnymi etapami rozmowy

Pole conversationToken to ciąg znaków zawierający nieprzejrzysty token, który jest recyrkulowany w akcji przy każdym zakręcie rozmowy. Jeśli na przykład ustawisz wartość "count=1" dla pierwszego etapu rozmowy w AppResponse, to pole AppRequest otrzymane przez akcję w drugim kroku rozmowy będzie zawierać w conversationToken wartość "count=1".

Token jest zawsze inicjowany na początku rozmowy jako pusty ciąg. Jeśli używasz biblioteki klienta Actions on Google w środowisku Node.js, możesz połączyć się z tokenem rozmowy jako obiektem JSON za pomocą metody conv.data, gdzie conv to Twoje wystąpienie instancji Conversation.

Z przykładu poniżej dowiesz się, jak zapisać licznik w polu conversationToken interfejsu AppResponse:

Node.js

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

Java

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

Uwaga: poniższy kod JSON opisuje odpowiedź webhooka, która używa outputContexts zamiast 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

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

{
  "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}}"
}

Praktyczny przykład zastosowania znajdziesz w naszym przewodniku ze sprawdzonymi metodami publikowania pomocnych wniosków i powodów niepowodzeń.

Zapisywanie danych w rozmowach

Pole userStorage obiektu AppResponse to ciąg znaków zawierający nieprzejrzysty token dostarczony przez akcję, który jest zapisany w rozmowach konkretnego użytkownika. Na przykład gra może zapisać najwyższy wynik użytkownika w zasadzie userStorage i wykorzystać tę wartość w wiadomości powitalnej za każdym razem, gdy użytkownik rozpoczyna nową rozmowę.

Określanie stanu weryfikacji użytkownika i obsługa go

Stan weryfikacji użytkownika może mieć wartość GUEST lub VERIFIED. Na początku każdej rozmowy Actions on Google określa stan weryfikacji użytkownika na podstawie różnych wskaźników rozpoczęcia rozmowy. Przykład: użytkownik zalogowany w Asystencie Google na urządzeniu mobilnym ma stan weryfikacji VERIFIED.

Stan weryfikacji użytkownika GUEST może mieć jedną z tych przyczyn:

  • użytkownik wyłączył funkcję Twoje wyniki;
  • użytkownik wyłączył Aktywność w internecie i aplikacjach. Pamiętaj, że niektórzy użytkownicy mogą mieć wyłączone to ustawienie na poziomie domeny.
  • Jeśli na urządzeniu jest włączona funkcja Voice Match, a dopasowanie nie powiedzie się lub użytkownik wywoła Asystenta bez użycia głosu (np. przytrzymanie urządzenia Google Home).
  • Użytkownik nie jest zalogowany.

Zawsze sprawdzaj stan weryfikacji użytkownika przed zapisaniem danych w usłudze userStorage lub rozpoczęciem procesu łączenia kont, aby uniemożliwić gościom interakcję z funkcją, która dla nich nie powiedzie się.

Jeśli używasz biblioteki klienta Actions On Google dla Node.js, możesz używać pamięci użytkownika w postaci obiektu JSON, używając conv.user.storage, gdzie conv to wystąpienie Conversation. Z tego przykładu dowiesz się, jak zapisać licznik w polu userStorage w 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!`);
  }
});

Java

@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!`);
}

Java

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

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

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

JSON

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

{
  "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}}"
}

Praktyczny przykład zastosowania znajdziesz w artykule na temat personalizacji rozmowy na podstawie preferencji użytkownika w poradniku ze sprawdzonymi metodami.

Uwaga prawna: uzyskiwanie zgody przed uzyskaniem dostępu do usługi userStorage. W niektórych krajach deweloperzy muszą uzyskać zgodę użytkownika, zanim uzyskają dostęp do określonych informacji (np. danych osobowych) lub zapiszą je w usłudze userStorage. Jeśli prowadzisz działalność w jednym z tych krajów i chcesz uzyskać dostęp do tych informacji lub zapisać je w usłudze userStorage, musisz skorzystać z Asystenta do potwierdzania danych, aby poprosić użytkownika o zgodę i uzyskać jego zgodę, zanim zaczniesz przechowywać takie informacje w usłudze userStorage.

Wygaśnięcie miejsca na dane użytkownika

Gdy Asystent może dopasować tożsamość do użytkownika, zawartość userStorage nigdy nie wygasa i tylko użytkownik lub sama akcja może ją usunąć.

Gdy Asystent nie może dopasować tożsamości do użytkownika, treść usługi userStorage jest czyszczona po zakończeniu rozmowy. Oto kilka przykładów sytuacji, w których Asystent nie może dopasować tożsamości do użytkownika:

  • Skonfigurowano Voice Match i nie znaleziono dopasowania.
  • użytkownik wyłączył dane osobowe;

Wyczyść zawartość pola userStorage

Aby wyczyścić zawartość pola userStorage Akcja, ustaw w polu resetUserStorage wartość „true” (prawda).AppResponse Jeśli ustawisz wartość userStorage na pusty ciąg znaków, wartość userStorage pozostanie niezmieniona w następnym kroku wątku. Pozwoli Ci to uniknąć odsyłania całego userStorage w sytuacjach, gdy jego treść się nie zmieniła.

Jeśli używasz biblioteki klienta Actions On Google dla Node.js, możesz ustawić wartość conv.user.storage na {} (pusty obiekt).

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?`);
});

Java

@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?`);

Java

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

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

{
  "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

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

{
  "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\":{}}"
}

Jako użytkownik możesz wyświetlić zawartość pola userStorage w wywołanej akcji. Możesz też usunąć z niej przechowywane dane użytkownika, wyłączając opcję zapamiętywania Cię przez usługę.

  1. Otwórz aplikację Asystent na telefonie.
  2. Kliknij ikonę panelu.

  3. Na karcie Odkrywaj znajdź działanie, dla którego chcesz wyświetlić lub wyczyścić miejsce na dane użytkownika, i kliknij je, aby otworzyć stronę z informacjami.
  4. Przewiń stronę w dół.
    • Aby wyświetlić zawartość pola userStorage, kliknij [Wyświetl zapisane dane].
    • Aby usunąć przechowywane dane użytkownika, kliknij Wyłącz zapamiętywanie mnie przez użytkownika $action.