১. ভূমিকা
এই আর্টিকেলে আমরা শিখব কিভাবে Dialogflow, BigQuery-এর সাথে সংযুক্ত হয় এবং কথোপকথনের সময় সংগৃহীত তথ্য সংরক্ষণ করে। আমরা আগের ল্যাবগুলোতে তৈরি করা " অ্যাপয়েন্টমেন্ট শিডিউলার " এজেন্টটিই ব্যবহার করব। এজেন্টের GCP প্রজেক্টে আমরা BigQuery-তে একটি ডেটাসেট এবং একটি টেবিল তৈরি করব। এরপর আমরা BigQuery ডেটাসেট এবং টেবিল আইডি ব্যবহার করে মূল ফুলফিলমেন্টটি সম্পাদনা করব। সবশেষে, ইন্টারঅ্যাকশনগুলো BigQuery-তে রেকর্ড হচ্ছে কিনা তা আমরা পরীক্ষা করে দেখব।
এখানে ব্যবহারকারী থেকে শুরু করে পরিষেবা সম্পন্ন হওয়া এবং BigQuery পর্যন্ত ঘটনাগুলোর ক্রমিক চিত্র দেওয়া হলো।

আপনি যা শিখবেন
- BigQuery-তে কীভাবে ডেটাসেট এবং টেবিল তৈরি করবেন
- Dialogflow ফুলফিলমেন্টে BigQuery কানেকশনের বিবরণ কীভাবে সেট আপ করবেন।
- পরিপূর্ণতা কীভাবে পরীক্ষা করবেন
পূর্বশর্ত
- ডায়ালগফ্লো-এর মৌলিক ধারণা ও গঠন। কথোপকথনমূলক ডিজাইনের প্রাথমিক ধারণা নিয়ে তৈরি ডায়ালগফ্লো-এর টিউটোরিয়াল ভিডিওর জন্য নিচের ভিডিওগুলো দেখুন:
- Dialogflow ব্যবহার করে একটি অ্যাপয়েন্টমেন্ট শিডিউলার চ্যাটবট তৈরি করুন।
- Dialogflow-তে এনটিটি বোঝা
- বাস্তবায়ন: গুগল ক্যালেন্ডারের সাথে ডায়ালগফ্লো সংযুক্ত করুন।
২. BigQuery-তে ডেটাসেট এবং টেবিল তৈরি করুন
- গুগল ক্লাউড কনসোলে যান
- ক্লাউড কনসোলে, মেনু আইকন ☰ > বিগ ডেটা > বিগকোয়েরি-তে যান।
- বাম দিকের প্যানেলে Resources-এর অধীনে প্রজেক্ট আইডি-তে ক্লিক করুন, এটি নির্বাচিত হলে আপনি ডানদিকে CREATE DATASET দেখতে পাবেন।
- CREATE DATASET-এ ক্লিক করুন এবং এটির একটি নাম দিন।

- ডেটা সেট তৈরি হয়ে গেলে, বাম প্যানেল থেকে সেটির উপর ক্লিক করুন। আপনি ডানদিকে CREATE TABLE দেখতে পাবেন।
- CREATE TABLE-এ ক্লিক করুন, টেবিলের নাম দিন এবং স্ক্রিনের নীচে থাকা Create table-এ ক্লিক করুন।

- টেবিলটি তৈরি হয়ে গেলে, বাম প্যানেল থেকে টেবিলটির উপর ক্লিক করুন। আপনি ডানদিকে " এডিট স্কিমা" (Edit Schema) বাটনটি দেখতে পাবেন।
- এডিট স্কিমা বাটনে ক্লিক করুন এবং অ্যাড ফিল্ড বাটনে ক্লিক করুন। ' date ' ফিল্ডটি যোগ করুন এবং ' time ' ও ' type'-এর জন্যও একই কাজ করুন।
- ' DatasetID' এবং ' tableID' নোট করে রাখুন।

