1. مقدمة
في هذه المقالة، سنتعلم كيفية ربط Dialogflow بأداة BigQuery وكيفية تخزين المعلومات التي تم جمعها أثناء تجربة المحادثات. سنستخدم الوكيل نفسه الذي أنشأناه في الميزات الاختبارية السابقة " أداة تحديد المواعيد". في مشروع Google Cloud Platform (GCP) للوكيل، سننشئ مجموعة بيانات وجدولاً في BigQuery. بعد ذلك، سنُعدِّل عملية التنفيذ الأصلية باستخدام أرقام تعريف الجداول ومجموعة بيانات BigQuery. وأخيرًا سنختبر لمعرفة ما إذا كان يتم تسجيل التفاعلات في BigQuery أم لا.
وفي ما يلي الرسم البياني لتسلسل الأحداث من المستخدم إلى عملية التنفيذ وBigQuery.
ما ستتعرَّف عليه
- كيفية إنشاء مجموعة بيانات وجدول في BigQuery
- كيفية إعداد تفاصيل اتصال BigQuery في تنفيذ Dialogflow.
- كيفية اختبار توصيل الطلبات
المتطلبات الأساسية
- المفاهيم الأساسية والتركيبات البرمجية لـ Dialogflow. بالنسبة إلى مقاطع الفيديو التعليمية التمهيدية التي تتناول التصميم الحواري الأساسي من Dialogflow، اطلع على مقاطع الفيديو التالية:
- يمكنك إنشاء روبوت دردشة مع أداة جدولة المواعيد باستخدام Dialogflow.
- فهم الكيانات في Dialogflow.
- توصيل الطلبات: دمج Dialogflow مع "تقويم Google"
2. إنشاء مجموعة بيانات وجدول في BigQuery
- الانتقال إلى Google Cloud Console
- في Cloud Console، انتقِل إلى رمز القائمة ⋮ > البيانات الضخمة > BigQuery
- ضمن "Resources" (الموارد) في الجزء الأيمن، انقر فوق معرف المشروع، وبمجرد تحديده، سترى "CREATE DATASET" (إنشاء مجموعة بيانات) على اليمين
- انقر فوق CREATE DATASET وقم بتسميتها.
- بمجرد إنشاء مجموعة البيانات، انقر فوقها من اللوحة اليمنى. سترى CREATE TABLE على اليمين.
- انقر فوق "CREATE TABLE" (إنشاء جدول)، وقم بتوفير اسم الجدول، وانقر فوق "Create table" (إنشاء جدول) في الجزء السفلي من الشاشة.
- وبعد إنشاء الجدول، انقر على الجدول من اللوحة اليمنى. سيظهر لك الزر "تعديل المخطط" على الجانب الأيسر.
- انقر فوق الزر "Edit Schema" (تحرير المخطط) وانقر فوق الزر "Add Field" (إضافة حقل). إضافة "date" وكرر نفس الشيء لـ "time" و"type".
- دوِّن "DatasetID" و"DatasetID"
3- إضافة تفاصيل اتصال BigQuery إلى Dialogflow Fulfillment
- افتح وكيل Dialogflow وفعِّل محرِّر التنفيذ المضمّن. يُرجى الرجوع إلى الدرس السابق إذا كنت بحاجة إلى مساعدة في هذا الشأن .
- تأكَّد من أنّ "package.json" في المحرِّر المضمَّن لتنفيذ عملية Dialogflow يحتوي على تبعية BigQuery. "@google-cloud/bigquery": "0.12.0". تأكد من استخدام أحدث إصدار من BigQuery في الوقت الذي تتابع فيه هذه المقالة.
- في index.js، أنشئ addToBigQuery. لإضافة التاريخ والوقت ونوع الموعد في جدول BigQuery.
- أضِف projectID وdatasetID وtableID في قسم قائمة المهام في ملف 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" لتحديد موعد في "تقويم Google".
- ضمن نفس الوظيفة، يتم إجراء استدعاء إلى "addToBigQuery". لإرسال البيانات ليتم تسجيل الدخول إلى BigQuery.
4. اختبِر روبوت الدردشة وجدول BigQuery!
لنختبر روبوت الدردشة لدينا، يمكنك اختباره في المحاكي أو استخدام التكامل مع الويب أو Google Home الذي تعلمناه في المقالات السابقة.
- المستخدم: "تحديد موعد لتسجيل المركبة في الساعة 2 ظهرًا غدًا"
- ردّ برنامج الدردشة المبرمَجة: "حسنًا، سأرى ما إذا كان بإمكاننا مساعدتك. لا بأس في 6 آب (أغسطس)، الساعة 2 بعد الظهر!".
- تحقق من جدول BigQuery بعد الرد. استخدام الطلب "SELECT * FROM
projectID.datasetID.tableID
"
5- تنظيف
إذا كنت تخطط لتنفيذ التمارين المعملية الأخرى في هذه السلسلة، فلا تنجز الآن مهام التنظيف، بل نفّذها بعد الانتهاء من جميع التمارين المعملية في السلسلة.
حذف وكيل Dialogflow
- انقر على رمز الترس
بجانب وكيلك الحالي.
- في علامة التبويب الإعدادات العامة، انتقِل إلى أسفل الصفحة وانقر على حذف هذا الوكيل.
- اكتب حذف في النافذة التي تظهر، ثم انقر على حذف.
6- تهانينا!
لقد أنشأت روبوت دردشة ودمجته مع BigQuery للحصول على رؤى. لقد أصبحت الآن مطور برامج دردشة مبرمجة
اطلع على هذه الموارد الأخرى:
- يمكنك الاطّلاع على نماذج الرموز في صفحة Dialogflow GitHub.