Как стать автором
Обновить
443.63
Альфа-Банк
Лучший мобильный банк по версии Markswebb

Прикручиваем нейросеть к боту, чтобы найти 68 страну для посещения

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров602

Привет! Я Лёша, backend‑разработчик, который любит путешествовать. К 35 годам я посетил 67 стран мира, но с момента написания прошлой статьи пока никуда не ездил. Зато увлёкся нейронками. Эта статья будет как раз о них.

Из статьи вы узнаете:

  • где стоит применить нейронки, а где можно обойтись NLP;

  • как локально крутить LLM и почему стоит воспользоваться API;

  • как подбирать промпты, чтобы получать от ИИ не просто ответы, а реально полезную информацию;

  • зачем вообще в боте для поиска дешёвых авиабилетов (и не только) нейросети и почему в нём осталась лемматизация / NLP, а в некоторых местах регулярки для поиска сообщений.

Предыстория есть в моих прошлых статьях: про идею сделать бот для поиска туров и про доработку MVP‑версии с примерами, что другие юзеры искали через бот. Если коротко, я сделал бота, который мониторит сообщения в Telegram‑каналах и пересылает их, чтобы вы не пропустили действительно вкусные предложения: быстро среагировали на горящий тур, вакансию или распродажу любимого бренда.

Какие доработки Telegram-бота хотели юзеры и желательно вчера

С чего началась очередная доработка? В прошлой статье я упоминал, что хотел бы сделать поиск туров и билетов по датам. Сначала я не понимал, как доставать даты из текста постов в Telegram‑каналах. Опишу технологии, которые сейчас используются для работы с текстом, и финальное решение дальше в статье.

Также я задумал добавить категоризацию сообщений. Например, если добавить бот в канал‑барахолку, можно было бы искать сообщения по технике, по предложениям о работе и другим категориям. Но тогда придётся превратить самописный бот в громоздкий классифайд типа Авито.

Ещё точно стоило бы категоризировать сообщения по странам или регионам при поиске билетов и туров. Человек может искать перелёт не в конкретный город Таиланда, а в любой, но в посте из туристического паблика может быть только название города. Тогда нужно будет подписать бота на пересылку предложений из всех городов, куда летают самолеты.

А как быть, когда ты хочешь отправиться в Юго‑Восточную Азию не дороже 50 тысяч? Забивать в фильтры поиска все страны? Сейчас даже Aviasales не умеет искать по регионам... Второй Aviasales я точно не собирался делать.

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

Сколько стоит добавить нейросети в Telegram-бот

Я начал с такого запроса к нейронке:

Ты — полезный ИИ‑ассистент, который помогает определить, соответствует ли моему запросу сообщение. Сегодня 10 марта 2025 года. В ответе должно быть только слово «да» или слово «нет». Запрос: «Я хочу найти билеты в Санкт‑Петербург в марте». Сообщение: «Из Москвы в Новосибирск 🇷🇺 за 3 900 р. OW (февраль) Smartavia, прямой рейс — https://smkt.us/dk‑ox из Минеральных Вод в Сочи 🇷🇺 за 1 500 р. OW (февраль‑март) Азимут, прямой рейс — https://smkt.us/exw‑x из Челябинска в Петербург 🇷🇺 за 8 000 р. RT (весной) Smartavia, прямые рейсы — https://smkt.us/kug4l».

Для поиска дат я составил примерно такой запрос:

Ты — полезный ИИ‑ассистент, который умеет находить даты в тексте и преобразовывать их в формат dd‑mm‑YYYY. Если год не указан, считай, что сегодня 10 марта 2025 года. Если встречается промежуток дат, выводи его в формате dd‑mm‑YYYY / dd‑mm‑YYYY. В ответе должен быть только список дат без дополнительного текста. Найди и обработай даты в следующем тексте: «Встреча запланирована на 15 марта, а отпуск будет с 20 апреля по 25 апреля. Также у меня есть событие 30.12.2024».

Я начал с того, что испытывал модели, которые можно развернуть локально. Всё‑таки я не планировал делать свой бот платным, хотел поделиться своей наработкой с любым желающим. API, которые я смотрел, стоили достаточно дорого. Соответственно, я начал разворачивать открытые модели с максимальным количество параметров, которые потянет мой компьютер, и сравнивать эти модели.

