Menyimpan data dalam percakapan (Dialogflow)

Jelajahi di Dialogflow

Klik Continue untuk mengimpor contoh Save data di Dialogflow. Kemudian, ikuti langkah-langkah di bawah ini untuk men-deploy dan menguji sampel:

  1. Masukkan nama agen dan buat agen Dialogflow baru untuk contoh.
  2. Setelah agen selesai mengimpor, klik Buka agen.
  3. Dari menu navigasi utama, buka Fulfillment.
  4. Aktifkan Inline Editor, lalu klik Deploy. Editor berisi kode contoh.
  5. Dari menu navigasi utama, buka Integrations, lalu klik Google Assistant.
  6. Di jendela modal yang muncul, aktifkan Perubahan pratinjau otomatis, lalu klik Uji untuk membuka simulator Action.
  7. Pada simulator, masukkan Talk to my test app untuk menguji sampel.
Lanjutkan

Bagian dari memberikan pengalaman pengguna yang sangat baik sering kali adalah kemampuan menyimpan data di antara percakapan atau beberapa percakapan dengan pengguna. Hal ini berguna jika Anda memberikan permintaan ulang yang berguna dalam satu percakapan, menyimpan skor game di seluruh sesi, atau mengingat informasi kecil untuk pengguna.

Persyaratannya sedikit berbeda bergantung pada apakah Anda perlu menyimpan data dalam percakapan atau di seluruh percakapan. Untuk menyimpan data dalam percakapan, Anda dapat menggunakan kolom conversationToken dari objek AppResponse.

Untuk menyimpan data di seluruh percakapan, lakukan langkah-langkah berikut:

  1. Tentukan apakah pengguna diverifikasi atau tamu.
  2. Simpan atau akses data pengguna menggunakan kolom userStorage dari objek AppResponse Anda.

Menyimpan data di antara putaran percakapan

Kolom conversationToken adalah string yang berisi token buram yang diedarkan ulang ke Action setiap percakapan. Misalnya, jika Anda menetapkan nilai ke "count=1" di AppResponse untuk putaran pertama percakapan, AppRequest yang diterima oleh Action Anda untuk putaran kedua percakapan akan berisi "count=1" dalam conversationToken-nya.

Token selalu diinisialisasi ke string kosong di awal percakapan. Jika menggunakan library klien Actions on Google Node.js, Anda dapat berinteraksi dengan token percakapan sebagai objek JSON menggunakan conv.data, dengan conv sebagai instance Conversation Anda.

Contoh berikut menunjukkan cara menyimpan penghitung di kolom conversationToken dari 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

Perhatikan bahwa JSON di bawah menjelaskan respons webhook yang menggunakan outputContexts, bukan 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

Perhatikan bahwa JSON di bawah menjelaskan respons webhook.

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

Lihat panduan praktik terbaik Memberikan permintaan ulang yang bermanfaat dan gagal dengan lancar untuk contoh penggunaan praktis.

Menyimpan data di seluruh percakapan

Kolom userStorage objek AppResponse Anda adalah string yang berisi token buram yang disediakan oleh Action yang disimpan di percakapan untuk pengguna tertentu. Misalnya, game dapat menyimpan skor tertinggi pengguna di userStorage dan menggunakan nilainya dalam pesan selamat datang setiap kali pengguna memulai percakapan baru.

Menentukan dan menangani status verifikasi pengguna

Status verifikasi pengguna dapat memiliki nilai GUEST atau VERIFIED. Di awal setiap percakapan, Actions on Google menetapkan status verifikasi pengguna berdasarkan berbagai indikator saat percakapan dimulai. Misalnya, pengguna yang login ke Asisten Google di perangkat selulernya memiliki status verifikasi VERIFIED.

