Как интегрировать Dialogflow с BigQuery

1. Введение

В этой статье мы узнаем, как Dialogflow соединяется с BigQuery и сохраняет информацию, собранную во время разговора. Мы будем использовать того же агента, который мы создали в предыдущих лабораторных работах « Планировщик встреч ». В проекте GCP агента мы создадим набор данных и таблицу в BigQuery. Затем мы отредактируем исходное выполнение, используя набор данных BigQuery и идентификаторы таблиц. Наконец, мы проверим, записываются ли взаимодействия в BigQuery.

Вот диаграмма последовательности событий от пользователя до выполнения и BigQuery.

538029740db09f49.png

Что вы узнаете

  • Как создать набор данных и таблицу в BigQuery
  • Как настроить детали подключения BigQuery при выполнении Dialogflow.
  • Как проверить выполнение

Предварительные условия

  • Основные понятия и конструкции Dialogflow. Вводные обучающие видеоролики Dialogflow, в которых рассматриваются основы диалогового дизайна, можно посмотреть в следующих видеороликах:
  • Создайте чат-бота для планировщика встреч с помощью Dialogflow.
  • Понимание сущностей в Dialogflow.
  • Выполнение: Интеграция Dialogflow с Календарем Google.

2. Создайте набор данных и таблицу в BigQuery.

  1. Перейдите в Google Cloud Console.
  2. В консоли Cloud перейдите к значку меню ☰ > Большие данные > BigQuery.
  3. В разделе «Ресурсы» на левой панели щелкните идентификатор проекта. После выбора справа вы увидите CREATE DATASET.
  4. Нажмите «СОЗДАТЬ НАБОР ДАННЫХ» и назовите его.

be9f32a18ebb4a5b.png

  1. После создания набора данных щелкните его на левой панели. Справа вы увидите CREATE TABLE.
  2. Нажмите «СОЗДАТЬ ТАБЛИЦУ», укажите имя таблицы и нажмите «Создать таблицу» в нижней части экрана.

d5fd99b68b7e62e0.png

  1. После создания таблицы щелкните ее на левой панели. Справа вы увидите кнопку « Редактировать схему» .
  2. Нажмите кнопку «Изменить схему» и нажмите кнопку «Добавить поле». Добавьте поле « дата » и повторите то же самое для « времени » и « типа ».
  3. Обратите внимание на « DatasetID» и « tableID».

e9d9abbe843823df.png

3. Добавьте сведения о подключении BigQuery в Dialogflow Fulfillment.

  1. Откройте агент Dialogflow и включите встроенный редактор Fulfillment. Если вам нужна помощь, обратитесь к предыдущей лабораторной работе.
  1. Убедитесь, что файл package.json во встроенном редакторе выполнения Dialogflow содержит зависимость BigQuery. "@google-cloud/bigquery": "0.12.0". Убедитесь, что вы используете последнюю версию BigQuery на момент чтения этой статьи.
  2. В index.js создайте функцию addToBigQuery , чтобы добавить дату, время и тип встречи в таблицу BigQuery.
  3. Добавьте projectID , datasetID и tableID в раздел TODO файла index.js, чтобы правильно связать таблицу BigQuery и набор данных с вашим выполнением.
{
  "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);
        }
        );
      }
    });
  });
}

Понять последовательность событий из кода

  1. Карта намерений вызывает функцию makeAppointment , чтобы запланировать встречу в Календаре Google.
  2. В той же функции выполняется вызов функции « addToBigQuery » для отправки данных для регистрации в BigQuery.

4. Проверьте своего чат-бота и таблицу BigQuery!

Давайте протестируем нашего чат-бота, вы можете протестировать его в симуляторе или использовать интеграцию через Интернет или Google Home, о которой мы узнали в предыдущих статьях.

  • Пользователь: «Назначьте встречу для регистрации автомобиля завтра на 14:00»
  • Ответ чат-бота: «Хорошо, посмотрим, сможем ли мы вас вписать. 6 августа, 14:00 — это нормально!».

96d3784c103daf5e.png

  • После ответа проверьте таблицу BigQuery. Используйте запрос «SELECT * FROM projectID.datasetID.tableID »

dcbc9f1c06277a21.png

5. Очистка

Если вы планируете выполнять другие лабораторные работы из этой серии, не делайте очистку сейчас, сделайте это после того, как закончите со всеми лабораторными работами из этой серии.

Удалить агент Dialogflow

  • Нажмите на значок шестеренки 30a9fea7cfa77c1a.png рядом с вашим существующим агентом

520c1c6bb9f46ea6.png

  • На вкладке «Общие» прокрутите вниз и нажмите «Удалить этого агента» .
  • Введите DELETE в появившемся окне и нажмите «Удалить» .

6. Поздравляем!

Вы создали чат-бота и интегрировали его с BigQuery, чтобы получить ценную информацию. Теперь вы разработчик чат-бота!

Ознакомьтесь с другими ресурсами:

  • Ознакомьтесь с примерами кода на странице Dialogflow Github .

1217326c0c490fa.png