Знаю, давно пора переходить на M2
Знаю, давно пора переходить на M2

Я взял 8 нейросеток: DeepSeek Chat, DeepSeek-R1 (7b), DeepSeek-R1 (14b), Gemma 2 (9b), Llama 3.1 (8b), OpenAI Chat, Phi-4 (14b), Qwen 2.5 (7b). Проверил, справятся ли они с поиском даты в тексте (запросы 1-2 из таблицы ниже) или с категоризацией поста из Telegram-канала, выдавая ответы «да/нет» (запросы 3-6).

Суть запроса

Какие нейросети справились

1. Найти даты разного формата в тексте и преобразовывать в формат dd‑mm‑YYYY

DeepSeek Chat, Gemma 2 (9b), Llama 3.1 (8b), OpenAI Chat, Phi-4 (14b)

2. Найти даты в тексте, где нет цифр, по описанию: «Хочу поехать на майские праздники/летом/в декабре‑январе»

3. Определить, соответствует ли запросу «Хочу найти билеты в Петербург в марте» конкретный пост из канала выгодных туров

DeepSeek Chat, Gemma 2 (9b), OpenAI Chat, Phi-4 (14b)

4. Определить, соответствует ли запросу «Хочу найти билеты в Петербург» пост

DeepSeek Chat, DeepSeek‑R1 (7b), Gemma 2 (9b), OpenAI Chat, Phi-4 (14b)

5. Определить, соответствует ли запросу «Хочу куда‑то полететь весной» пост

DeepSeek Chat, DeepSeek‑R1 (7b), DeepSeek‑R1 (14b), Gemma 2 (9b), Llama 3.1 (8b), OpenAI Chat, Phi-4 (14b), Qwen 2.5 (7b)

6. Определить, соответствует ли запросу «Хочу найти электронику» пост о продаже Samsung Galaxy S5

DeepSeek Chat, DeepSeek‑R1 (7b), DeepSeek‑R1 (14b), Gemma 2 (9b), OpenAI Chat, Phi-4 (14b)

Нейросети-финалисты, лучше всего справившиеся с парсингом дат и категорий в тексте постов из Telegram: DeepSeek Chat, Gemma 2 (9b), OpenAI Chat, Phi-4 (14b). Они верно обработали 5 запросов из 6 и выдали нужный ответ на промпт.

Полная картина: какие запросы я конкретно отправлял, какие именно ответы возвращали все 8 нейросеток, можете посмотреть в подробном файле LLM-тестирования.

Итак, я выяснил, что с парсингом дат не справляется даже Open AI и DeepSeek. И это ещё мы не усложняли запрос фразами «на новогодние праздники» / «на Масленицу» и т. д. При этом даже выражения «летом» или «в октябре» нейронки воспринимают странно. Какая‑то модель отвечает, что летом — это 10 дней в июле, какая‑то по‑другому. В общем, Скайнет нам, кажется, пока не грозит.

А вот с запросами, на которые нужен ответ «да/нет» всё сильно лучше. Хорошо справляются phi4 (14b) и gemma2 (9b). Я начал их разворачивать на сервере и тестировать запросы по API (6 ядер x 2600 MHz, 12 Гб RAM, 100 Гб SSD NVMe). Обе эти модели отвечают примерно за 8 секунд. Здесь явно не хватает железа для обсчёта (нужно GPU и Kit для ускорения).

Я изначально не предполагал, что мне нужна будет многопоточка — переписывать код под это дело придётся немало. Я пошёл смотреть цены на аренду серверов с GPU, и так как раньше никогда не интересовался стоимостью железа, чуть не выпал в осадок (может быть они окупаются на больших объемах, но точно для пет проекта).

Самая дешёвая конфигурация для бесплатного бота стоила бы мне 23 600 рублей в месяц
Самая дешёвая конфигурация для бесплатного бота стоила бы мне 23 600 рублей в месяц

Видимо, придётся всё‑таки пользоваться API. Что пробовал из самого известного:

  • DeepSeek — отвечает за 5–6 секунд — надо параллелить приложение. Еще пугает, что в онлайн‑чате часто выходит ответ «Server is busy»

  • OpenAI — сильно дороже, нужен прокси на сервере, так как сервис не работает в России

  • YandexGPT API. Я остановился на нём. Именно он сейчас работает в боте. Сначала бот работал на версии Lite, но с большими сообщениями Яндекс начинал капризничать. Теперь всё работает на версии Pro.

