Самый простой способ создать телеграм-бот справочную (FAQ). Обзор проекта.

Серия постов

!!! сервис временно отключен, верну как появится свободный сервер !!!

Выложил техническую демку пет-проекта Chipa bots.

Серия постов расскажет технические детали, про реализацию такого сервиса на Quarkus. Сервис на стадии технической демки, но будет доведен до SaaS. Я также планирую выкладывать код систем по мере постов.

Содержание этой части: мотивация, суть сервиса, сердце сервиса на технологиях NLP.

Мотивация

Я загорелся Quarkus когда делал на нем прототип robot-sip-server. Прототип написан на vert.x, Quarkus строится на vert.x и является более высокоуровневым фреймворком.

Почему Quarkus.

Лучше всего сказано здесь: https://quarkus.io/about, но конкретно для меня важно:

  1. Cloud-native. Минимальная стоимость инфраструктуры.
  2. Developer joy. Это заложено в философию quarkus, см. п.1 на странице https://quarkus.io/about. Помогает не забыть что процесс программирования может быть вполне приятным (о чем можно забыть поработав с корпоративными системами).
  3. Актуальный стек, реактивное программирование.

Рабочие проекты не предоставляли возможности пощупать Quarkus: в бизнесе гораздо безопаснее взять Spring, т.к. все программисты его знают; Quarkus рискованная инвестиция.

Конечная цель: доступный публично SaaS сервис написанный на Quarkus.

Также хотелось поработать над улучшением процесса создания проекта с нуля (работа над ошибками ivoice) и пощупать Event Storming.

О чем проект

Нужна была простая и понятная проблема, решение которой можно довести до SaaS, работая одному по выходным, получив результат в обозримый срок (что-то реалистичное).

Рассматривался совместный проект с братом Никитой по реализации алго-трейдинга :)

Однако выбор пал в пользу сервиса создания телеграм-бота для часто-задаваемых вопросов, минимальными усилиями пользователя:

  1. Сделал табличку вопросов-ответов.
  2. Загрузил ее в админку
  3. Подключил к телеграм, готово.

Сердце системы: NLP

Ценность FAQ бота на базе NLP в том, что он будет тренироваться на ограниченном списке вопросов (из таблицы FAQ), в процессе работы пользователи будут задавать вопрос в свободной форме, и бот найдет наиболее близкий по смыслу вопрос из тех, на которых его тренировали:

NLP Bot

Что такое “смысл текста” в NLP отлично изложено в курсе Яндекс (достаточно изучить лекцию про Word Embeddings): Курс Яндекс по NLP - Word embeddings

Прежде чем изобретать свой велосипед, я попробовал сделать NLP часть сервиса используя готовые компоненты, полностью без кода (tldr: без велосипеда не вышло, но на то он и pet проект).

Анализ существующих решений: Deep Pavlov

В ivoice мы пробовали DeepPavlov, в нем есть готовый skill FAQ. Т.е. можно по инструкции за 5 минут получить телеграм-бота, отвечающего на вопросы FAQ.

Я начинал писать пост про DeepPavlov, в котором препарировал skill faq, но поленился и недописал :) пост »

Применимость DeepPavlov к требуемой SaaS системе

Из коробки не получилось сделать на Deep Pavlov несколько ботов, так, чтобы ресурсы использовались эффективно. На каждый бот в память загружается word embeddings в несколько сот мб. Для ресурсоэффективного SaaS не подходит (либо я недостаточно разобрался в DeepPavlov).

В итоге пошел другим путем, и сделал систему из нескольких сервисов NLP, реализующих только свой функционал: например, сервис text-to-vector, который переводит текст в вектор через word embeddings для 1 языка. Этот сервис делят все боты, говорящие на 1 языке.

NLP processes

Сердце системы заключается в 2-х процессаъ:

Процесс тренировки

Training process

Исходные данные: список вопросов из таблицы FAQ.

  1. Список вопросов переводится в список векторов через language model (использую библиотеку https://spacy.io)
  2. Для векторов вопросов строится индекс. Индекс нужен далее в процессе диалога, для поиска ближайшего вектора вопроса (использую https://github.com/spotify/annoy)

Процесс диалога

Dialog process

  1. Пользователь задает вопрос на естественном языке.
  2. Вопрос переводится в вектор через language model
  3. Через индекс определяется вектор ближайшего вопроса из таблицы FAQ на которой тренировали бота.
  4. В качестве ответа берется ответ из таблицы FAQ на этот ближайший вопрос.

Итого, NLP система состоит из 3-х сервисов:

  1. text-to-vector: переводит текст в вектор
  2. index-builder: строит индекс векторов вопросов
  3. nearest-vector-search: получает на вход вектор (новый вопрос) и ищет ближайший вектор по индексу.

To be continued…