Cara mengintegrasikan Dialogflow dengan BigQuery

Dalam artikel ini, kita akan mempelajari cara Dialogflow terhubung dengan BigQuery dan menyimpan informasi yang dikumpulkan selama percakapan. Kita akan menggunakan Agen yang sama dengan yang telah kita buat di lab sebelumnya "Penjadwal Janji Temu". Dalam project GCP Agen, kami akan membuat set data dan tabel di BigQuery. Kemudian, kita akan mengedit fulfillment asli dengan set data BigQuery dan ID tabel. Terakhir, kita akan menguji apakah interaksi direkam di BigQuery.

Berikut adalah diagram urutan peristiwa dari pengguna ke fulfillment dan BigQuery.

Yang akan Anda pelajari

  • Cara membuat set data dan tabel di BigQuery
  • Cara menyiapkan detail koneksi BigQuery di fulfillment Dialogflow.
  • Cara menguji fulfillment

Prasyarat

  • Konsep dan konstruksi dasar Dialogflow. Untuk video tutorial Dialogflow pengantar yang mencakup desain percakapan dasar, lihat video berikut:
  • Membuat Chatbot Penjadwal Janji Temu menggunakan Dialogflow.
  • Memahami Entitas dalam Dialogflow.
  • Fulfillment: Mengintegrasikan Dialogflow dengan Google Kalender.
  1. Buka Google Cloud Console
  2. Di Cloud Console, buka ikon menu ☰ > Big Data > BigQuery
  3. Pada Resources di panel kiri, klik project ID. Setelah dipilih, Anda akan melihat CREATE DATASET di sebelah kanan
  4. Klik CREATE DATASET dan beri nama.

  1. Setelah set data dibuat, klik set data tersebut dari panel kiri. Anda akan melihat CREATE TABLE di sebelah kanan.
  2. Klik BUAT TABEL, berikan Nama tabel, lalu klik Buat tabel di bagian bawah layar.

  1. Setelah tabel dibuat, klik tabel dari panel kiri. Anda akan melihat tombol "Edit Skema" di sisi kanan.
  2. Klik tombol Edit Schema dan klik tombol Add Field. Tambahkan kolom "date" dan ulangi hal yang sama untuk "waktu" dan "jenis".
  3. Perhatikan &DatasetID" dan "tableID"

  1. Buka Agen Dialogflow dan aktifkan editor inline Fulfillment. Lihat lab sebelumnya jika Anda memerlukan bantuan terkait hal ini .
  1. Pastikan "package.json" di editor inline pemenuhan Dialogflow berisi dependensi BigQuery. "@google-cloud/bigquery": "0.12.0". Pastikan Anda menggunakan BigQuery versi terbaru pada saat mengikuti artikel ini.
  2. Pada index.js, buat "addToBigQuery" fungsi untuk menambahkan tanggal, waktu, dan jenis janji temu di tabel BigQuery.
  3. Tambahkan projectID, datasetID, dan tableID di bagian TODO dari file index.js untuk menghubungkan tabel BigQuery dan set data Anda dengan benar ke fulfillment Anda.
{
  "name": "dialogflowFirebaseFulfillment",
  "description": "Dialogflow fulfillment for the bike shop sample",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "6"
  },
  "scripts": {
    "lint": "semistandard --fix \"**/*.js\"",
    "start": "firebase deploy --only functions",
    "deploy": "firebase deploy --only functions"
  },
  "dependencies": {
    "firebase-functions": "2.0.2",
    "firebase-admin": "^5.13.1",
    "actions-on-google": "2.2.0", 
    "googleapis": "^27.0.0",
    "dialogflow-fulfillment": "0.5.0",
    "@google-cloud/bigquery": "^0.12.0"
  }
}
'use strict';

const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');
const BIGQUERY = require('@google-cloud/bigquery');


// Enter your calendar ID below and service account JSON below
const calendarId = "XXXXXXXXXXXXXXXXXX@group.calendar.google.com";
const serviceAccount = {}; // Starts with {"type": "service_account",...

// Set up Google Calendar Service account credentials
const serviceAccountAuth = new google.auth.JWT({
  email: serviceAccount.client_email,
  key: serviceAccount.private_key,
  scopes: 'https://www.googleapis.com/auth/calendar'
});

const calendar = google.calendar('v3');
process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements

const timeZone = 'America/Los_Angeles';
const timeZoneOffset = '-07:00';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log("Parameters", agent.parameters);
  const appointment_type = agent.parameters.AppointmentType;

