1. مقدمه
در این مقاله می آموزیم که چگونه Dialogflow با BigQuery ارتباط برقرار می کند و اطلاعات جمع آوری شده در طول تجربه مکالمه را ذخیره می کند. ما از همان عاملی استفاده خواهیم کرد که در آزمایشگاه های قبلی " Appointment Scheduler " ایجاد کردیم. در پروژه Agent's GCP ما یک مجموعه داده و یک جدول در BigQuery ایجاد خواهیم کرد. سپس تکمیل اصلی را با مجموعه داده BigQuery و شناسههای جدول ویرایش میکنیم. در نهایت ما آزمایش خواهیم کرد تا ببینیم آیا تعاملات در BigQuery ثبت می شوند یا خیر.
در اینجا نمودار توالی رویدادها از کاربر تا تکمیل و BigQuery است.
چیزی که یاد خواهید گرفت
- نحوه ایجاد مجموعه داده و جدول در BigQuery
- نحوه تنظیم جزئیات اتصال BigQuery در انجام Dialogflow.
- نحوه انجام آزمایش
پیش نیازها
- مفاهیم و ساختارهای اساسی Dialogflow. برای ویدیوهای آموزشی مقدماتی Dialogflow که طراحی اولیه مکالمه را پوشش می دهد، ویدیوهای زیر را بررسی کنید:
- با استفاده از Dialogflow یک چت ربات زمانبندی قرار بسازید.
- درک موجودیت ها در Dialogflow.
- تحقق: Dialogflow را با Google Calendar ادغام کنید.
2. مجموعه داده و جدول را در BigQuery ایجاد کنید
- به Google Cloud Console بروید
- در کنسول Cloud، به نماد منو ☰ > Big Data > BigQuery بروید
- در قسمت Resources در سمت چپ، روی ID پروژه کلیک کنید، پس از انتخاب، CREATE DATASET را در سمت راست خواهید دید.
- روی CREATE DATASET کلیک کنید و نام آن را بگذارید.
- پس از ایجاد مجموعه داده، از پانل سمت چپ روی آن کلیک کنید. CREATE TABLE را در سمت راست خواهید دید.
- روی CREATE TABLE کلیک کنید، نام جدول را وارد کنید و روی ایجاد جدول در پایین صفحه کلیک کنید.
- پس از ایجاد جدول، روی جدول از پنل سمت چپ کلیک کنید. دکمه " Edit Schema" را در سمت راست خواهید دید.
- روی دکمه Edit Schema کلیک کنید و روی دکمه Add Field کلیک کنید. فیلد « تاریخ » را اضافه کنید و همین کار را برای « زمان » و « تایپ » تکرار کنید.
- به " DatasetID" و " TableID" توجه داشته باشید
3. جزئیات اتصال BigQuery را به Dialogflow Fulfillment اضافه کنید
- Dialogflow Agent را باز کنید و ویرایشگر درون خطی Fulfillment را فعال کنید. اگر در این مورد به کمک نیاز دارید به آزمایشگاه قبلی مراجعه کنید.
- مطمئن شوید که " pack.json" در ویرایشگر درون خطی انجام Dialogflow حاوی یک وابستگی BigQuery باشد. "@google-cloud/bigquery": "0.12.0". مطمئن شوید که در زمانی که این مقاله را دنبال می کنید از آخرین نسخه BigQuery استفاده می کنید.
- در index.js تابع " adToBigQuery " را ایجاد کنید تا تاریخ، زمان و نوع قرار را در جدول BigQuery اضافه کنید.
- ID project ، مجموعه داده و 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);
}
);
}
});
});
}
دنباله وقایع را از روی کد درک کنید
- نقشه قصد، تابع " makeAppointment" را برای برنامه ریزی قرار ملاقات در تقویم گوگل فراخوانی می کند.
- در همان تابع، با تابع " adToBigQuery " تماس گرفته می شود تا داده ها را برای ورود به BigQuery ارسال کند.
4. چت بات و جدول BigQuery را تست کنید!
بیایید ربات چت خود را آزمایش کنیم، می توانید آن را در شبیه ساز آزمایش کنید یا از ادغام وب یا گوگل هوم که در مقالات قبلی یاد گرفته ایم استفاده کنید.
- کاربر: "برای ثبت نام خودرو در ساعت 14 فردا قرار ملاقات بگذارید"
- پاسخ چت بات: "خوب، بگذار ببینم آیا میتوانیم شما را جا بدهیم. 6 اوت، ساعت 2 بعد از ظهر خوب است!"
- بعد از پاسخ، جدول BigQuery را بررسی کنید. از عبارت "SELECT * FROM
projectID.datasetID.tableID
" استفاده کنید
5. پاکسازی
اگر قصد دارید آزمایشگاه های دیگر این مجموعه را انجام دهید، اکنون پاکسازی را انجام ندهید، این کار را بعد از اتمام کار با تمام آزمایشگاه های مجموعه انجام دهید.
Dialogflow Agent را حذف کنید
- روی نماد چرخ دنده کلیک کنید
در کنار نماینده فعلی شما
- در برگه عمومی به پایین اسکرول کنید و روی Delete this Agent کلیک کنید.
- DELETE را در پنجره ظاهر شده تایپ کنید و روی Delete کلیک کنید.
6. تبریک می گویم!
یک ربات چت ایجاد کردید و آن را با BigQuery ادغام کردید تا بینش به دست آورید. شما اکنون یک توسعه دهنده ربات چت هستید!
این منابع دیگر را بررسی کنید:
- نمونه کدها را در صفحه Dialogflow Github بررسی کنید.