Привет! Я Лёша, 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, которые я смотрел, стоили достаточно дорого. Соответственно, я начал разворачивать открытые модели с максимальным количество параметров, которые потянет мой компьютер, и сравнивать эти модели.

Я взял 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, и так как раньше никогда не интересовался стоимостью железа, чуть не выпал в осадок (может быть они окупаются на больших объемах, но точно для пет проекта).

Видимо, придётся всё‑таки пользоваться 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
Полезные ссылки, которые я выделил для себя, когда штудировал нейронки:
Ваш путеводитель по миру NLP (обработке естественного языка)
Как работает ChatGPT: объясняем на простом русском эволюцию языковых моделей с T9 до чуда
GPT-4: Чему научилась новая нейросеть, и почему это немного жутковато
Введение в LLM для тех, кто все пропустил (выжимка видео Андрея Карпаты, со‑основателя OpenAI)
P. S. Недавно коллега по работе предложил ещё один интересный способ использования бота — искать клиентов в домовых чатах. Его жена — визажист, хочет вступать в домовые чаты и реагировать, когда люди ищут бьюти‑услуги и рекомендации мастеров. «Мы создали демона!», — подумал я.
Может быть, вы тоже придумаете своё креативное применение Telegram‑боту — делитесь в комментариях.