1. Einführung
In diesem Artikel erfahren Sie, wie Dialogflow eine Verbindung zu BigQuery herstellt und Informationen speichert, die während des Konversationsmodus erfasst werden. Wir verwenden denselben Agent, den wir in den vorherigen Labs erstellt haben. Terminplaner“. Im GCP-Projekt des Agents erstellen wir ein Dataset und eine Tabelle in BigQuery. Anschließend bearbeiten wir die ursprüngliche Auftragsausführung mit dem BigQuery-Dataset und den Tabellen-IDs. Schließlich testen wir, ob die Interaktionen in BigQuery aufgezeichnet werden.
Hier ist das Sequenzdiagramm der Ereignisse vom Nutzer bis zur Auftragsausführung und zu BigQuery.
Lerninhalte
- Dataset und Tabelle in BigQuery erstellen
- BigQuery-Verbindungsdetails in der Dialogflow-Auftragsausführung einrichten
- Auftragsausführung testen
Vorbereitung
- Grundlegende Konzepte und Konstrukte von Dialogflow. In den folgenden Videos finden Sie Einführungsvideos zu Dialogflow, in denen das grundlegende dialogorientierte Design behandelt wird:
- Chatbot zur Terminplanung mit Dialogflow erstellen
- Grundlegendes zu Entitäten in Dialogflow
- Auftragsausführung: Dialogflow in Google Kalender einbinden
2. Dataset und Tabelle in BigQuery erstellen
- Rufen Sie die Google Cloud Console auf.
- Klicken Sie in der Cloud Console auf das Dreistrich-Menü ☰ > Big Data > BigQuery
- Klicken Sie im linken Bereich unter „Resources“ (Ressourcen) auf die Projekt-ID. Nach der Auswahl sehen Sie rechts CREATE DATASET (DATASET ERSTELLEN).
- Klicken Sie auf CREATE DATASET (DATASET ERSTELLEN) und benennen Sie es.
- Sobald das Dataset erstellt ist, klicken Sie im linken Bereich darauf. Rechts sehen Sie CREATE TABLE.
- Klicken Sie auf CREATE TABLE (Tabelle erstellen), geben Sie den Tabellennamen an und klicken Sie am unteren Bildschirmrand auf Create table (Tabelle erstellen).
- Nachdem die Tabelle erstellt wurde, klicken Sie im linken Bereich auf die Tabelle. Rechts sehen Sie die Schaltfläche Schema bearbeiten.
- Klicken Sie auf die Schaltfläche „Schema bearbeiten“ und dann auf die Schaltfläche „Feld hinzufügen“. Füge "date" hinzu und wiederholen Sie das Gleiche für time. und type.
- Notieren Sie sich die Angaben unter DatasetID" und DatasetID".
3. BigQuery-Verbindungsdetails zur Dialogflow-Auftragsausführung hinzufügen
- Öffnen Sie den Dialogflow-Agent und aktivieren Sie den Inline-Editor für die Auftragsausführung. Falls Sie dabei Hilfe benötigen, finden Sie im vorherigen Lab weitere Informationen .
- Achten Sie darauf, dass die Datei package.json" im Inline-Editor für die Auftragsausführung von Dialogflow eine BigQuery-Abhängigkeit enthält. "@google-cloud/bigquery": "0.12.0". Achten Sie darauf, dass Sie die neueste Version von BigQuery zu dem Zeitpunkt verwenden, zu dem Sie diesem Artikel folgen.
- Erstellen Sie in index.js „addToBigQuery“. , um das Datum, die Uhrzeit und den Termintyp zur BigQuery-Tabelle hinzuzufügen.
- Fügen Sie projectID, datasetID und tableID im TODO-Abschnitt der Datei "index.js" hinzu, um die BigQuery-Tabelle und das Dataset richtig mit der Auftragsausführung 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);
}
);
}
});
});
}
Abfolge der Ereignisse aus dem Code verstehen
- Die Intent-Zuordnung ruft die Funktion makeAppointment" auf, um einen Termin in Google Kalender zu vereinbaren
- Innerhalb derselben Funktion wird "addToBigQuery" aufgerufen. zum Senden der Daten, die in BigQuery protokolliert werden sollen.
4. Chatbot und BigQuery-Tabelle testen
Teste jetzt unseren Chatbot. Du kannst ihn im Simulator testen oder die Web- oder Google Home-Integration verwenden, die wir in früheren Artikeln kennengelernt haben.
- Nutzer: „Termin für die Fahrzeugregistrierung um 14 Uhr morgen vereinbaren“
- Chatbot-Antwort: „Okay, lassen Sie mich sehen, ob wir Sie unterbringen können. Am 06.08., 14:00 Uhr ist alles in Ordnung!“
- Prüfen Sie nach der Antwort die BigQuery-Tabelle. Abfrage „SELECT * FROM
projectID.datasetID.tableID
“ verwenden
5. Bereinigen
Wenn Sie vorhaben, die anderen Labs dieser Reihe zu absolvieren, sollten Sie die Bereinigung jetzt nicht durchführen, sondern erst, wenn Sie alle Labs der Reihe abgeschlossen haben.
Dialogflow-Agent löschen
- Klicken Sie neben dem Kundenservicemitarbeiter auf das Zahnradsymbol
.
- Scrollen Sie auf dem Tab General (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. Du bist jetzt ein Chatbot-Entwickler.
Sehen Sie sich auch diese anderen Ressourcen an:
- Codebeispiele auf der Seite Dialogflow GitHub prüfen