৩. Dialogflow Fulfillment-এ BigQuery সংযোগের বিবরণ যোগ করুন
- Dialogflow Agent খুলুন এবং Fulfillment inline editor সক্রিয় করুন। এ ব্যাপারে সাহায্যের প্রয়োজন হলে পূর্ববর্তী ল্যাবটি দেখুন।
- Dialogflow ফুলফিলমেন্ট ইনলাইন এডিটরের " package.json" ফাইলে BigQuery ডিপেন্ডেন্সি "@google-cloud/bigquery": "0.12.0" আছে কিনা, তা নিশ্চিত করুন। এই নিবন্ধটি পড়ার সময় আপনি BigQuery-এর সর্বশেষ সংস্করণ ব্যবহার করছেন কিনা, তাও নিশ্চিত করুন।
- BigQuery টেবিলে তারিখ, সময় এবং অ্যাপয়েন্টমেন্টের ধরন যোগ করার জন্য index.js-এ ' addToBigQuery ' ফাংশনটি তৈরি করুন।
- আপনার BigQuery টেবিল এবং ডেটাসেটকে আপনার ফুলফিলমেন্টের সাথে সঠিকভাবে সংযুক্ত করতে, index.js ফাইলের TODO সেকশনে projectID , datasetID এবং tableID যোগ করুন।
{
"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" ফাংশনটিকে কল করে।
- BigQuery-তে লগ করার জন্য ডেটা পাঠাতে একই ফাংশনের মধ্যে ' addToBigQuery ' ফাংশনটিকে কল করা হয়।
৪. আপনার চ্যাটবট এবং বিগকোয়েরি টেবিল পরীক্ষা করুন!
চলুন আমাদের চ্যাটবটটি পরীক্ষা করে দেখি, আপনি এটি সিমুলেটরে পরীক্ষা করতে পারেন অথবা আগের আর্টিকেলগুলোতে শেখা ওয়েব বা গুগল হোম ইন্টিগ্রেশন ব্যবহার করতে পারেন।
- ব্যবহারকারী: "আগামীকাল দুপুর ২টায় গাড়ি নিবন্ধনের জন্য একটি অ্যাপয়েন্টমেন্ট ঠিক করুন।"
- চ্যাটবটের উত্তর: "ঠিক আছে, দেখি আপনাকে জায়গা দেওয়া যায় কিনা। আগস্টের ৬ তারিখ, দুপুর ২টা আপনার জন্য সুবিধাজনক!"

- রেসপন্স পাওয়ার পর BigQuery টেবিলটি চেক করুন। "SELECT * FROM
projectID.datasetID.tableID" কোয়েরিটি ব্যবহার করুন।

৫. পরিচ্ছন্নতা
আপনি যদি এই সিরিজের অন্য ল্যাবগুলো করার পরিকল্পনা করে থাকেন, তাহলে এখন পরিষ্কার-পরিচ্ছন্নতার কাজটি করবেন না, সিরিজের সব ল্যাব শেষ করার পর তা করবেন।
Dialogflow এজেন্টটি মুছে ফেলুন
- গিয়ার আইকনে ক্লিক করুন
আপনার বর্তমান এজেন্টের পাশে

- জেনারেল ট্যাবে একদম নিচে স্ক্রল করুন এবং ডিলিট দিস এজেন্ট-এ ক্লিক করুন।
- প্রদর্শিত উইন্ডোতে DELETE টাইপ করুন এবং ডিলিট-এ ক্লিক করুন।
৬. অভিনন্দন!
আপনি একটি চ্যাটবট তৈরি করেছেন এবং তথ্য সংগ্রহের জন্য এটিকে BigQuery-এর সাথে সংযুক্ত করেছেন। আপনি এখন একজন চ্যাটবট ডেভেলপার!
এই অন্যান্য উৎসগুলো দেখুন:
- Dialogflow-এর গিটহাব পেজে কোডের নমুনাগুলো দেখে নিন।
