Содержание

Абстрактный автоответчик

Backend Java Developer
Backend Java Developer

Когда я еще выпускался из вуза, темой моей дипломной работы было создание библиотеки для быстрого конструирования ботов любой сложности.

Проект получился настолько удачным, что я пользуюсь им до сих пор. Например, в этих проектах:

Репозиторий проекта

Я хотел создать максимальную абстракцию для ботов. В чем обычно суть бота-автоответчика: пользователь пишет сообщение, а бот подбирает ему ответ из уже имеющихся. Это не обязательно заранее готовый ответ, возможно это какое-то действие: например пользователь присылает фотографию, а получает ее обработанный вариант.

В любом случае схема одна: запрос и ответ.

Используя этот проект можно упростить создание ботов автоответчиков для любых нужд, например для социальных сетей или для чат-бота на вашем сайте, и даже для голосового автоответчика.

Чтобы понимать о чем пойдет речь, и объяснить как работает библиотека, разберем основные понятия:

Сценарий – это цепочка, по которой пользователь проходит. Например: если пользователь пишет “привет”, а бот ему отвечает “привет”, то это сценарий с одним Unit-ом.

Unit – некая единица сценария. Unit может быть просто ответ на вопрос, или проверка на соответствие какому-то условию.

Каждый Unit хранит:

  • Ключевые слова или регулярное выражение
  • Ссылки на следующие Unit-ы
  • Значение приоритета перед другими Unit-ами
  • Процент количества найденных ключевых слов к заданным ключевым словам.

В данном модуле Unit это абстрактный класс. Разработчик, использующий эту библиотеку должен расширить Unit и дать ему действия. Unit может не только отдавать текстовые сообщения, но и, например, сохранять пользовательскую информацию, и выполнять прочие функции.

Для понимания рассмотрим небольшой пример по схеме изображенной ниже. Так же небольшие примеры обработки есть в тестах.

Сценарий

Сценариями в данном случае являются:

  • Unit1 —> Unit2 —> Unit5 —> Unit7 —> Unit9
  • Unit1 —> Unit2 —> Unit6 —> Unit8;
  • Unit1 —> Unit3 —> Unit6 —> Unit8;
  • Unit1 —> Unit4 —> Unit9;
  • Unit10.

Пользователь присылает боту свое первое сообщение, например, «Привет». Если сообщение удовлетворяет регулярному выражению или содержит необходимое количество ключевых слов Unit1, то возвращается Unit1, то же самое относится к Unit10.

Если оба юнита удовлетворяют запросу пользователя, то будет возвращен юнит с большим приоритетом (поле priority). Если приоритеты равны, то случайный Unit.

В нашем примере, на первое сообщение, пользователь получил Unit1, поэтому следующее сообщение пользователя будет ассоциироваться с множеством: Unit2, Unit3 и Unit4.

Добавить библиотеку в ваш проект можно с помощью maven:

<dependency>
    <groupId>org.sadtech.autoresponder</groupId>
    <artifactId>autoresponder</artifactId>
    <version>1.9.2-RELEASE</version>
</dependency>

Для использования библиотеки необходимо в первую очередь создать наследника класса Unit (самый простой вариант представлен в тестах).

Следом создается объект класса UnitPointerService. Он отвечает за сохранение позиции пользователя в сценарии, простыми словами сохраняет последний Unit, который был отправлен пользователю.

Далее создается объект класса AutoResponder. В конструктор передается UnitPointerService и множество юнитов, которые будут проверяться при первом сообщении пользователя.

Далее у объекта AutoResponder вызывается метод answer, который возвращает следующий для пользователя Unit.

Пример использования
Примеры использования библиотеки находятся в тестах проекта.
  1. Существует возможность задать Unit, который будет возвращаться при отсутствии Unit, удовлетворяющего сообщению пользователя (без ключевых слов, и т.п.). Для этого у объекта AutoResponder вызывается метод setDefaultUnit.
  2. Последний Unit сценария не сохраняется в UnitPointerService, вместо этого происходит удаление данных о позиции пользователя в сценарии, и следующее сообщение пользователя будет снова ассоциироваться с начальным множеством Unit-ов.

На основе этой библиотеки вы можете создавать свои автоответчики-боты.

Комментарии