Dialogflow'u BigQuery ile entegre etme

1. Giriş

Bu makalede, Dialogflow'un BigQuery ile nasıl bağlantı kurduğunu ve sohbet deneyiminde toplanan bilgileri nasıl depoladığını öğreneceksiniz. Önceki laboratuvarlarda oluşturduğumuz Aracıyı kullanacağız " Randevu Planlayıcı". Aracının GCP projesinde, BigQuery'de veri kümesi ve tablo oluşturacağız. Ardından BigQuery veri kümesi ve tablo kimlikleriyle orijinal karşılamayı düzenleriz. Son olarak, etkileşimlerin BigQuery'ye kaydedilip kaydedilmediğini test edeceğiz.

Kullanıcıdan istek karşılama ve BigQuery'ye kadar olan etkinliklerin sıra şeması aşağıda verilmiştir.

538029740db09f49.png

Neler öğreneceksiniz?

  • BigQuery'de veri kümesi ve tablo oluşturma
  • Dialogflow karşılamada BigQuery bağlantı ayrıntılarını ayarlama.
  • Sipariş karşılamayı test etme

Ön koşullar

  • Dialogflow ile ilgili temel kavramlar ve yapılar. Temel konuşma tasarımını kapsayan tanıtım amaçlı Dialogflow eğitim videoları için aşağıdaki videolara göz atın:
  • Dialogflow'u kullanarak Randevu Planlayıcı Chat Bot'u derleme
  • Dialogflow'daki Varlıkları Anlama
  • İstek karşılama: Dialogflow'u Google Takvim ile entegre etme.

2. BigQuery'de Veri Kümesi ve Tablo Oluşturma

  1. Google Cloud Console'a gidin.
  2. Cloud Console'da menü simgesine Gönder > gidin. Büyük Veri > BigQuery
  3. Sol bölmedeki Kaynaklar altında proje kimliğini tıklayın. Seçildikten sonra sağ tarafta VERİ KÜMESİ OLUŞTUR seçeneğini görürsünüz
  4. VERİ KÜMESİ OLUŞTUR'u tıklayın ve veri kümesini adlandırın.

be9f32a18ebb4a5b.png

  1. Veri kümesini oluşturduktan sonra sol panelden tıklayın. Sağ tarafta TABLO OLUŞTUR'u görürsünüz.
  2. TABLO OLUŞTUR'u tıklayın, Tablo adını girin ve ekranın en altındaki Tablo oluştur'u tıklayın.

d5fd99b68b7e62e0.png

  1. Tablo oluşturulduktan sonra sol panelden tabloyu tıklayın. Sağ tarafta "Şemayı Düzenle" düğmesini görürsünüz.
  2. Şemayı Düzenle düğmesini ve Alan Ekle düğmesini tıklayın. "date" tarihini ekleyin alanına girin ve aynı işlemi "time" (zaman) için tekrarlayın ve "type" özelliklerini de ekleyebilirsiniz.
  3. "DatasetID" ve "DatasetID" değerlerini not edin

e9d9abbe843823df.png

3. Dialogflow Fulfillment'a BigQuery bağlantı ayrıntıları ekleme

  1. Dialogflow aracısını açın ve sipariş karşılama satır içi düzenleyiciyi etkinleştirin. Bu konuda yardıma ihtiyacınız varsa önceki laboratuvara göz atın .
  1. Dialogflow karşılama 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 uygularken BigQuery'nin en son sürümünü kullandığınızdan emin olun.
  2. index.js'de "addToBigQuery" oluşturun işlevini kullanın.
  3. BigQuery tablonuzu ve veri kümenizi karşılamanıza düzgün şekilde bağlamak için index.js dosyasının TODO 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);
        }
        );
      }
    });
  });
}

Koddan etkinliklerin sırasını anlama

  1. Amaç haritası, Google Takvim'de randevu planlamak için "makeAppointment&quot; işlevini çağırır
  2. Aynı işlev içinde "addToBigQuery" çağrısı yapılır işlevini kullanın.

4. Chatbot'unuzu ve BigQuery Tablonuzu Test Etme

Şimdi 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ç kaydı için randevu ayarla"
  • Chatbot yanıtı: "Peki, sizi bağlamaya çalışacağım. 6 Ağustos, 14:00'te gerçekleşecektir!."

96d3784c103daf5e.png

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

dcbc9f1c06277a21.png

5. Temizleme

Bu serideki diğer laboratuvarları yapmayı planlıyorsanız temizleme işlemini şimdi yapmayın, serideki tüm laboratuvarları bitirdikten sonra yapın.

Dialogflow aracısını silme

  • Mevcut temsilcinizin yanındaki dişli simgesini 30a9fea7cfa77c1a.png tıklayın.

520c1c6bb9f46ea6.png

  • Genel sekmesinde, en alta ilerleyin ve Bu Aracıyı Sil'i tıklayın.
  • Açılan pencereye DELETE (Sil) yazın ve Delete'i (Sil) tıklayın.

6. Tebrikler!

Analiz elde etmek için bir chatbot oluşturup BigQuery ile entegre ettiniz. Artık bir chatbot geliştiricisisiniz!

Şu diğer kaynaklara göz atın:

1217326c0c490fa.png