Самый простой способ создать телеграм-бот справочную (FAQ). Обзор проекта.
- Серия постов
- Мотивация
- О чем проект
- Сердце системы: NLP
- Анализ существующих решений: Deep Pavlov
- NLP processes
Серия постов
!!! сервис временно отключен, верну как появится свободный сервер !!!
Выложил техническую демку пет-проекта Chipa bots.
Серия постов расскажет технические детали, про реализацию такого сервиса на Quarkus. Сервис на стадии технической демки, но будет доведен до SaaS. Я также планирую выкладывать код систем по мере постов.
Содержание этой части: мотивация, суть сервиса, сердце сервиса на технологиях NLP.
Мотивация
Я загорелся Quarkus когда делал на нем прототип robot-sip-server. Прототип написан на vert.x, Quarkus строится на vert.x и является более высокоуровневым фреймворком.
Почему Quarkus.
Лучше всего сказано здесь: https://quarkus.io/about, но конкретно для меня важно:
- Cloud-native. Минимальная стоимость инфраструктуры.
- Developer joy. Это заложено в философию quarkus, см. п.1 на странице https://quarkus.io/about. Помогает не забыть что процесс программирования может быть вполне приятным (о чем можно забыть поработав с корпоративными системами).
- Актуальный стек, реактивное программирование.
Рабочие проекты не предоставляли возможности пощупать Quarkus: в бизнесе гораздо безопаснее взять Spring, т.к. все программисты его знают; Quarkus рискованная инвестиция.
Конечная цель: доступный публично SaaS сервис написанный на Quarkus.
Также хотелось поработать над улучшением процесса создания проекта с нуля (работа над ошибками ivoice) и пощупать Event Storming.
О чем проект
Нужна была простая и понятная проблема, решение которой можно довести до SaaS, работая одному по выходным, получив результат в обозримый срок (что-то реалистичное).
Рассматривался совместный проект с братом Никитой по реализации алго-трейдинга :)
Однако выбор пал в пользу сервиса создания телеграм-бота для часто-задаваемых вопросов, минимальными усилиями пользователя:
- Сделал табличку вопросов-ответов.
- Загрузил ее в админку
- Подключил к телеграм, готово.
Сердце системы: NLP
Ценность FAQ бота на базе NLP в том, что он будет тренироваться на ограниченном списке вопросов (из таблицы FAQ), в процессе работы пользователи будут задавать вопрос в свободной форме, и бот найдет наиболее близкий по смыслу вопрос из тех, на которых его тренировали:
Что такое “смысл текста” в 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-х процессаъ:
Процесс тренировки
Исходные данные: список вопросов из таблицы FAQ.
- Список вопросов переводится в список векторов через language model (использую библиотеку https://spacy.io)
- Для векторов вопросов строится индекс. Индекс нужен далее в процессе диалога, для поиска ближайшего вектора вопроса (использую https://github.com/spotify/annoy)
Процесс диалога
- Пользователь задает вопрос на естественном языке.
- Вопрос переводится в вектор через language model
- Через индекс определяется вектор ближайшего вопроса из таблицы FAQ на которой тренировали бота.
- В качестве ответа берется ответ из таблицы FAQ на этот ближайший вопрос.
Итого, NLP система состоит из 3-х сервисов:
- text-to-vector: переводит текст в вектор
- index-builder: строит индекс векторов вопросов
- nearest-vector-search: получает на вход вектор (новый вопрос) и ищет ближайший вектор по индексу.
To be continued…