Cách tích hợp Dialogflow với BigQuery

1. Giới thiệu

Trong bài viết này, chúng ta sẽ tìm hiểu cách Dialogflow kết nối với BigQuery và lưu trữ thông tin được thu thập trong trải nghiệm trò chuyện. Chúng tôi sẽ sử dụng chính Nhân viên hỗ trợ mà chúng tôi đã tạo trong các phòng thí nghiệm trước đây " Trình lên lịch hẹn". Trong dự án GCP của Nhân viên hỗ trợ, chúng ta sẽ tạo một tập dữ liệu và một bảng trong BigQuery. Sau đó, chúng tôi sẽ chỉnh sửa phương thức thực hiện ban đầu bằng tập dữ liệu BigQuery và mã bảng. Cuối cùng, chúng ta sẽ kiểm tra xem các lượt tương tác có được ghi lại trong BigQuery hay không.

Dưới đây là sơ đồ trình tự của các sự kiện từ người dùng đến phương thức thực hiện và BigQuery.

538029740db09f49.pngS

Kiến thức bạn sẽ học được

  • Cách tạo tập dữ liệu và bảng trong BigQuery
  • Cách thiết lập thông tin chi tiết về kết nối BigQuery trong phương thức thực hiện Dialogflow.
  • Cách kiểm thử phương thức thực hiện

Điều kiện tiên quyết

  • Các khái niệm và cấu trúc cơ bản của Dialogflow. Để xem các video hướng dẫn giới thiệu về Dialogflow, hãy xem các video sau:
  • Tạo bot trò chuyện cho tính năng lên lịch cuộc hẹn bằng Dialogflow.
  • Tìm hiểu về các đối tượng trong Dialogflow.
  • Thực hiện đơn hàng: Tích hợp Dialogflow với Lịch Google.

2. Tạo tập dữ liệu và bảng trong BigQuery

  1. Chuyển đến Google Cloud Console
  2. Trong bảng điều khiển Cloud, hãy chuyển đến biểu tượng trình đơn ∧ > Dữ liệu lớn > BigQuery
  3. Trong phần Tài nguyên trên ngăn bên trái, hãy nhấp vào ID dự án. Sau khi chọn, bạn sẽ thấy "TẠO DỮ LIỆU" ở bên phải
  4. Nhấp vào TẠO TẬP DỮ LIỆU rồi đặt tên cho tập dữ liệu đó.

be9f32a18ebb4a5b.png

  1. Sau khi tập dữ liệu được tạo, hãy nhấp vào tập dữ liệu đó từ bảng điều khiển bên trái. Bạn sẽ thấy nút TẠO BẢNG ở bên phải.
  2. Nhấp vào TẠO BẢNG, cung cấp tên Bảng rồi nhấp vào Tạo bảng ở cuối màn hình.

d5fd99b68b7e62e0.png

  1. Sau khi tạo bảng, hãy nhấp vào bảng đó trong bảng điều khiển bên trái. Bạn sẽ thấy nút "Chỉnh sửa giản đồ" ở phía bên phải.
  2. Nhấp vào nút Chỉnh sửa giản đồ và nhấp vào nút Thêm trường. Thêm "ngày" và lặp lại tương tự cho "time" và "type".
  3. Ghi lại "DatasetID" và "DatasetID"

e9d9abbe843823df.png

3. Thêm thông tin chi tiết về kết nối BigQuery vào Dialogflow Thực hiện đơn hàng

  1. Mở Nhân viên hỗ trợ Dialogflow và bật trình chỉnh sửa cùng dòng Thực hiện đơn hàng. Hãy tham khảo tính năng phòng thí nghiệm trước nếu bạn cần trợ giúp về vấn đề này .
  1. Đảm bảo "package.json" trong trình chỉnh sửa cùng dòng của phương thức thực hiện Dialogflow có chứa phần phụ thuộc BigQuery. "@google-cloud/bigquery": "0.12.0". Nhớ sử dụng phiên bản BigQuery mới nhất tại thời điểm bạn theo dõi bài viết này.
  2. Trong chỉ mục.js, hãy tạo "addToBigQuery" để thêm ngày, giờ và loại cuộc hẹn trong bảng BigQuery.
  3. Thêm projectID, datasetIDtableID trong mục VIỆC CẦN LÀM của tệpindex.js để kết nối bảng BigQuery và tập dữ liệu với phương thức thực hiện của bạn đúng cách.
{
  "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);
        }
        );
      }
    });
  });
}

Tìm hiểu trình tự của các sự kiện trong đoạn mã

  1. Sơ đồ ý định gọi chức năng "makeAppointment&quot; để lên lịch cuộc hẹn trên Lịch Google
  2. Trong cùng một chức năng, lệnh gọi được thực hiện đến "addToBigQuery" để gửi dữ liệu cần ghi vào BigQuery.

4. Hãy thử nghiệm Chatbot và BigQuery Table!

Hãy kiểm tra bot trò chuyện của chúng ta, bạn có thể thử nghiệm trong trình mô phỏng hoặc sử dụng web hay tích hợp Google Home mà chúng ta đã tìm hiểu trong các bài viết trước.

  • Người dùng: "Đặt lịch hẹn đăng ký xe lúc 2 giờ chiều mai"
  • Bot trò chuyện trả lời: "Được rồi, để tôi xem chúng tôi có thể đưa bạn vào hay không. 2 giờ chiều ngày 6 tháng 8, không sao cả!".

96d3784c103daf5e.png.

  • Hãy kiểm tra bảng BigQuery sau câu trả lời. Sử dụng truy vấn "CHỌN * TỪ projectID.datasetID.tableID"

dcbc9f1c06277a21.png

5. Dọn dẹp

Nếu bạn định thực hiện các phòng thí nghiệm khác trong chuỗi chương trình này, đừng dọn dẹp ngay bây giờ mà hãy thực hiện sau khi bạn hoàn tất tất cả các phòng thí nghiệm trong chuỗi.

Xoá Nhân viên hỗ trợ Dialogflow

  • Nhấp vào biểu tượng bánh răng 30a9fea7cfa77c1a.png. bên cạnh nhân viên hỗ trợ hiện có

520c1c6bb9f46ea6.pngS

  • Trong thẻ General (Chung), hãy di chuyển xuống dưới cùng rồi nhấp vào Delete this Agent (Xoá nhân viên hỗ trợ này).
  • Nhập XOÁ vào cửa sổ xuất hiện rồi nhấp vào Xoá.

6. Xin chúc mừng!

Bạn đã tạo một bot trò chuyện và tích hợp bot này với BigQuery để thu thập thông tin chi tiết. Giờ bạn đã là nhà phát triển chatbot!

Hãy tham khảo các tài nguyên khác sau đây:

1217326c0c490fa.png.