Fulfillment build (Dialogflow)

Fulfillment menentukan antarmuka percakapan untuk Action Anda guna mendapatkan input pengguna dan logika untuk memproses input tersebut, dan pada akhirnya akan memenuhi Action.

Menentukan percakapan

Setelah menentukan Action, Anda dapat membuat percakapan yang sesuai untuk Action tersebut. Anda dapat melakukannya dengan membuat intent Dialogflow yang menentukan tata bahasa atau hal yang perlu dikatakan pengguna untuk memicu intent dan fulfillment yang sesuai guna memproses intent saat dipicu.

Anda dapat membuat intent sebanyak yang Anda inginkan untuk menentukan seluruh tata bahasa percakapan.

Membuat intent

Klik tanda + di samping item menu Intent di navigasi kiri Dialogflow. Editor Intent akan muncul, tempat Anda dapat memasukkan informasi berikut:

  • Nama intent adalah nama intent yang ditampilkan dalam IDE.
  • Konteks memungkinkan Anda mencakup pemicu intent ke kasus tertentu. Baca dokumentasi Dialogflow tentang Context untuk mengetahui informasi selengkapnya.
  • Peristiwa memicu intent tanpa mengharuskan pengguna untuk mengatakan apa pun. Salah satu contoh peristiwa adalah peristiwa GOOGLE_ASSISTANT_WELCOME, yang memungkinkan Asisten Google memanggil Action Anda. Peristiwa ini digunakan untuk Action default Action Anda. Lihat dokumentasi kami untuk informasi selengkapnya tentang intent helper bawaan.
  • Frasa pelatihan menentukan apa yang perlu dikatakan pengguna (tata bahasa) untuk memicu intent. Ketik beberapa frasa di sini (5-10) tentang apa yang dapat dikatakan pengguna untuk memicu intent. Dialogflow secara otomatis menangani variasi alami dari contoh frasa yang Anda berikan.
  • Tindakan dan parameter menentukan data yang akan diteruskan ke fulfillment, jika fulfillment diaktifkan untuk intent ini. Hal ini mencakup data yang diuraikan dari input pengguna dan nama yang dapat Anda gunakan dalam fulfillment Anda untuk mendeteksi intent mana yang dipicu. Anda akan menggunakan nama ini nanti untuk memetakan intent ke logika fulfillment yang sesuai. Lihat Tindakan dan parameter dalam dokumentasi Dialogflow untuk informasi selengkapnya tentang menentukan Tindakan.

  • Responses adalah Dialogflow Response Builder, tempat Anda dapat menentukan respons terhadap intent ini secara langsung dalam Dialogflow, tanpa memanggil fulfillment. Fitur ini berguna untuk respons statis yang tidak memerlukan fulfillment. Anda dapat menggunakannya untuk memberikan pesan selamat datang atau selamat tinggal yang sederhana. Namun, Anda mungkin akan menggunakan fulfillment guna merespons pengguna untuk sebagian besar intent.

  • Fulfillment menentukan apakah Anda ingin memanggil fulfillment saat intent ini dipicu. Anda kemungkinan besar akan mengaktifkannya untuk sebagian besar intent di agen Dialogflow Anda. Untuk melihat item ini dalam intent, Anda harus mengaktifkan fulfillment untuk agen di menu Fulfillment.

Membuat respons di Dialogflow

Untuk beberapa intent, Anda mungkin tidak perlu meminta fulfillment agar menampilkan respons. Dalam hal ini, Anda dapat menggunakan builder respons di Dialogflow untuk membuat respons.

Di area Responses, berikan respons tekstual yang ingin Anda tampilkan kembali kepada pengguna. Respons teks default adalah respons teks TTS sederhana yang dapat berfungsi di beberapa integrasi Dialogflow. Respons untuk Asisten Google dijelaskan di halaman Respons.

Membuat respons fulfillment

Kode fulfillment Anda dihosting di logika fulfillment webhook untuk Action. Misalnya, dalam contoh Silly Name Maker, logika ini ditemukan di index.js untuk Cloud Function for Firebase.

Saat intent dipicu yang menggunakan fulfillment, Anda akan menerima permintaan dari Dialogflow yang berisi informasi tentang intent tersebut. Anda kemudian menanggapi permintaan dengan memproses intent dan menampilkan respons. Permintaan dan respons ini ditentukan oleh webhook Dialogflow.

Sebaiknya gunakan library klien Node.js untuk memproses permintaan dan menampilkan respons. Berikut adalah proses umum untuk menggunakan library klien:

  1. Lakukan inisialisasi objek Dialogflow. Objek ini otomatis menangani pemrosesan permintaan dan mengurainya sehingga Anda dapat memprosesnya dalam fulfillment.
  2. Buat fungsi untuk menangani permintaan. Fungsi ini memproses input pengguna dan komponen intent lainnya serta membangun respons untuk kembali ke Dialogflow.

Melakukan inisialisasi objek Dialogflow

Kode berikut membuat instance Dialogflow dan melakukan beberapa penyiapan Node.js boilerplate untuk 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
    // ...
  }

Membuat fungsi untuk menangani permintaan

Saat pengguna mengucapkan frasa yang memicu intent, Anda akan menerima permintaan dari Dialogflow yang Anda tangani dengan fungsi dalam fulfillment Anda. Dalam fungsi ini, Anda umumnya akan melakukan hal-hal berikut:

  1. Jalankan logika apa pun yang diperlukan untuk memproses input pengguna.
  2. Buat respons untuk merespons intent yang dipicu. Pertimbangkan platform yang digunakan pengguna untuk membuat respons yang tepat. Lihat kemampuan platform untuk mengetahui informasi selengkapnya tentang cara melayani respons untuk berbagai platform.
  3. Panggil fungsi ask() dengan respons Anda.

