Если чат-бот принимает данные от пользователя, где эти данные хранить? А если нужно реализовать чтение данных (например, список товаров) и отображать их в красивом виде в мессенджере? Как в первом, так и во втором случае вам не обойтись без базы данных.
Можно попробовать выкрутиться с помощью Google Sheets или текстового файла, но я бы рекомендовал подключать полноценную базу данных. Не думайте, что это сложно. Вовсе нет. Поддерживать базу данных сможет любой менеджер, а преимущества вы получите колоссальные. Во-первых, это скорость работы (процесс чтения-записи данных). Во-вторых — к этой же базе данных вы сможете подключить мобильное приложение, веб-сайт или просто использовать базу одновременно на нескольких устройствах разными людьми (сотрудниками вашей компании).
Базу данные можно взять любую, Dialogflow прекрасно работает как с Airtable, так и с такой сложной СУБД, как MySQL.
Но я бы рекомендовал остановить выбор на Firebase. Это сервис, работающий в инфраструктуре Google (как и Dialogflow), легко интегрируется с другими продуктами компании. В состав сервиса входит также база данных, Cloud Firestore. Работа с ней не требует особых технических знаний.
Звучит интересно? Давайте разбираться, как с этим всем работать.
Если статья покажется сложной, посмотрите видео на YouTube, где я более кратко и просто (как мне кажется) объясняю как работать с базой данных.
Итак, Cloud Firestore — это гибкая база данных от компании Google. Предназначена для интеграции с веб-приложениями и мобильными платформами. В отличии от реляционных баз данных (той же MySQL), Cloud Firestore организует данные в коллекциях и документах. Можно использовать запросы для получения как одного, так и группы документов из коллекции. К запросам разрешено применять фильтры и сортировку. Если сравнить с реляционной моделью, то вместо таблиц у вас коллекции. Вместо строк — документы. А вместо “селектов” — механизм фильтрации. И все это реактивно ускоряется с помощью индексов 😄
Одна из главных особенностей Cloud Firestore — это мгновенная синхронизация данных на каждом подключенном устройстве без необходимости обновлять страницу.
Но вернемся к нашим чат-ботам. Все эти “плюшки” вам скорее всего не понадобятся со старта, но в перспективе могут помочь выстроить неплохую инфраструктуру вокруг вашего проекта, включающую веб-сайт, мобильное приложение, чат-бот и все это в одной облачной экосистеме Google.
Как начать работу
Откройте консоль Cloud Firebase по адресу https://console.firebase.google.com, перейдите в Firestore Database и выберите проект Google Cloud, который ранее создавался в Dialogflow. Проверьте название в настройках агента Dialogflow, чтобы не ошибиться.
Аналогичное название проекта должно быть доступно и в панели Firebase.
Если у вас спросят, запускать ли базу в тестовом режиме, можно соглашаться. Так вам не придется настраивать разрешения на чтение-запись и т.д.
Создайте новую коллекцию. Например, “Users”. Теперь переходим к наполнению коллекции документами. Я создам пользователя с полями “name” и “phone” для хранения имени и телефона соответственно. Не забудьте указать ID. Идентификатор документа должны быть уникальным. Это может быть как произвольное число, так и сгенерированный идентификатор, если нажать на Auto-ID.
Как видите, организация данных в таком виде достаточно проста. Вы можете создавать сколько угодно полей, хранить данные о товарах, клиентах и т.д. Если нужно сохранить картинку — разместите ссылку на нее, а саму картинку вы можете загрузить в раздел Storage (это хранилище файлов здесь же, в Firebase).
Возвращаемся в Dialogflow и научим нашего агента читать и записывать данные, используя связку с Cloud Firestore.
Интеграция с базой осуществляется только через Fulfillment. Я буду использовать Inline Editor, чтобы вам было проще и не приходилось заморачиваться с хостингом. Напомню, база данных, серверная часть (функции обработки запросов чат-бота) и файлы будут храниться в “облаке”, предоставленное инфраструктурой Google.
Нужна консультация? Пишите мне в Telegram @oleksii_malygin. Другие контакты найдете на сайте.
Итак, открываем нужный интент и в самом низу включаем “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 Таблицы.