1. Introduction
Dans cet article, nous allons découvrir comment Dialogflow se connecte à BigQuery et stocke les informations collectées au cours de l'expérience de conversation. Nous utiliserons l'agent que nous avons créé dans les ateliers précédents " Planificateur de rendez-vous". Dans le projet GCP de l'agent, nous allons créer un ensemble de données et une table dans BigQuery. Ensuite, nous modifierons le fulfillment d'origine avec les ID de l'ensemble de données et de la table BigQuery. Pour finir, nous testerons si les interactions sont bien enregistrées dans BigQuery.
Voici le diagramme séquentiel des événements de l'utilisateur jusqu'au traitement et à BigQuery.
Points abordés
- Créer un ensemble de données et une table dans BigQuery
- Configurer les détails de la connexion BigQuery dans le fulfillment Dialogflow
- Tester le fulfillment
Prérequis
- Concepts et constructs de base de Dialogflow. Pour visionner des tutoriels vidéo d'introduction à Dialogflow portant sur la conception de conversation de base, consultez les vidéos suivantes:
- Créer un chatbot de planification des rendez-vous à l'aide de Dialogflow
- Comprendre les entités dans Dialogflow
- Fulfillment: intégrer Dialogflow à Google Agenda
2. Créer un ensemble de données et une table dans BigQuery
- Accédez à la console Google Cloud.
- Dans la console Cloud, accédez à l'icône de menu ▾ > Big data > BigQuery
- Sous "Ressources" dans le volet de gauche, cliquez sur l'ID du projet. Une fois le projet sélectionné, cliquez sur CRÉER UN ENSEMBLE DE DONNÉES à droite.
- Cliquez sur CRÉER UN JEU DE DONNÉES et nommez-le.
- Une fois l'ensemble de données créé, cliquez dessus dans le panneau de gauche. Vous verrez CREATE TABLE sur la droite.
- Cliquez sur CRÉER UNE TABLE, indiquez le nom de la table, puis cliquez sur Créer un tableau en bas de l'écran.
- Une fois la table créée, cliquez dessus dans le panneau de gauche. Le bouton Edit Schema (Modifier le schéma) s'affiche à droite.
- Cliquez sur le bouton "Edit Schema" (Modifier le schéma), puis sur le bouton "Add Field" (Ajouter un champ). Ajouter une date Répétez l'opération pour "time". et type.
- Notez les valeurs DatasetID" et DatasetID".
3. Ajouter les détails de connexion BigQuery au fulfillment Dialogflow
- Ouvrez l'agent Dialogflow et activez l'éditeur intégré Fulfillment. Si vous avez besoin d'aide, reportez-vous à l'atelier précédent .
- Assurez-vous que le fichier package.json" de l'éditeur intégré de fulfillment Dialogflow contient une dépendance BigQuery. "@google-cloud/bigquery": "0.12.0". Assurez-vous d'utiliser la dernière version de BigQuery au moment où vous suivez cet article.
- Dans index.js, créez "addToBigQuery". pour ajouter la date, l'heure et le type de rendez-vous dans la table BigQuery.
- Ajoutez les valeurs projectID, datasetID et tableID dans la section TODO du fichier index.js pour connecter correctement votre table BigQuery et l'ensemble de données à votre fulfillment.
{
"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);
}
);
}
});
});
}
Comprendre la séquence des événements du code
- La carte d'intent appelle la fonction makeAppointment" pour planifier un rendez-vous dans Google Agenda
- Dans cette même fonction, un appel est effectué vers addToBigQuery. pour envoyer les données à connecter à BigQuery.
4. Testez votre chatbot et la table BigQuery !
Testons notre chatbot. Vous pouvez le tester dans le simulateur ou utiliser l'intégration Web ou Google Home que nous avons apprise dans les articles précédents.
- Utilisateur : "Prends rendez-vous pour l'immatriculation du véhicule demain à 14h"
- Réponse du chatbot : "D'accord, voyons si nous pouvons vous intégrer. Le 6 août à 14h, c'est parfait !"
- Examinez la table BigQuery après la réponse. Utiliser la requête "SELECT * FROM
projectID.datasetID.tableID
"
5. Nettoyage
Si vous prévoyez de suivre les autres ateliers de cette série, ne procédez pas au nettoyage maintenant. Faites-le après avoir terminé tous les ateliers de la série.
Supprimer l'agent Dialogflow
- Cliquez sur l'icône en forme de roue dentée
à côté de votre agent existant.
- Dans l'onglet General (Général), faites défiler la page vers le bas, puis cliquez sur Delete this Agent (Supprimer cet agent).
- Saisissez SUPPRIMER dans la fenêtre qui s'affiche, puis cliquez sur Supprimer.
6. Félicitations !
Vous avez créé un chatbot et l'avez intégré à BigQuery pour obtenir des insights. Vous êtes maintenant développeur de chatbots !
Consultez ces ressources supplémentaires :
- Consultez les exemples de code sur la page Dialogflow GitHub.