// Function to create appointment in calendar  
function makeAppointment (agent) {
    // Calculate appointment start and end datetimes (end = +1hr from start)
    const dateTimeStart = new Date(Date.parse(agent.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
    const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
    const appointmentTimeString = dateTimeStart.toLocaleString(
      'en-US',
      { month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
    );
  
// Check the availability of the time, and make an appointment if there is time on the calendar
    return createCalendarEvent(dateTimeStart, dateTimeEnd, appointment_type).then(() => {
      agent.add(`Ok, let me see if we can fit you in. ${appointmentTimeString} is fine!.`);

// Insert data into a table
      addToBigQuery(agent, appointment_type);
    }).catch(() => {
      agent.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
    });
  }

  let intentMap = new Map();
  intentMap.set('Schedule Appointment', makeAppointment);
  agent.handleRequest(intentMap);
});

//Add data to BigQuery
function addToBigQuery(agent, appointment_type) {
    const date_bq = agent.parameters.date.split('T')[0];
    const time_bq = agent.parameters.time.split('T')[1].split('-')[0];
    /**
    * TODO(developer): Uncomment the following lines before running the sample.
    */
    //const projectId = '<INSERT your own project ID here>'; 
    //const datasetId = "<INSERT your own dataset name here>";
    //const tableId = "<INSERT your own table name here>";
    const bigquery = new BIGQUERY({
      projectId: projectId
    });
   const rows = [{date: date_bq, time: time_bq, type: appointment_type}];
  
   bigquery
  .dataset(datasetId)
  .table(tableId)
  .insert(rows)
  .then(() => {
    console.log(`Inserted ${rows.length} rows`);
  })
  .catch(err => {
    if (err && err.name === 'PartialFailureError') {
      if (err.errors && err.errors.length > 0) {
        console.log('Insert errors:');
        err.errors.forEach(err => console.error(err));
      }
    } else {
      console.error('ERROR:', err);
    }
  });
  agent.add(`Added ${date_bq} and ${time_bq} into the table`);
}

// Function to create appointment in google calendar  
function createCalendarEvent (dateTimeStart, dateTimeEnd, appointment_type) {
  return new Promise((resolve, reject) => {
    calendar.events.list({
      auth: serviceAccountAuth, // List events for time period
      calendarId: calendarId,
      timeMin: dateTimeStart.toISOString(),
      timeMax: dateTimeEnd.toISOString()
    }, (err, calendarResponse) => {
      // Check if there is a event already on the Calendar
      if (err || calendarResponse.data.items.length > 0) {
        reject(err || new Error('Requested time conflicts with another appointment'));
      } else {
        // Create event for the requested time period
        calendar.events.insert({ auth: serviceAccountAuth,
          calendarId: calendarId,
          resource: {summary: appointment_type +' Appointment', description: appointment_type,
            start: {dateTime: dateTimeStart},
            end: {dateTime: dateTimeEnd}}
        }, (err, event) => {
          err ? reject(err) : resolve(event);
        }
        );
      }
    });
  });
}

Memahami urutan peristiwa dari kode

  1. Peta maksud memanggil fungsi "makeAppointment" untuk menjadwalkan janji temu di Google Kalender
  2. Dalam fungsi yang sama, panggilan dilakukan untuk fungsi "addToBigQuery" untuk mengirim data yang akan login ke BigQuery.

Mari kita uji chatbot Anda, Anda dapat mengujinya di simulator atau menggunakan integrasi web atau google home yang telah kita pelajari di artikel sebelumnya.

  • Pengguna: "Jadwalkan janji temu untuk pendaftaran kendaraan pukul 14.00 besok"
  • Tanggapan Chatbot: "Baiklah, saya akan mencari tahu apakah kami bisa membantu Anda. 6 Agustus, jam 14.00 tidak apa-apa!."

  • Periksa tabel BigQuery setelah respons. Gunakan kueri "SELECT * FROM `projectID.datasetID.tableID`"

Jika Anda berencana melakukan lab lain di seri ini, jangan lakukan pembersihan sekarang, setelah Anda menyelesaikan semua lab di seri ini.

Menghapus Agen Dialogflow

  • Klik ikon roda gigi di samping agen Anda yang ada

  • Di tab General scroll ke bawah ke bawah dan klik Delete this Agent.
  • Ketik DELETE ke dalam jendela yang muncul, lalu klik Delete.

Anda telah membuat chatbot dan mengintegrasikannya dengan BigQuery untuk mendapatkan insight. Sekarang Anda adalah developer chatbot!

Lihat referensi lainnya: