Realizacja kompilacji (Dialogflow)

Fulfillment określa interfejs konwersacyjny akcji, aby uzyskać dane wejściowe użytkownika oraz logikę przetwarzania danych wejściowych i wykonania akcji.

Definiowanie rozmowy

Po zdefiniowaniu akcji możesz utworzyć dla nich odpowiednią rozmowę. Można to zrobić, tworząc intencje Dialogflow, które definiują gramatykę lub informacje potrzebne użytkownikom do aktywowania intencji i odpowiedniej realizacji w celu przetworzenia intencji po jej wywołaniu.

Możesz utworzyć dowolną liczbę intencji, aby zdefiniować gramatyka całej rozmowy.

Tworzenie intencji

Kliknij znak + obok pozycji menu Intents (Intencje) w menu nawigacyjnym Dialogflow po lewej stronie. Pojawi się Edytor intencji, w którym możesz wpisać te informacje:

  • Nazwa intencji to nazwa intencji wyświetlanej w IDE.
  • Konteksty umożliwiają ograniczanie wyzwalania intencji do konkretnych przypadków. Więcej informacji znajdziesz w dokumentacji Dialogflow na temat kontekstów.
  • Zdarzenia wyzwalają intencje bez potrzeby mówienia przez użytkowników niczego. Jednym z przykładowych zdarzeń jest GOOGLE_ASSISTANT_WELCOME, które umożliwia Asystentowi Google wywołanie Twojej akcji. To zdarzenie jest używane jako domyślna akcja akcji. Więcej informacji o wbudowanych intencjach pomocniczych znajdziesz w naszej dokumentacji.
  • Wyrażenia na potrzeby trenowania określają, co użytkownicy muszą powiedzieć (gramatyka), aby aktywować intencję. Wpisz tutaj kilka wyrażeń (5–10) tego, co użytkownicy mogą powiedzieć, aby wywołać intencję. Dialogflow automatycznie obsługuje naturalne odmiany podanych przez Ciebie przykładowych wyrażeń.
  • Działanie i parametry określają, jakie dane mają być przekazywane do realizacji, jeśli w przypadku tej intencji jest włączona obsługa realizacji. Obejmuje to dane uzyskane na podstawie danych wejściowych użytkownika oraz nazwę, której możesz użyć w realizacji, aby wykryć, który zamiar został wywołany. Użyjesz tej nazwy później do zmapowania intencji na odpowiadającą jej logikę realizacji. Więcej informacji o definiowaniu Actions znajdziesz w sekcji Działania i parametry w dokumentacji Dialogflow.

  • Responses to narzędzie do tworzenia odpowiedzi Dialogflow, w którym można zdefiniować odpowiedź na tę intencję bezpośrednio w Dialogflow bez wywoływania realizacji. Ta funkcja jest przydatna w przypadku odpowiedzi statycznych, które nie wymagają realizacji. Możesz w nim umieścić proste wiadomości powitalne lub pożegnalne. Prawdopodobnie będziesz jednak używać realizacji, by odpowiadać użytkownikom w większości przypadków.

  • Pole Fulfillment określa, czy po wywołaniu tej intencji chcesz wywoływać realizację. Prawdopodobnie włączysz ją w przypadku większości intencji w agencie Dialogflow. Aby zobaczyć ten element w intencji, musisz mieć włączoną realizację dla agenta w menu Fulfillment.

Tworzenie odpowiedzi w Dialogflow

W przypadku niektórych intencji realizacja celu może nie odpowiadać. W takich przypadkach możesz użyć kreatora odpowiedzi w Dialogflow, aby utworzyć odpowiedzi.

W obszarze Odpowiedzi wpisz odpowiedź tekstową, którą chcesz zwrócić użytkownikom. Domyślne odpowiedzi tekstowe to proste odpowiedzi tekstowe TTS, które mogą działać w wielu integracjach Dialogflow. Odpowiedzi Asystenta Google znajdziesz na stronie Odpowiedzi.

Tworzenie odpowiedzi na potrzeby realizacji zamówień

