Простой чат-бот Telegram с ИИ: связь через Entaxy - Entaxy
Простой чат-бот Telegram с ИИ: связь через Entaxy
Описание
Допустим у вас есть задача сделать чат-бот в Telegram, который бы использовал ИИ для ответов на вопросы. У вас есть готовая модель и вам надо как-то связать бота с ней. Давайте разберёмся как это сделать. Идея данной реализации была подсмотрена тут. В видео описывается как Apache Camel мониторит чат-бот в ТГ, получает сообщения и разделяет их по топикам Kafka. Далее сообщения анализируются при помощи ML и результаты анализа возвращаются в чат тем же Camel. Наша реализация имеет ряд упрощений – главное, что из неё исключена Kafka и Kubernetes.
Детали реализации
В текущей реализации используется библиотека Deep Java Learning с PyTorch и Entaxy. В целях демонстрации были использованы уже готовые ML модели. Для работы с ботами был использован стандартный компонент telegram:bots - для его работы достаточно токена бота. Для создания бота в ТГ нужно использовать BotFather. В данном сценарии никак не задействован chat id - для работы одновременно нескольких пользователей это может потребоваться. Обратите внимание, что данная конфигурация версия завелась на OSX - для старта на других ОС возможно придётся что-то донастроить. Необходимые для работы нативные библиотеки PyTorch и модель устанавливаются в папку .djl.ai в домашнем репозитории.
Если обращаться к коду, то:
- Подключаемся к боту Телеграма:
<from uri="telegram:bots?authorizationToken={{tg.token}}"/>
- Регистрируем и загружаем модель при первом обращении:
PtModelZoo.registerModelZoo(ptProvider);
ZooModel<String, Classifications> model = criteria.loadModel();
- Далее достаём входящее сообщение и проверяем фото или текст:
IncomingMessage inMsg = (IncomingMessage) exchange.getIn().getBody();
if (inMsg.getPhoto() != null && inMsg.getPhoto().size() > 0) {
} else if (inMsg.getText() != null) {
- Далее примерно одинаковый алгоритм – определяем критерии и экземпляр предиктора. Для фото это выглядит примерно так:
Criteria<Image, DetectedObjects> criteria = Criteria.builder()
.optApplication(Application.CV.OBJECT_DETECTION)
.setTypes(Image.class, DetectedObjects.class)
.optFilter("backbone", "resnet50")
.build();
predictorImg = ModelZoo.loadModel(criteria).newPredictor();
- Следующим шагом запрашиваем коллекцию определённых объектов:
DetectedObjects detected = predictorImg.predict(img);
- Затем достаём все определённые объекты и составляем ответ:
for (Classifications.Classification classification : detected.items()) {
reply += "- " + classification.getClassName() + " (вероятность " + f.format(classification.getProbability()*100) + "%)\n";
}
- Сформированный ответ отправляем в бот Телеграма:
<to uri="telegram:bots?authorizationToken={{tg.token}}"/>
Установка и настройка
- Скачайте Entaxy https://entaxy.ru/download
- Запустите Entaxy https://docs.entaxy.ru/entaxy-core/latest/getstarted/get-started.ru.html
- Зайдите в Karaf Console
- Выполните feature:install camel-telegram
- Последовательно выполните следующие установки и стартуйте все бандлы:
- install mvn:org.reactivestreams/reactive-streams/1.0.4
- install mvn:org.apache.commons/commons-compress/1.11
- install mvn:com.google.code.gson/gson/2.10
- install wrap:mvn:net.java.dev.jna/jna/5.12.1
- install mvn:org.json/json/20180813
- install mvn:commons-io/commons-io/2.7
- install wrap:mvn:ai.djl/api/0.19.0
- install wrap:mvn:ai.djl/model-zoo/0.19.0
- install wrap:mvn:ai.djl.pytorch/pytorch-native-cpu/1.12.1
- install wrap:mvn:ai.djl.pytorch/pytorch-engine/0.19.0
- install wrap:mvn:ai.djl.pytorch/pytorch-model-zoo/0.19.0
- Создайте чат-бот в ТГ и получите его токен https://core.telegram.org/bots/tutorial
- Сохраните токен в файл etc/ru.entaxy.esb.sample.tg.cfg tg.token=XXXXXXXXXX:XXGbJJXXXwhw9VXXXiDCCCi1XXXkiaZMXXX
- Скачайте бандл entaxy-tg https://entaxy.ru/documents/377601/8357096/entaxy-tg-1.0-SNAPSHOT.jar/3c6fa002-1673-9a20-1352-86b5fe18dea9?t=1749551926275&download=true
- Установите бандл в локальный репозиторий Maven, запустив команду из терминала:
mvn install:install-file -Dfile=entaxy-tg-1.0-SNAPSHOT.jar \
-DgroupId= ru.entaxy.integration.example \
-DartifactId= entaxy-tg \
-Dversion= 1.0-SNAPSHOT \
-Dpackaging=jar
- Установите бандл в Entaxy командой в Karaf Console: install mvn:ru.entaxy.integration.example/entaxy-tg/1.0-SNAPSHOT и стартуйте
- По итогу в Entaxy должно быть установлено следующее:
346 │ Active │ 50 │ 2.0.3 │ Netty Reactive Streams Implementation
347 │ Active │ 50 │ 3.4.5 │ camel-telegram
348 │ Active │ 50 │ 3.4.5 │ camel-webhook
349 │ Active │ 50 │ 2.12.1 │ Asynchronous Http Client
350 │ Active │ 50 │ 2.12.1 │ Asynchronous Http Client Netty Utils
365 │ Active │ 80 │ 1.0.4 │ reactive-streams-jvm
368 │ Active │ 80 │ 1.22.0 │ Apache Commons Compress
373 │ Active │ 80 │ 2.10.0 │ Gson
392 │ Active │ 80 │ 0 │ wrap_mvn_ai.djl.pytorch_pytorch-native-cpu_1.12.1
393 │ Active │ 80 │ 0 │ wrap_mvn_ai.djl_api_0.19.0
394 │ Active │ 80 │ 0 │ wrap_mvn_ai.djl_model-zoo_0.19.0
395 │ Active │ 80 │ 0 │ wrap_mvn_ai.djl.pytorch_pytorch-engine_0.19.0
396 │ Active │ 80 │ 0 │ wrap_mvn_ai.djl.pytorch_pytorch-model-zoo_0.19.0
397 │ Active │ 80 │ 1.0.0.SNAPSHOT │ entaxy-tg
400 │ Active │ 80 │ 5.12.1 │ jna
403 │ Active │ 80 │ 2.7.0 │ Apache Commons IO
404 │ Active │ 80 │ 20180813.0.0 │ JSON in Java
Как это работает?
В бот можно отправлять текстовые сообщения или картинки. Текстовые сообщения движок ML анализирует на то позитивный или негативный окрас они имеют, а в картинках ищет знакомые образы. В том и другом случае пользователю возвращается вероятность совпадений.
Проверка работы
- Отправьте текстовое сообщение в бот (модель работает только на английском), например "Such a wonderful weather today!" в ответ должно вернуться следующее: Ваше сообщение было Positive с вероятностью 99,99%
- Найдите картинку поезда и отправьте в бот - должно вернуться следующее: Следующие объекты были определены на картинке:
- train (вероятность 95,01%)
ул. Гоголя, д. 40, этаж 2