Kode berikut menunjukkan cara membuat dua respons TTS yang menangani intent pemanggilan (input.welcome) dan intent dialog (input.number) yang menerima pengguna ke Action Anda dan mengulangi angka yang telah diucapkan pengguna untuk intent Dialogflow dengan nama:

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();
}

Input Number intent kustom, yang menyertai kode di atas, menggunakan entity @sys.number untuk mengekstrak angka dari ucapan pengguna. Intent tersebut kemudian mengirimkan parameter num, yang berisi angka dari pengguna, ke fungsi dalam fulfillment.

Daripada memiliki pengendali individual untuk setiap intent, Anda dapat menambahkan fungsi penggantian. Di dalam fungsi penggantian, periksa intent mana yang memicunya dan lakukan hal yang sesuai.

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();
}

Permintaan ulang tidak ada kecocokan

Jika Dialogflow tidak cocok dengan tata bahasa input apa pun yang ditentukan dalam Frasa pelatihan intent Anda, Dialogflow akan memicu intent penggantian. Intent penggantian biasanya akan meminta pengguna memberikan input yang diperlukan untuk Action Anda. Anda dapat memberikan frasa permintaan ulang dengan menentukannya di area Response pada intent penggantian atau menggunakan webhook untuk memberikan respons.

Jika respons pengguna tidak cocok dengan frasa pelatihan Action Anda, Asisten Google akan mencoba menangani input tersebut. Perilaku ini memudahkan pengguna mengubah Action di tengah percakapan. Misalnya, pengguna bertanya, "Film apa yang diputar minggu ini?", lalu mengubah konteks di tengah percakapan: "Bagaimana cuacanya besok?" Dalam contoh ini, karena "Bagaimana cuaca besok?" bukanlah respons valid untuk percakapan yang dipicu oleh perintah awal, Asisten secara otomatis mencoba menangani pencocokan dan memindahkan pengguna ke percakapan yang sesuai.

Jika Asisten tidak dapat menemukan Action yang tepat yang cocok dengan input pengguna, pengguna akan ditampilkan kembali ke konteks Action Anda.

Karena Asisten dapat mengganggu Action Anda untuk merespons skenario tanpa kecocokan yang valid, jangan gunakan intent penggantian sebagai cara untuk memenuhi kueri pengguna. Anda hanya boleh menggunakan intent penggantian untuk meminta ulang input yang valid kepada pengguna.

Untuk membuat intent penggantian:

  1. Klik Intent di menu navigasi Dialogflow.
  2. Klik ⋮ di samping Buat Intent, lalu pilih Buat Intent Penggantian. (Atau, klik Default Fallback Intent untuk mengeditnya.)
  3. Tentukan frasa permintaan ulang untuk berbicara kembali kepada pengguna. Frasa ini harus bersifat interaktif dan bermanfaat sesuai dengan konteks pengguna saat ini.

    Untuk melakukannya tanpa fulfillment: Tentukan frasa di area Response pada intent. Dialogflow secara acak memilih frasa dari daftar ini untuk berbicara kembali kepada pengguna hingga intent yang lebih spesifik dipicu.

    Untuk melakukannya dengan fulfillment:

    1. Alihkan tombol Aktifkan panggilan webhook untuk intent ini di bagian Fulfillment intent.
    2. Dalam logika fulfillment Anda, tangani intent penggantian seperti intent lainnya, seperti yang dijelaskan di bagian Membuat fungsi untuk menangani permintaan.

    Misalnya, fungsi berikut menggunakan objek conv.data (payload data arbitrer yang dapat Anda gunakan untuk mempertahankan status) dari library klien Node.js untuk menyimpan penghitung yang melacak berapa kali intent penggantian dipicu. Jika dipicu lebih dari sekali, Action akan berhenti. Meskipun tidak ditampilkan dalam kode, Anda harus membuat intent lain mereset penghitung ini ke 0 saat intent non-penggantian dipicu. (Lihat contoh Genie Nomor untuk detail cara menerapkannya.)

    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();
    }

Menggunakan konteks

Gunakan konteks jika Anda ingin Dialogflow memicu intent penggantian hanya dalam situasi tertentu. Hal ini berguna jika Anda ingin memiliki intent penggantian yang berbeda untuk berbagai skenario tidak ada kecocokan.

  • Jika Anda tidak menetapkan konteks pada intent penggantian, konteks tersebut dianggap sebagai intent penggantian global yang dipicu Dialogflow jika tidak ada intent lain yang cocok. Anda hanya boleh menetapkan salah satu jika Anda memilih untuk menggunakannya.
  • Jika Anda menetapkan konteks input pada intent penggantian, Dialogflow akan memicu intent penggantian ini saat hal berikut berlaku:

    • Konteks pengguna saat ini adalah superset konteks yang ditentukan dalam intent.
    • Tidak ada intent lain yang cocok.

    Hal ini memungkinkan Anda menggunakan beberapa intent penggantian dengan konteks input yang berbeda untuk menyesuaikan permintaan ulang tanpa kecocokan untuk skenario tertentu.

  • Jika Anda menetapkan konteks output pada intent penggantian, Anda mempertahankan pengguna dalam konteks yang sama setelah intent penggantian dipicu dan diproses.

Lihat Konteks Dialogflow untuk mengetahui informasi selengkapnya.

Permintaan ulang tanpa input

Lihat halaman Permintaan ulang untuk mengetahui detail tentang cara menangani saat pengguna tidak memberikan input lebih lanjut di perangkat suara seperti Google Home yang memerlukan interaksi berkelanjutan.