1. Giriş
Bu makalede, Dialogflow'un BigQuery ile nasıl bağlantı kurduğunu ve yapay zeka destekli kampanya oluşturma deneyimi sırasında toplanan bilgileri nasıl depoladığını öğreneceğiz. Önceki laboratuvarlarda oluşturduğumuz " Randevu Planlayıcı" adlı aracıyı kullanacağız. Aracının GCP projesinde BigQuery'de bir veri kümesi ve tablo oluşturacağız. Ardından, orijinal karşılama isteğini BigQuery veri kümesi ve tablo kimlikleriyle düzenleyeceğiz. Son olarak, etkileşimlerin BigQuery'ye kaydedilip kaydedilmediğini test edeceğiz.
Kullanıcıdan karşılama ve BigQuery'ye kadar olan etkinliklerin sıralı diyagramını aşağıda bulabilirsiniz.

Neler öğreneceksiniz?
- BigQuery'de veri kümesi ve tablo oluşturma
- Dialogflow fulfillment'da BigQuery bağlantı ayrıntılarını ayarlama
- İstek karşılama nasıl test edilir?
Ön koşullar
- Dialogflow'un temel kavramları ve yapıları. Temel sohbet tasarımıyla ilgili Dialogflow'a giriş niteliğindeki eğitim videoları için aşağıdaki videolara göz atın:
- Dialogflow kullanarak randevu planlayıcı chatbot oluşturun.
- Dialogflow'da öğeleri anlama.
- Karşılama: Dialogflow'u Google Takvim ile entegre edin.
2. BigQuery'de veri kümesi ve tablo oluşturma
- Google Cloud Console'a gidin.
- Cloud Console'da menü simgesi ☰ > Büyük Veri > BigQuery'ye gidin.
- Soldaki bölmede Kaynaklar'ın altında proje kimliğini tıklayın. Seçildikten sonra sağda VERİ KÜMESİ OLUŞTUR'u görürsünüz.
- VERİ KÜMESİ OLUŞTUR'u tıklayın ve veri kümesini adlandırın.

- Veri kümesi oluşturulduktan sonra sol panelden veri kümesini tıklayın. Sağda TABLO OLUŞTUR'u görürsünüz.
- TABLO OLUŞTUR'u tıklayın, Tablo adı'nı girin ve ekranın alt kısmındaki Tablo oluştur'u tıklayın.

- Tablo oluşturulduktan sonra soldaki panelden tabloyu tıklayın. Sağ tarafta "Şemayı Düzenle" düğmesini görürsünüz.
- Şemayı Düzenle düğmesini ve Alan Ekle düğmesini tıklayın. "date" alanını ekleyin ve aynı işlemi "time" ve "type" için de tekrarlayın.
- "DatasetID" ve "tableID" değerlerini not edin.

3. BigQuery bağlantı ayrıntılarını Dialogflow Fulfillment'a ekleme
- Dialogflow aracısını açın ve Fulfillment satır içi düzenleyicisini etkinleştirin. Bu konuda yardıma ihtiyacınız olursa önceki laboratuvara bakın .
- Dialogflow fulfillment satır içi düzenleyicisindeki "package.json" dosyasının bir BigQuery bağımlılığı içerdiğinden emin olun. "@google-cloud/bigquery": "0.12.0". Bu makaleyi okuduğunuz sırada BigQuery'nin en son sürümünü kullandığınızdan emin olun.
- index.js dosyasında, BigQuery tablosuna tarih, saat ve randevu türünü eklemek için "addToBigQuery" işlevini oluşturun.
- BigQuery tablonuzu ve veri kümenizi karşılama işleminize düzgün şekilde bağlamak için index.js dosyasının YAPILACAKLAR bölümüne projectID, datasetID ve tableID değerlerini ekleyin.
{
"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);
}
);
}
});
});
}
Koddaki etkinlik sırasını anlama
- Niyet haritası, Google Takvim'de randevu planlamak için "makeAppointment" işlevini çağırır.
- Aynı işlev içinde, günlüğe kaydedilecek verileri BigQuery'ye göndermek için "addToBigQuery" işlevine bir çağrı yapılır.
4. Chatbot'unuzu ve BigQuery tablosunu test etme
Chatbot'umuzu test edelim. Simülatörde test edebilir veya önceki makalelerde öğrendiğimiz web ya da Google Home entegrasyonunu kullanabilirsiniz.
- Kullanıcı: "Yarın saat 14:00'te araç tescili için randevu al"
- Chatbot yanıtı: "Tamam, sizi programa dahil edip edemeyeceğimize bakalım. 6 Ağustos saat 14:00 uygun."

- Yanıtın ardından BigQuery tablosunu kontrol edin. "SELECT * FROM
projectID.datasetID.tableID" sorgusunu kullanın.

5. Temizleme
Bu serideki diğer laboratuvarları da yapmayı planlıyorsanız temizleme işlemini şimdi değil, serideki tüm laboratuvarları tamamladıktan sonra yapın.
Dialogflow aracısını silme
- Mevcut temsilcinizin yanındaki dişli simgesini
tıklayın.

- Genel sekmesinde en alta gidin ve Bu Aracıyı Sil'i tıklayın.
- Açılan pencereye DELETE yazıp Sil'i tıklayın.
6. Tebrikler!
Bir chatbot oluşturdunuz ve analiz elde etmek için BigQuery ile entegre ettiniz. Artık bir chatbot geliştiricisiniz.
Diğer kaynaklara göz atın:
- Dialogflow GitHub sayfasındaki kod örneklerine göz atın.
