Dialogflow in BigQuery einbinden

1. Einführung

In diesem Artikel erfahren Sie, wie Dialogflow mit BigQuery verbunden ist und wie Informationen gespeichert werden, die während der Konversation gesammelt werden. Wir verwenden denselben Agenten, den wir in früheren Labs mit dem Namen Terminplaner erstellt haben. Im GCP-Projekt des Kundenservice-Agents erstellen wir ein Dataset und eine Tabelle in BigQuery. Anschließend bearbeiten wir die ursprüngliche Erfüllung mit den IDs des BigQuery-Datasets und der BigQuery-Tabelle. Zum Schluss testen wir, ob die Interaktionen in BigQuery aufgezeichnet werden.

Hier ist das Sequenzdiagramm der Ereignisse vom Nutzer bis zur Ausführung und BigQuery.

538029740db09f49.png

Lerninhalte

  • Dataset und Tabelle in BigQuery erstellen
  • So richten Sie BigQuery-Verbindungsdetails in der Dialogflow-Erfüllung ein.
  • Auftragsausführung testen

Vorbereitung

  • Grundlegende Konzepte und Konstrukte von Dialogflow. In den folgenden Videos finden Sie einführende Dialogflow-Anleitungen zum grundlegenden Design von Dialogen:
  • Erstellen Sie einen Terminplaner-Chatbot mit Dialogflow.
  • Entitäten in Dialogflow
  • Fulfillment: Dialogflow in Google Kalender einbinden

2. Dataset und Tabelle in BigQuery erstellen

  1. Öffnen Sie die Google Cloud Console.
  2. Klicken Sie in der Cloud Console auf das Menüsymbol ☰ > „Big Data“ > „BigQuery“.
  3. Klicken Sie im linken Bereich unter „Ressourcen“ auf die Projekt-ID. Wenn sie ausgewählt ist, wird rechts die Option „DATASET ERSTELLEN“ angezeigt.
  4. Klicken Sie auf CREATE DATASET (DATASET ERSTELLEN) und geben Sie einen Namen ein.

be9f32a18ebb4a5b.png

  1. Klicken Sie nach dem Erstellen des Datasets im linken Bereich darauf. Rechts wird CREATE TABLE angezeigt.
  2. Klicken Sie auf „CREATE TABLE“ (TABELLE ERSTELLEN), geben Sie einen Tabellennamen ein und klicken Sie unten auf dem Bildschirm auf „Create table“ (Tabelle erstellen).

d5fd99b68b7e62e0.png

  1. Klicken Sie nach dem Erstellen der Tabelle im linken Bereich darauf. Rechts wird die Schaltfläche Schema bearbeiten angezeigt.
  2. Klicken Sie auf die Schaltfläche „Schema bearbeiten“ und dann auf die Schaltfläche „Feld hinzufügen“. Fügen Sie das Feld date hinzu und wiederholen Sie den Vorgang für time und type.
  3. Notieren Sie sich die DatasetID und die tableID.

e9d9abbe843823df.png

3. BigQuery-Verbindungsdetails zu Dialogflow Fulfillment hinzufügen

  1. Öffnen Sie den Dialogflow-Agenten und aktivieren Sie den Inline-Editor für die Auftragsausführung. Im vorherigen Lab finden Sie weitere Informationen .
  1. Prüfen Sie, ob die Datei package.json im Inline-Editor für die Dialogflow-Auftragsausführung eine BigQuery-Abhängigkeit enthält. "@google-cloud/bigquery": "0.12.0". Achten Sie darauf, dass Sie die aktuelle Version von BigQuery verwenden, wenn Sie diesen Artikel lesen.
  2. Erstellen Sie in index.js die Funktion addToBigQuery, um das Datum, die Uhrzeit und den Termin in die BigQuery-Tabelle einzufügen.
  3. Fügen Sie die projectID, datasetID und tableID im TODO-Abschnitt der Datei „index.js“ hinzu, um Ihre BigQuery-Tabelle und das Dataset richtig mit Ihrem Fulfillment zu verbinden.
{
  "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);
        }
        );
      }
    });
  });
}

Ereignisabfolge aus dem Code ableiten

  1. Über die Intent-Zuordnung wird die Funktion makeAppointment aufgerufen, um einen Termin in Google Kalender zu planen.
  2. Innerhalb derselben Funktion wird die Funktion addToBigQuery aufgerufen, um die zu protokollierenden Daten an BigQuery zu senden.

4. Chatbot und BigQuery-Tabelle testen

Testen wir unseren Chatbot. Sie können ihn im Simulator testen oder die Web- oder Google Home-Integration verwenden, die wir in früheren Artikeln kennengelernt haben.

  • Nutzer: „Stell einen Termin für die Fahrzeugregistrierung auf morgen um 14:00 Uhr ein.“
  • Antwort des Chatbots: „Okay, ich sehe mal nach, ob wir dich unterbringen können. „Der 6. August um 14:00 Uhr passt.“

96d3784c103daf5e.png

  • Prüfen Sie die BigQuery-Tabelle nach der Antwort. Verwenden Sie die Abfrage „SELECT * FROM projectID.datasetID.tableID“.

dcbc9f1c06277a21.png

5. Bereinigen

Wenn Sie die anderen Labs in dieser Reihe absolvieren möchten, führen Sie die Bereinigung erst durch, wenn Sie alle Labs der Reihe abgeschlossen haben.

Dialogflow-Agent löschen

  • Klicken Sie neben Ihrem vorhandenen Agent auf das Zahnradsymbol 30a9fea7cfa77c1a.png.

520c1c6bb9f46ea6.png

  • Scrollen Sie auf dem Tab Allgemein nach unten und klicken Sie auf Delete this Agent (Diesen Agent löschen).
  • Geben Sie im eingeblendeten Fenster LÖSCHEN ein und klicken Sie auf Löschen.

6. Glückwunsch!

Sie haben einen Chatbot erstellt und in BigQuery eingebunden, um Erkenntnisse zu gewinnen. Sie sind jetzt Chatbot-Entwickler!

Weitere Ressourcen:

1217326c0c490fa.png