Как-то в этом сообщении Яндекс увидел запрос "Ищу авиабилеты из Москвы в Пятигорск"
Как-то в этом сообщении Яндекс увидел запрос "Ищу авиабилеты из Москвы в Пятигорск"

Так как запросы по API стоят денег, пришлось перекладывать на пользователя расходы на проверку сообщений. Для этого я написал биллинг, который считает операции проверки сообщений в зависимости от длины сообщения (количества токенов). Баланс теперь можно получить или пополнить (всем новым пользователям на баланс я добавил от себя приветственную сумму, чтобы они могли потестировать бот).

Как бот работает с балансом
Как бот работает с балансом

Как пофиксить поиск по ключевым словам в боте через NLP

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

  • Кто‑то из юзеров принципиально не готов пользоваться платным софтом. Это культура потребления, почти все привыкли, что всё ПО должно быть бесплатным.

  • Не все из нас промпт‑инженеры и могут подобрать правильно запрос под поиск того, что хотят получить от бота.

  • Нейросети иногда (часто) врут. Посмотрите ещё раз сообщение от YandexGPT, которое мне переслал бот по поиску «Москва — Минеральные Воды».

В итоге для получения сумм и дат из текста я использовал NLP Python‑библиотеки:

  • pullenti и pullenti_wrapper для русского языка. На английском не работает практически никак.

  • spacy (работает только для английского) в сочетании с dateparser для получения из текста дат (один умеет определять что сущность — это дата, второй переводить в ISO‑формат) и регулярку для сумм.

  • natasha популярная, но очень плохо распознает даты или суммы.

  • deeppavlov — популярная, но устаревшая библиотека, судя по тому, что не работает с новой версией Python и из‑за постоянных конфликтов старых пакетов. Удалось попробовать только через контейнер, и оказалось, тоже плохо распознает суммы и даты.

    Ссылка сервис для извлечения дат и сумм

Ещё у меня есть два сервиса, о которых я до этого не писал, но они могут кому‑то пригодиться (все они так же в докер‑контейнерах):

  • Сервис лемматизации — работает через библиотеку pymystem3 (я пробовал Snowball для Java, но сравнение «Египет» и «в Египте» оказалось для него невозможным).

  • OCR‑сервис, так как информацию о перелётах часто выкладывают в виде скриншота из поиска на Aviasales

Напоследок покажу, как теперь выглядит настройка подписки:

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

Ссылка на бот, который я обучил искать что угодно в Telegram-каналах@BackendFrowarderBot

Полезные ссылки, которые я выделил для себя, когда штудировал нейронки:

P. S. Недавно коллега по работе предложил ещё один интересный способ использования бота — искать клиентов в домовых чатах. Его жена — визажист, хочет вступать в домовые чаты и реагировать, когда люди ищут бьюти‑услуги и рекомендации мастеров. «Мы создали демона!», — подумал я.

Может быть, вы тоже придумаете своё креативное применение Telegram‑боту — делитесь в комментариях.

Теги:
Хабы:
+10
Комментарии2

Полезные ссылки

Работа продуктовым дизайнером в бигтехе — тупик карьеры?

Время на прочтение9 мин
Количество просмотров1.7K
Всего голосов 25: ↑24 и ↓1+25
Комментарии1

База об организации процесса разметки: команда, онбординг, метрики

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров1.6K
Всего голосов 14: ↑13 и ↓1+17
Комментарии1

Дебаг на максимум: секретные настройки Xcode, которые должен знать каждый разработчик

Уровень сложностиСложный
Время на прочтение11 мин
Количество просмотров4.7K
Всего голосов 19: ↑17 и ↓2+17
Комментарии4

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

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров551
Всего голосов 5: ↑5 и ↓0+6
Комментарии1

Хакатон «Цифровой прорыв»: как команда валидации Альфа-Банка разработала решение для РЖД

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров1.4K
Всего голосов 12: ↑12 и ↓0+13
Комментарии8

Информация

Сайт
digital.alfabank.ru
Дата регистрации
Дата основания
1990
Численность
свыше 10 000 человек
Местоположение
Россия