Якщо чат-бот приймає дані від користувача, то де зберігати ці дані? А якщо потрібно реалізувати читання даних (наприклад, список товарів) та відображати їх у гарному вигляді у месенджері? Як у першому, так і у другому випадку вам не обійтися без бази даних.

Можна спробувати викрутитися за допомогою Google Sheets або текстового файлу, але я рекомендував би підключити повноцінну базу даних. Не думайте, що це складно. Зовсім ні. Підтримувати базу даних може будь-який працівник (редагувати там дані), а переваги ви отримаєте колосальні. По-перше, це швидкість роботи (процес читання-запису даних). По-друге — до цієї бази даних ви зможете підключити мобільний додаток, веб-сайт або просто використовувати базу одночасно на декількох пристроях різними людьми (співробітниками вашої компанії).

Базу даних можна взяти будь-яку. Dialogflow чудово працює як з Airtable, так і з такою складною СУБД, як MySQL.

Але я рекомендував би зупинити вибір на Firebase. Це сервіс, що працює в інфраструктурі Google (як і Dialogflow), легко інтегрується з іншими продуктами компанії. До складу сервісу входить також база даних Cloud Firestore. Робота з нею не потребує спеціальних технічних знань.

Звучить цікаво? Давайте розбиратися, як із цим усім працювати.

Якщо стаття видасться складною, подивіться відео на YouTube, де я коротше і просто (як мені здається) поясню як працювати з базою даних.

Отже, Cloud Firestore – це гнучка база даних від компанії Google. Призначена для інтеграції з веб-додатками та мобільними платформами. На відміну від реляційних баз даних (MySQL, PostgreSQL), Cloud Firestore організує дані в колекціях і документах. Можна використовувати запити для отримання як одного, так і групи документів колекції. До запитів дозволено застосовувати фільтри та сортування. Якщо порівняти з реляційною моделлю, замість таблиць у вас колекції. Замість рядків – документи. А замість “селектів” – механізм фільтрації. І все це реактивно прискорюється за допомогою індексів.

Одна з головних функцій Cloud Firestore – це миттєва синхронізація даних на кожному підключеному пристрої без необхідності оновлювати сторінку.

Але повернемося до наших чат-ботів. Всі ці “плюшки” вам швидше за все не знадобляться зі старту, але в перспективі можуть допомогти побудувати непогану інфраструктуру навколо вашого проекту, що включає веб-сайт, мобільний додаток, чат-бот і все це в одній хмарній екосистемі Google.

Як розпочати роботу

Відкрийте консоль Cloud Firebase за адресою https://console.firebase.google.com, перейдіть до Firestore Database і виберіть проект Google Cloud, який раніше створювався в Dialogflow. Перевірте назву в налаштуваннях агента Dialogflow, щоб не помилитися.

1

Аналогічна назва проекту має бути доступна і на панелі Firebase.

Якщо ви запитаєте, чи запускати базу в тестовому режимі, можна погоджуватися. Тож вам не доведеться налаштовувати дозволи на читання-запис тощо.

Створіть нову колекцію. Наприклад, “Users”. Тепер переходимо до заповнення колекції документами. Я створюю користувача з полями “name” і “phone” для збереження імені та телефону відповідно. Не забудьте вказати ID. Ідентифікатор документа має бути унікальним. Це може бути довільне число, так і згенерований ідентифікатор, якщо натиснути на Auto-ID.

2

Як бачите, організація даних у такому вигляді досить проста. Якщо потрібно зберегти картинку - розмістіть посилання на неї, а саму картинку ви можете завантажити в розділ Storage (це сховище файлів тут же, Firebase).

3

Повертаємось у Dialogflow та навчимо нашого агента читати та записувати дані, використовуючи зв’язку з Cloud Firestore.

