۱. مقدمه
در این مقاله یاد خواهیم گرفت که چگونه Dialogflow با BigQuery ارتباط برقرار میکند و اطلاعات جمعآوریشده در طول تجربه مکالمه را ذخیره میکند. ما از همان Agent که در آزمایشهای قبلی " Appointment Scheduler " ایجاد کردیم، استفاده خواهیم کرد. در پروژه GCP مربوط به Agent، یک مجموعه داده و یک جدول در BigQuery ایجاد خواهیم کرد. سپس، تکمیل اولیه را با مجموعه داده BigQuery و شناسههای جدول ویرایش خواهیم کرد. در نهایت، بررسی خواهیم کرد که آیا تعاملات در BigQuery ثبت میشوند یا خیر.
در اینجا نمودار توالی رویدادها از کاربر تا تکمیل سفارش و BigQuery آمده است.

آنچه یاد خواهید گرفت
- نحوه ایجاد مجموعه داده و جدول در BigQuery
- نحوه تنظیم جزئیات اتصال BigQuery در تکمیل Dialogflow.
- چگونه میزان موفقیت را آزمایش کنیم
پیشنیازها
- مفاهیم و ساختارهای اولیه Dialogflow. برای ویدیوهای آموزشی مقدماتی Dialogflow که طراحی مکالمه پایه را پوشش میدهد، ویدیوهای زیر را بررسی کنید:
- با استفاده از Dialogflow یک چتبات زمانبندی قرار ملاقات بسازید.
- آشنایی با موجودیتها در Dialogflow
- تکمیل سفارش: Dialogflow را با تقویم گوگل ادغام کنید.
۲. ایجاد مجموعه داده و جدول در BigQuery
- به کنسول ابری گوگل بروید
- در کنسول Cloud، به آیکون منو ☰ > Big Data > BigQuery بروید
- در قسمت منابع (Resources) در پنل سمت چپ، روی شناسه پروژه (project ID) کلیک کنید، پس از انتخاب، عبارت CREATE DATASET را در سمت راست مشاهده خواهید کرد.
- روی CREATE DATASET کلیک کنید و نامی برای آن انتخاب کنید.

- پس از ایجاد مجموعه داده، از پنل سمت چپ روی آن کلیک کنید. در سمت راست، عبارت CREATE TABLE را مشاهده خواهید کرد.
- روی CREATE TABLE کلیک کنید، نام جدول را وارد کنید و در پایین صفحه روی Create table کلیک کنید.

- پس از ایجاد جدول، از پنل سمت چپ روی جدول کلیک کنید. دکمه « ویرایش طرحواره» را در سمت راست مشاهده خواهید کرد.
- روی دکمهی ویرایش طرحواره (Edit Schema) کلیک کنید و سپس روی دکمهی افزودن فیلد (Add Field) کلیک کنید. فیلد « تاریخ » (date) را اضافه کنید و همین کار را برای «زمان» (time ) و « نوع » (type) تکرار کنید.
- به « DatasetID» و « tableID» توجه کنید.

۳. جزئیات اتصال BigQuery را به Dialogflow Fulfillment اضافه کنید
- Dialogflow Agent را باز کنید و ویرایشگر درونخطی Fulfillment را فعال کنید. اگر در این مورد به کمک نیاز دارید، به تمرین قبلی مراجعه کنید.
- مطمئن شوید که فایل " package.json" در ویرایشگر درونخطی تکمیل Dialogflow حاوی وابستگی BigQuery باشد. "@google-cloud/bigquery": "0.12.0". مطمئن شوید که در زمان مطالعهی این مقاله، از آخرین نسخه BigQuery استفاده میکنید.
- در فایل index.js تابع " addToBigQuery " را برای اضافه کردن تاریخ، زمان و نوع قرار ملاقات در جدول BigQuery ایجاد کنید.
- برای اتصال صحیح جدول BigQuery و مجموعه داده به پروژه، projectID ، datasetID و tableID را در بخش TODO فایل index.js اضافه کنید.
{
"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" را برای تعیین وقت ملاقات در تقویم گوگل فراخوانی میکند.
- در همان تابع، فراخوانی به تابع " addToBigQuery " انجام میشود تا دادههایی که باید در BigQuery ثبت شوند، ارسال شوند.
۴. چتبات و جدول BigQuery خود را آزمایش کنید!
بیایید چتبات خود را آزمایش کنیم، میتوانید آن را در شبیهساز آزمایش کنید یا از یکپارچهسازی وب یا گوگل هوم که در مقالات قبلی آموختهایم استفاده کنید.
- کاربر: «برای ثبت نام خودرو، ساعت ۲ بعد از ظهر فردا وقت بگیرید»
- پاسخ چتبات: «باشه، بذار ببینم میتونیم جاتون بدیم یا نه. ۶ آگوست، ساعت ۲ بعد از ظهر خوبه!»

- جدول BigQuery را پس از پاسخ بررسی کنید. از پرس و جوی "SELECT * FROM
projectID.datasetID.tableID" استفاده کنید.

۵. پاکسازی
اگر قصد دارید آزمایشهای دیگر این مجموعه را انجام دهید، الان پاکسازی را انجام ندهید، این کار را بعد از اتمام تمام آزمایشهای این مجموعه انجام دهید.
عامل Dialogflow را حذف کنید
- روی نماد چرخ دنده کلیک کنید
در کنار نماینده فعلی شما

- در برگه عمومی (General) ، به پایین اسکرول کنید و روی حذف این عامل (Delete this Agent) کلیک کنید.
- در پنجرهای که ظاهر میشود، DELETE را تایپ کنید و روی Delete کلیک کنید.
۶. تبریک میگویم!
شما یک چتبات ایجاد کردید و آن را با BigQuery ادغام کردید تا به بینشهایی دست یابید. اکنون شما یک توسعهدهنده چتبات هستید!
این منابع دیگر را بررسی کنید:
- نمونههای کد را در صفحه گیتهاب Dialogflow ببینید.