Kod realizacji jest hostowany w logice realizacji webhooka dla akcji. Na przykład w przykładzie z serwisu Silly Name Maker ta logika znajduje się w index.js funkcji w Cloud Functions dla Firebase.

Po uruchomieniu intencji, która korzysta z realizacji, otrzymasz z Dialogflow żądanie zawierające informacje o tej intencji. Aby odpowiedzieć na żądanie, przetwarza intencję i zwraca odpowiedź. To żądanie i odpowiedź są definiowane przez webhook Dialogflow.

Do przetwarzania żądań i zwracania odpowiedzi zdecydowanie zalecamy używanie biblioteki klienta w środowisku Node.js. Oto ogólne instrukcje korzystania z biblioteki klienta:

  1. Zainicjuj obiekt Dialogflow. Ten obiekt automatycznie obsługuje nasłuchiwanie żądań i ich analizowanie, co pozwala na ich przetworzenie w ramach realizacji.
  2. Utwórz funkcje do obsługi żądań. Te funkcje przetwarzają dane wejściowe użytkownika i inne komponenty intencji oraz tworzą odpowiedź umożliwiającą powrót do Dialogflow.

Inicjowanie obiektu Dialogflow

Ten kod tworzy instancję Dialogflow i przeprowadza prostą konfigurację Node.js dla Google Cloud Functions:

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

Tworzenie funkcji do obsługi żądań

Gdy użytkownicy wypowiedzą wyrażenie wywołujące intencję, otrzymasz z Dialogflow żądanie, które obsługujesz za pomocą funkcji w ramach realizacji. Ta funkcja pozwala zwykle wykonać te czynności:

  1. Wykonaj wszystkie działania wymagane do przetworzenia danych wejściowych użytkownika.
  2. Twórz odpowiedzi, aby reagować na wyzwalane intencje. Weź pod uwagę powierzchnię, której użytkownicy używają do tworzenia odpowiednich odpowiedzi. Więcej informacji o obsłudze odpowiedzi na różnych platformach znajdziesz w sekcji o funkcjach interfejsu.
  3. Wywołaj funkcję ask() z odpowiedzią.

Poniższy kod pokazuje, jak utworzyć 2 odpowiedzi TTS obsługujące intencję wywołania (input.welcome) i intencję dialogową (input.number), która powita użytkownika w akcji i odtworzy numer wypowiedziany przez użytkownika na potrzeby intencji Dialogflow z nazwą:

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

Numer wejścia intencji niestandardowej, który jest dołączony do powyższego kodu, używa encji @sys.number do wyodrębniania liczby z wypowiedzi użytkownika. Intencja wysyła następnie parametr num, który zawiera numer użytkownika, do funkcji w ramach realizacji.

Zamiast mieć osobne moduły obsługi dla każdej intencji, możesz dodać funkcję zastępczą. W funkcji kreacji zastępczej sprawdź, która intencja ją wywołała, i wykonaj odpowiednie czynności.

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

Ponowne żądanie bez dopasowania

Gdy Dialogflow nie może dopasować żadnej gramatyki wejściowej zdefiniowanej w wyrażeniach treningowych intencji, wywołuje intencję zastępczą. Intencje zastępcze zazwyczaj zalecają użytkownikowi podanie danych wejściowych niezbędnych do wykonania działania. Frazy ponownego wskazywania możesz podawać, określając je w obszarze Response intencji zastępczej. Możesz też używać webhooka do przekazywania odpowiedzi.

Gdy odpowiedź użytkownika nie pasuje do wyrażeń treningowych akcji, Asystent Google próbuje je obsłużyć. Ułatwia to użytkownikom zmienianie czynności w trakcie rozmowy. Na przykład użytkownik pyta: „Jakie filmy grają w tym tygodniu?”, a potem zmienia kontekst w trakcie rozmowy: „Jaka ma być jutro pogoda?”. W tym przykładzie „Jaka będzie jutro pogoda?” nie jest prawidłową odpowiedzią na rozmowę wywołaną początkowym promptem, dlatego Asystent automatycznie próbuje dopasować reklamę i przeprowadzić użytkownika do odpowiedniej rozmowy.

Jeśli Asystent nie znajdzie odpowiedniej akcji, która pasuje do danych wejściowych użytkownika, wyświetli mu się kontekst akcji.

Asystent może przerwać akcję, aby zareagować na prawidłowy scenariusz braku dopasowania, dlatego nie używaj intencji zastępczych do realizacji zapytań użytkowników. Intencji zastępczych należy używać tylko po to, aby ponownie poprosić użytkownika o podanie prawidłowych danych wejściowych.

Aby utworzyć intencję zastępczą:

  1. Kliknij Intents (Intencje) w menu nawigacyjnym Dialogflow.
  2. Kliknij ⋮ obok Utwórz intencję i wybierz Utwórz intencję zastępczą. (możesz też kliknąć Domyślna intencja zastępcza, aby ją edytować).
  3. Określ wyrażenia przeznaczone do ponownego polecenia, by odpowiedzieć użytkownikom. Tego typu wyrażenia powinny mieć charakter konwersacyjny i być jak najbardziej przydatne w bieżącym kontekście.

    Aby to zrobić bez realizacji: podaj wyrażenia w obszarze Odpowiedź intencji. Dialogflow losowo wybiera wyrażenia z tej listy, aby odpowiadać użytkownikom do momentu, aż zostanie wywołany bardziej szczegółowa intencja.

    Aby to zrobić w ramach realizacji:

    1. W sekcji Fulfillment (Realizacja) intencji włącz opcję Włącz wywołanie webhooka dla tej intencji.
    2. W swojej logice realizacji postępuj zgodnie z intencją zastępczą tak samo jak w przypadku innych intencji, zgodnie z opisem w sekcji Tworzenie funkcji do obsługi żądań.

    Na przykład funkcja poniżej korzysta z obiektu conv.data (dowolnego ładunku danych, którego możesz używać do utrzymywania stanu) z biblioteki klienta Node.js do przechowywania licznika, który śledzi liczbę wywołań intencji zastępczej. Jeśli zostanie wywołana więcej niż raz, akcja zakończy się. Chociaż nie jest to widoczne w kodzie, inne intencje powinny resetować ten licznik do 0 po wywołaniu intencji innej niż zastępcze. Szczegółowe informacje o tym, jak to zrobić, znajdziesz w przykładzie numer Denie.

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

Korzystanie z kontekstów

Jeśli chcesz, aby Dialogflow uruchamiał intencje zastępcze tylko w określonych sytuacjach, używaj kontekstów. Jest to przydatne, gdy chcesz mieć różne intencje zapasowe dla różnych niepasujących scenariuszy.

  • Jeśli nie ustawisz kontekstów w intencji zastępczej, uznamy to za globalną intencję zapasową, którą Dialogflow uruchamia, gdy nie pasuje żadna inna intencja. Jeśli chcesz użyć jednej z takich reklam, musisz mieć ją określoną.
  • Jeśli ustawisz konteksty wejściowe w intencji zastępczej, Dialogflow aktywuje tę intencję zastępczą, gdy zostaną spełnione te warunki:

    • Bieżące konteksty użytkownika stanowią nadzbiór kontekstów zdefiniowanych w zamiarze.
    • Brak innych pasujących intencji.

    Dzięki temu możesz używać wielu intencji zastępczych z różnymi kontekstami wejściowymi, aby dostosowywać ponowne żądanie bez dopasowania do konkretnych scenariuszy.

  • Jeśli ustawisz kontekst wyjściowy w intencji zastępczej, po wywołaniu i przetworzeniu intencji zastępczej, po jej wywołaniu i utrzymaniu kontekstu użytkownika pozostanie w tym samym kontekście.

Więcej informacji znajdziesz w sekcji Dialogflow Contexts.

Ponowne żądanie bez wprowadzania danych

Na stronie Zwroty znajdziesz szczegółowe informacje o tym, co zrobić, gdy użytkownik nie podaje żadnych dodatkowych informacji na urządzeniu głosowym, takim jak Google Home, które wymaga ciągłej interakcji.