Інтеграція з базою здійснюється лише через Fulfillment. Я використовуватиму Inline Editor, щоб вам було простіше і не доводилося морочитися з хостингом. Нагадаю, база даних, серверна частина (функції обробки запитів чат-бота) та файли зберігатимуться в “хмарі”, наданому інфраструктурою Google.

Отже, відкриваємо потрібний інтент і включаємо “Enable webhook call for this intent”. Цією опцією ми передаємо управління окремою функцією, яка оброблятиме інтент, зв’язуватися з базою даних і генеруватиме відповідь (Response) для користувача.

Переходимо до розділу Fulfillment, активуємо Inline Editor і у верхній частині коду прописуємо:

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore(); 

Нам потрібно підготувати функцію для запису даних та зв’язати її з інтентом, в якому ми активували опцію “Enable webhook call for this intent”.

Робимо зв’язку. Переходимо в кінець програмного коду, знаходимо записи виду “intentMap.set…” і додаємо рядок:

intentMap.set('firebase - yes', writeDB);

де “firebase - yes” - ім’я вашого інтенту, а “writeDB” - ім’я функції, яку ми зараз створимо.

Піднімаємося трохи вище, де оголошення інших функцій, і додаємо наступний код:

function writeDB(agent) {
// здесь я получаю данные из контекста. Если у вас контекста нет и пользователь
// заполняет параметры, то строка будет иметь вид:
// var name = agent.parameters.name;   
var name = agent.context.get('waitdata').parameters.name;
var phone = agent.context.get('waitdata').parameters.phone;   
 
return db.collection('users').add({
name: name,
phone: phone
})
.then(function(docRef) {
   agent.add('Спасибо, ' + name + ', через 30 мин. с вами свяжется менеджер.');
})
.catch(function(error) {
   agent.add('Ошибка!');
});
}

Сподіваюся, що код зрозумілий навіть без пояснення. Ми додаємо значення параметрів до нового документа колекції “users”. Після того, як документ створено, агент поверне користувачеві відповідь. Якщо виникла помилка, то відправляє повідомлення про помилку.

Для читання даних з бази створіть нову функцію за аналогією. Зв’яжіть із відповідним інтентом. Для різноманітності я створив ще одну колекцію зі списком міст. І хочу прочитати один запис зі списку, знаючи його ідентифікатор (припустимо, що цей ідентифікатор передав користувач).

Код функції буде приблизно таким:

function getDB(agent) {
	// читаем документ по ID
	return db.collection('cities').doc('1').get().then( function(document) {
		var dt = document.data();
		var dt_str = 'Город: ' + dt.name + ' | ' + dt.code;
		agent.add(dt_str);
	});
}

Це базові функції запису та читання даних. Далі, ви можете розширювати їх на свій розсуд. Наприклад, можна читати не один документ, а одразу всі, перебираючи їх циклом “documents.forEach”. Або можна повертати не просто текстовий рядок в agent.add, а підготувати повноцінні картки товарів (чи що вам потрібно) та повернути їх як відповідь агента, використовуючи формат:

{"card": {
	"title": data.title,
	"subtitle": data.subtitle,
	"imageUri": data.url,
	"buttons": [
		{
			"text": "текст кнопки",
			"postback": "быстрый ответ"
		}
	]
}
 
….
….

…і так далі. Для кожного месенджера картки генеруються по-різному, для цього вам потрібно дивитися опис месенджерів у документації Dialogflow. Або в API потрібного месенджера.

У більшості випадків, вам достатньо простих операцій читання і запису. Якщо знадобиться вибірка даних за умовою, то використовуйте команду .where

const userRef = firebase.firestore().collection("users");
var query = userRef.where("name","==","Алексей");

Все це та багато іншого корисного, добре розписано в документації Cloud Firestore.

Сподіваюся, матеріал виявився не дуже складним і я вас не налякав цим Firebase. У будь-якому випадку, повноцінна база даних - це більш гнучке і швидке рішення, ніж звичні Google Таблиці.