Простой чат-бот Telegram с ИИ: связь через Entaxy

18 июн 2025

Простой чат-бот 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 в домашнем репозитории.

Если обращаться к коду, то:

  1. Подключаемся к боту Телеграма:

<from uri="telegram:bots?authorizationToken={{tg.token}}"/>

  1. Регистрируем и загружаем модель при первом обращении:

PtModelZoo.registerModelZoo(ptProvider);

ZooModel<String, Classifications> model = criteria.loadModel();

  1. Далее достаём входящее сообщение и проверяем фото или текст:

IncomingMessage inMsg = (IncomingMessage) exchange.getIn().getBody();

if (inMsg.getPhoto() != null && inMsg.getPhoto().size() > 0) {

} else if (inMsg.getText() != null) {

  1. Далее примерно одинаковый алгоритм – определяем критерии и экземпляр предиктора. Для фото это выглядит примерно так:

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();

  1. Следующим шагом запрашиваем коллекцию определённых объектов:

DetectedObjects detected = predictorImg.predict(img);

  1. Затем достаём все определённые объекты и составляем ответ:

for (Classifications.Classification classification : detected.items()) {

reply += "- " + classification.getClassName() + " (вероятность " + f.format(classification.getProbability()*100) + "%)\n";

}

  1. Сформированный ответ отправляем в бот Телеграма:

<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%)