1. Введение
В этой статье мы узнаем, как Dialogflow взаимодействует с BigQuery и хранит информацию, собранную во время диалога. Мы будем использовать того же агента, которого создали в предыдущих лабораторных работах, — « Планировщик встреч ». В проекте GCP агента мы создадим набор данных и таблицу в BigQuery. Затем мы отредактируем исходное описание выполнения, добавив идентификаторы набора данных и таблицы BigQuery. Наконец, мы проверим, записываются ли взаимодействия в BigQuery.
Здесь представлена последовательность событий от пользователя до выполнения заказа и обработки запроса в BigQuery.

Что вы узнаете
- Как создать набор данных и таблицу в BigQuery
- Как настроить параметры подключения к BigQuery в процессе выполнения запросов Dialogflow.
- Как проверить выполнение
Предварительные требования
- Основные концепции и структуры Dialogflow. Для ознакомления с вводными видеоуроками по Dialogflow, охватывающими основы проектирования диалогов, посмотрите следующие видео:
- Создайте чат-бота для планирования встреч с помощью Dialogflow.
- Понимание сущностей в Dialogflow.
- Выполнение заказа: Интеграция Dialogflow с Google Календарем.
2. Создайте набор данных и таблицу в BigQuery.
- Перейдите в консоль Google Cloud.
- В консоли Cloud перейдите к значку меню ☰ > Большие данные > BigQuery
- В левой панели в разделе «Ресурсы» щелкните идентификатор проекта; после его выбора справа появится кнопка «СОЗДАТЬ НАБОР ДАННЫХ».
- Нажмите кнопку «СОЗДАТЬ НАБОР ДАННЫХ» и присвойте ему имя.

- После создания набора данных щелкните по нему на левой панели. Справа вы увидите кнопку «СОЗДАТЬ ТАБЛИЦУ».
- Нажмите кнопку «Создать таблицу», укажите имя таблицы и нажмите кнопку «Создать таблицу» внизу экрана.

- После создания таблицы щелкните по ней на левой панели. Справа вы увидите кнопку « Редактировать схему» .
- Нажмите кнопку «Редактировать схему», затем кнопку «Добавить поле». Добавьте поле « дата » и повторите то же самое для полей « время » и « тип ».
- Обратите внимание на " DatasetID" и " tableID".

3. Добавьте данные для подключения к BigQuery в Dialogflow Fulfillment.
- Откройте Dialogflow Agent и включите встроенный редактор Fulfillment. Если вам нужна помощь, обратитесь к предыдущему лабораторному заданию.
- Убедитесь, что в файле " package.json" в редакторе Dialogflow для обработки запросов указана зависимость BigQuery. "@google-cloud/bigquery": "0.12.0". Убедитесь, что вы используете последнюю версию BigQuery на момент выполнения инструкций из этой статьи.
- В файле index.js создайте функцию " addToBigQuery ", которая будет добавлять дату, время и тип встречи в таблицу BigQuery.
- Добавьте projectID , datasetID и tableID в раздел TODO файла 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, о которых мы узнали в предыдущих статьях.
- Пользователь: "Записалась на регистрацию транспортного средства на завтра в 14:00"
- Ответ чат-бота: "Хорошо, давайте посмотрим, сможем ли мы вас принять. 6 августа, 14:00, подойдет!"

- Проверьте таблицу BigQuery после получения ответа. Используйте запрос "SELECT * FROM
projectID.datasetID.tableID"

5. Уборка
Если вы планируете выполнить остальные лабораторные работы из этой серии, не занимайтесь уборкой сейчас, сделайте это после того, как закончите все лабораторные работы серии.
Удалите агент Dialogflow
- Нажмите на значок шестеренки.
рядом с вашим существующим агентом

- На вкладке «Общие» прокрутите вниз и нажмите «Удалить этого агента» .
- В появившемся окне введите DELETE и нажмите «Удалить» .
6. Поздравляем!
Вы создали чат-бота и интегрировали его с BigQuery для получения аналитических данных. Теперь вы — разработчик чат-ботов!
Ознакомьтесь также с другими ресурсами:
- Примеры кода можно посмотреть на странице Dialogflow в GitHub .