Berikut adalah kemungkinan alasan pengguna memiliki status verifikasi GUEST:

  • Pengguna telah menonaktifkan hasil personal.
  • Pengguna menonaktifkan Aktivitas Web & Aplikasi. Perlu diingat bahwa beberapa pengguna mungkin menonaktifkan setelan ini di tingkat domain.
  • Jika perangkat telah mengaktifkan Voice Match, dan pencocokan gagal atau pengguna memanggil Asisten tanpa menggunakan suaranya (seperti menekan lama di Google Home).
  • Pengguna tidak login.

Selalu periksa status verifikasi pengguna sebelum menyimpan data dengan userStorage atau memulai alur penautan akun untuk mencegah pengguna tamu berinteraksi dengan fitur yang akan gagal bagi mereka.

Jika menggunakan Library Klien Google Actions On untuk Node.js, Anda dapat berinteraksi dengan penyimpanan pengguna sebagai objek JSON menggunakan conv.user.storage, dengan conv sebagai instance Conversation Anda. Contoh berikut menunjukkan cara menyimpan penghitung di kolom userStorage pada AppResponse Anda:

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

Perhatikan bahwa JSON di bawah menjelaskan respons webhook.

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

JSON

Perhatikan bahwa JSON di bawah menjelaskan respons webhook.

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

Lihat panduan praktik terbaik Mempersonalisasi percakapan dengan preferensi pengguna untuk contoh penggunaan praktis.

Catatan hukum: Mendapatkan izin sebelum mengakses userStorage. Beberapa negara memiliki peraturan yang mewajibkan developer untuk mendapatkan izin dari pengguna sebelum mereka dapat mengakses, atau menyimpan informasi tertentu (seperti informasi pribadi) di userStorage. Jika Anda beroperasi di salah satu negara tersebut dan ingin mengakses, atau menyimpan informasi tersebut di userStorage, Anda harus menggunakan Helper konfirmasi untuk meminta izin kepada pengguna dan memperoleh persetujuan sebelum dapat mulai menyimpan informasi tersebut di userStorage.

Akhir masa berlaku penyimpanan pengguna

Jika Asisten dapat mencocokkan identitas dengan pengguna, konten userStorage tidak akan pernah habis masa berlakunya, dan hanya pengguna atau Action itu sendiri yang dapat menghapusnya.

Jika Asisten tidak dapat mencocokkan identitas dengan pengguna, konten userStorage akan dihapus di akhir percakapan. Berikut adalah beberapa contoh kasus saat Asisten tidak dapat mencocokkan identitas dengan pengguna:

  • Voice Match telah disiapkan dan tidak ada kecocokan.
  • Pengguna menonaktifkan data pribadi.

Hapus konten kolom userStorage

Anda dapat menghapus konten kolom userStorage di Action dengan menyetel kolom resetUserStorage pada AppResponse ke true. Jika Anda menetapkan nilai userStorage ke string kosong, nilai userStorage tidak akan diubah pada percakapan berikutnya. Hal ini memungkinkan Anda menghindari pengiriman kembali seluruh userStorage secara bergantian jika kontennya tidak berubah.

Jika menggunakan Library Klien Google Actions On untuk Node.js, Anda cukup menetapkan nilai conv.user.storage ke {} (objek kosong).

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

Perhatikan bahwa JSON di bawah menjelaskan respons webhook.

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

Perhatikan bahwa JSON di bawah menjelaskan respons webhook.

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

Sebagai pengguna, Anda dapat melihat konten kolom userStorage dalam Action yang dipanggil. Anda juga dapat menghapus data pengguna yang disimpan dari Action tertentu tersebut dengan menghentikan layanan mengingat Anda.

  1. Buka aplikasi Assistant di ponsel Anda.
  2. Ketuk ikon panel samping.

  3. Di tab Jelajahi, temukan Action yang ingin Anda lihat atau hapus penyimpanan penggunanya, lalu ketuk untuk membuka halaman detail.
  4. Scroll ke bagian bawah halaman.
    • Untuk melihat konten kolom userStorage, ketuk [View penyimpanan data].
    • Untuk menghapus data pengguna yang tersimpan, ketuk Hentikan $action mengingat saya.