Cómo integrar Dialogflow con BigQuery

En este artículo, aprenderemos cómo Dialogflow se conecta con BigQuery y almacena la información recopilada durante la experiencia conversacional. Utilizaremos el mismo agente que creamos en los lab anteriores "Schedule Scheduler". En el proyecto de GCP del agente, crearemos un conjunto de datos y una tabla en BigQuery. Luego, editaremos la entrega original con el conjunto de datos de BigQuery y los ID de la tabla. Por último, probaremos si las interacciones se registran en BigQuery.

Este es el diagrama de secuencia de los eventos desde el usuario hasta la entrega y BigQuery.

Qué aprenderás

  • Cómo crear un conjunto de datos y una tabla en BigQuery
  • Cómo configurar los detalles de conexión de BigQuery en la entrega de Dialogflow
  • Cómo probar las entregas

Prerequisites

  • Conceptos básicos y constructos de Dialogflow Para ver videos introductorios de Dialogflow que abordan el diseño de conversación básico, consulta los siguientes videos:
  • Compila un chatbot de Appointment Scheduler con Dialogflow.
  • Información sobre las entidades en Dialogflow.
  • Entrega: Integra Dialogflow a Calendario de Google.
  1. Navega a Google Cloud Console.
  2. En Cloud Console, ve al ícono de menú ☰ > Macrodatos > BigQuery
  3. En Recursos, en el panel izquierdo, haga clic en el ID del proyecto. Una vez seleccionado, verá CREAR CONJUNTO DE DATOS a la derecha.
  4. Haga clic en CREAR CONJUNTO DE DATOS (CREATE DATASET) y asígnale un nombre.

  1. Una vez que se cree el conjunto de datos, haga clic en él en el panel izquierdo. Verá CREATE TABLE a la derecha.
  2. Haga clic en CREAR TABLA, ingrese el nombre de la tabla y haga clic en Crear tabla en la parte inferior de la pantalla.

  1. Una vez creada la tabla, haga clic en ella en el panel izquierdo. A la derecha, aparecerá el botón Edit Schema (Editar esquema).
  2. Haga clic en el botón Editar esquema y, luego, en el botón Agregar campo. Agrega un campo de fecha y repite lo mismo para hora y tipo.
  3. Anota el ID de conjunto de datos y el ID de tabla.

  1. Abre el agente de Dialogflow y habilita el editor directo de entrega. Consulte el lab anterior si necesita ayuda con esto .
  1. Asegúrate de que el "package.json" del editor intercalado de entregas de Dialogflow contenga una dependencia de BigQuery. "@google-cloud/bigquery": "0.12.0" Asegúrate de usar la versión más reciente de BigQuery en el momento en que sigues este artículo.
  2. En index.js, cree la función addToBigQuery para agregar la fecha, hora y tipo de cita en la tabla de BigQuery.
  3. Agregue los parámetros projectID, datasetID y tableID a la sección TODO del archivo index.js para conectar correctamente su tabla de BigQuery y el conjunto de datos a su entrega.
{
  "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);
        }
        );
      }
    });
  });
}

Comprende la secuencia de eventos a partir del código

  1. El mapa de intents llama a la función makeAppointment para programar una cita en Calendario de Google.
  2. Dentro de la misma función, se realiza una llamada a la función addToBigQuery para enviar los datos que se registrarán en BigQuery.

Probemos nuestro chatbot. Puedes probarlo en el simulador o usar la integración de la Web o Google Home que aprendimos en artículos anteriores.

  • Usuario: "Programar una cita para el registro del vehículo a las 2:00 p.m. mañana"
  • Respuesta del chatbot: "Bien, permíteme ver si podemos ayudarte. Muy bien, el 6 de agosto a las 2 p.m.

  • Verifica la tabla de BigQuery después de la respuesta. Usar consulta &SELECT SELECT * FROM `projectID.datasetID.tableID`"

Si planea realizar los demás labs de esta serie, no realice la limpieza ahora, ya que todos los labs de la serie ya están listos.

Borre el agente de Dialogflow

  • Haz clic en el ícono de ajustes junto a tu agente existente.

  • En la pestaña General, desplázate hacia abajo y haz clic en Borrar este agente.
  • Escribe DELETE en la ventana que aparece y haz clic en Borrar.

Creó un chatbot y lo integró a BigQuery para obtener estadísticas. ¡Ya eres desarrollador de chatbots!

Revise estos otros recursos: