- BrainTools - https://www.braintools.ru -
Сейчас мало кого удивишь чат-ботом в Telegram, даже если он на базе LLM. Но, согласитесь, таким умным решением может похвастаться не каждый университет.
На связи Роман Дерунец и Иван Бондаренко (@bond005 [1]) — научные сотрудники лаборатории прикладных цифровых технологий [2] механико-математического факультета НГУ. В статье поделимся опытом [3] разработки нашего университетского чат-бота: расскажем, зачем он понадобился НГУ, почему мы решили создать его с нуля и что важно знать тем, кто хочет такой же. А еще — поделимся инструкцией, как запустить похожее решение в облаке.

Как в НГУ появилась идея создать своего умного чат-бота [4]
Задачи, которые предстояло выполнять чат-боту [5]
Параметры и конфигурация ВМ, на которой разместили чат-бота НГУ [7]
Как запустить подобного чат-бота с LLM в Telegram [8]
Советы для тех, кто тоже хочет развернуть собственный чат-бот с LLM [9]
Наши планы [10]
На базе механико-математического факультета НГУ работает лаборатория прикладных цифровых технологий. Там студенты и преподаватели создают разработки на базе искусственного интеллекта [11]. У нас был опыт работы с языковыми моделями, которые отвечают на основе информации из баз данных.
Мы поговорили с руководством университета, и оно одобрило создание такого чат-бота. А еще разработка получила грант по программе «Приоритет 2030» [12] — она поддерживает инновационные проекты в университетах.
У НГУ есть внутренние базы данных, в которые подгружены все нужные сведения об университете. Цель создания чат-бота — упростить процесс поиска информации, сократить его до нескольких секунд. Для реализации этой цели чат-бот решает сразу несколько задач:
Разгружает сотрудников университета. Служба поддержки быстрее находит ответы на вопросы и обрабатывает заявки от студентов и коллег: как изменить пароль от личного кабинета или получить доступ к почте. А отдел маркетинга и коммуникаций быстрее находит нужные фотографии, чтобы использовать их для постов в социальных сетях НГУ.
Привлекает абитуриентов. Все, кто интересуется университетом, быстро находят ответы на вопросы по поводу поступления, обучения [13], кампуса, преподавательского состава. А еще такой чат-бот — дополнительный плюс в глазах абитуриентов, так как заинтересовывает технологиями, которые мы делаем.
Переводит поиск по базе знаний в одно место. Наш чат-бот работает в Telegram. Чтобы что-то найти, не нужно переходить на сайт университета и искать по разным разделам. Всю нужную информацию человек может получить в одном месте.
Кроме этого, мы целенаправленно хотели сделать собственное решение — с небольшими, но заточенными именно под наши задачи моделями. Можно было бы взять Chat GPT, а не обучать собственную LLM, но при работе со своей моделью можно использовать чувствительные данные — без маскинга и опасений, что информация куда-то утечет. Еще нам было важно, чтобы модель отвечала вежливо и учитывала не зарубежные, а российские реалии.
Есть виртуальная машина, к ней подключены базы данных. В БД содержатся информация об университете, вступительных испытаниях, факультетах, направлениях, фотографии, а также сведения, которые нужны сотрудникам университета.
В ВМ размещены сами LLM: основная и несколько эмбеддеров. Языковая модель, которая лежит в основе чат-бота, разработана у нас в НГУ и выложена в открытый доступ. Эта LLM — Meno-Tiny [14], в ней 1,5 млрд параметров, что позволяет модели обрабатывать запросы студентов, абитуриентов и сотрудников вуза. Из всех русскоязычных моделей с аналогичным числом параметров Meno-Tiny занимает первое место в бенчмарке МЕРА [15] как инструкционная модель.
Основная модель генерирует ответ, может переформулировать пользовательский запрос, а также отслеживает контекст. Например, при запросе: «Кто ректор НГУ?» модель ответит: «Михаил Петрович Федорук». Если пользователь спросит: «В каком году он стал ректором?», надо переформулировать запрос, так как для для модели, семантического или лексического поиска «он» — это что-то неизвестное. Именно из контекста модель понимает, кто такой «он».
Модель запоминает диалог и знает, какой фрагмент запроса ей нужно заменить, чтобы найти информацию в БД. Часто это происходит с местоимениями. Пользователи задают уточняющие вопросы, и основная задача — восстановить контекст.
Эмбеддеры построены по другой архитектуре: они переводят запросы пользователя и тексты из базы знаний в векторы. Когда поступает запрос от пользователя, эмбеддер переводит ее в вектор и сравнивает его с векторами из БД, чтобы найти релевантный фрагмент из базы знаний. Так происходит семантический поиск.
Чат-боты — не новая технология, но раньше они работали по заранее заготовленным интентам и ответам для них. Для пользователя это не очень удобно: шаг в сторону от заготовленного интента, и модель ничего не выдаст. В векторных БД можно вести поиск не по точным совпадениям, а по смыслам, то есть производить семантический поиск. В таком случае заранее заготовленные интенты не нужны, и модель может более гибко обрабатывать запросы пользователей.
Также чат-бот способен определить, является ли запрос или ответ токсичным. Для этого задействуем вспомогательные модели и цепочки вызовов основной модели. А чтобы поддерживать актуальность, к разделам БД мы добавили даты — осталось сделать по ним дополнительную сортировку. Тогда модель сможет отделять актуальное от неактуального, выдавать пользователю только свежую информацию.
Для размещения выбрали ВМ с GPU 4 vCPU/64 ГБ RAM/1 GPU V100 на облачной платформе Cloud.ru Evolution [16]. Этот инструмент используют для машинного обучения, AI-проектов и обработки трехмерной графики. Мы изучили функционал, познакомились с параметрами и выбрали эту ВМ.
Также у нашего бота нелинейная нагрузка. Например, когда проходит день открытых дверей или начинается приемная кампания после ЕГЭ, нагрузка на бот возрастает — абитуриенты используют его активнее. То же самое во время других мероприятий: конференций, выездов студентов, олимпиад. У ВМ Cloud.ru Evolution есть возможность использовать ресурсы по модели pay-as-you-go, когда платишь только за потребляемые мощности.
А еще обязательно нужен был сервер с GPU — чтобы обрабатывать большие объемы данных и проводить параллельные вычисления.
В инструкции — примерный алгоритм запуска чат-бота в контейнере, созданного через Evolution Container Apps [17] в облаке Cloud.ru.
Для обращения к обученной вами модели нужно поменять код бота, а в инструкции мы разобрали вариант, где чат-бот обращается к DeepSeek.
1. Подготовьте среду [18], если не сделали этого ранее.
2. Клонируйте или скачайте репозиторий кода c GitVerse. Это необязательный шаг. Вы можете зарегистрироваться в GitVerse [19], если у вас еще нет аккаунта, и познакомиться с новой системой контроля версий.
В этом репозитории находится готовый образ Telegram-бота на языке Python:
git clone https://gitverse.ru/cloudru/evo-containerapp-telegrambot-webhook-python-sample [20]
3. Зарегистрируйте Telegram-бота:
1. В Telegram найдите BotFather [21].

2. Выполните команду /newbot.
3. Задайте имя (name) и имя пользователя (username) для бота.
Имя пользователя должно оканчиваться на …Bot или …_bot. В нашем случае:
name: new-bot
username: botforlabbot
В результате вы получите токен. Сохраните его — он потребуется на следующих этапах.

4. С помощью команды /setuserpic установите иконку для вашего бота:

4. Соберите образ и присвойте тег. Как создать реестр в сервисе Artifact Registry и получить ключи доступа, описано в шагах 3–5 лабораторной работы [22]. Если реестр и ключи доступа уже есть, можно сразу переходить к сборке образа. Если нужно создать новые или их нет, пройдите шаги 3-5 из лабораторной работы.
Далее — соберите образ и присвойте ему тег, выполнив следующую команду:
docker build –tag <registry_name>.cr.cloud.ru/telegram-bot-ai-example https://gitverse.ru/cloudru/evo-containerapp-telegrambot-foundation-models-sample.git#master [23] –platform linux/amd64
5. Загрузите Docker-образ в реестр:
1. Загрузите образ в реестр Artifact Registry, выполнив команду:
docker push <registry_name>.cr.cloud.ru/telegram-bot-example
В этой команде:
<registry_name> — название реестра, которое вы указывали при его создании в Artifact Registry;
telegram-bot-ai-example — название будущего репозитория в Artifact Registry. Название репозитория соответствует имени Docker-образа.
2. В личном кабинете перейдите в раздел «Реестры» → «Репозитории» → «Артефакты» сервиса Artifact Registry и убедитесь, что образ загружен.

6. Создайте и запустите контейнер:
1. Перейдите в сервис Container Apps через меню в левом верхнем углу экрана.

2. Нажмите «Создать».

3. Укажите название контейнера и выберите его конфигурацию.

4. Выберите реестр, репозиторий и тег Docker-образа, который вы загрузили в Artifact Registry.

5. Укажите порт контейнера — 5000.

6. Перейдите на вкладку «Переменные» и добавьте несколько переменных окружения:
BOT_TOKEN — в значении переменной укажите токен, полученный при регистрации бота в BotFather.
PROJECT_ID — ID вашего проекта в Evolution https://cloud.ru/docs/marketplace/ug/services/ai-playground/api-ref__project-id [24].
Model_ID — ID модели, к которой будет обращаться бот https://cloud.ru/docs/marketplace/ug/services/ai-playground/overview__ai-playground.html [25]
KEY_ID/SECRET_ID — Персональные ключи доступа https://cloud.ru/docs/console_api/ug/topics/guides__api_key#id2 [26]

7. Опционально можно также настроить масштабирование контейнеров.

8. Нажмите «Создать».
9. Дождитесь, когда контейнер и ревизия перейдут в статус «Выполняется».

7. Добавьте вебхук в Telegram. Чтобы бот получал сообщения из Telegram, добавьте вебхук:
1. Откройте любой браузер.
2. В адресной строке введите по очереди запросы.
Проверьте, существуют ли вебхуки:
— https://api.telegram.org/bot{BOT_TOKEN}/getWebhookInfo [27]

— {BOT_TOKEN} здесь и далее — токен, который был сгенерирован при регистрации бота в BotFather.
Удалите существующие вебхуки: https://api.telegram.org/bot{BOT_TOKEN}/deleteWebhook [28]

Добавьте новый вебхук: https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={PUBLIC_URL}/{BOT_TOKEN} [29]

{PUBLIC_URL} — публичный URL-адрес, который был сгенерирован при создании контейнера в Container Apps.
8. Проверьте работу Telegram-бота. Вызовите бота в Telegram по имени пользователя (username) и проверьте его работу, выполнив команду /start.

Готово. Кстати, сейчас со всеми настройками и запуском ВМ помогает новый AI-помощник Клаудия [30]. Жаль, что этой фичи еще не было, когда мы размещали своего бота.
Нюансов много: нужно подумать и об архитектуре проекта, и о том, как будет выстроена командная работа. Что можно порекомендовать исходя из нашего опыта?
Первый совет: продумать архитектуру бота, быть готовыми перенастроить ее в процессе. Надо уделить большое внимание [31] тому, как в работу встроены базы данных, LLM и эмбеддеры, как они взаимодействуют, в одном или в разных контейнерах находятся модель и сам бот. Предусмотреть, как будут обновляться базы данных, какой контекст из них модель будет подтягивать для ответов.
Отдельно стоит подумать о масштабировании, как модель будет справляться с пиковыми нагрузками — например, во время приемной кампании после ЕГЭ или в дни открытых дверей. Лучше продумать как можно больше на этапе разработки, чем потом переписывать и рефакторить большую часть проекта.
Второй совет: не оставлять большой техдолг. Даже если кажется, что какие-то задачи проще отложить на потом, они накопятся, как снежный ком. Из этого вытекает следующий пункт.
Третий совет: организовать грамотный менеджмент проекта. Мы делали проект командой студентов и преподавателей: у всех разная занятость и разный опыт. Обязательно должен быть какой-то трекер и человек, который следит за процессами, но не «душит» людей контролем.
Четвертый совет: пробовать новое и одновременно — присматриваться к существующим решениям. Не стоит изобретать велосипед там, где есть проверенные инструменты и подходы. Но и ограничиваться только ими не стоит, особенно если специфика проекта требует нестандартных решений. Важно анализировать опыт других — опубликованные решения, кейсы и статьи, — оценивать их применимость к вашей задаче, создавать адаптации или новые компоненты там, где это дает преимущество. Вот как это работало в проекте чат-бота НГУ:
1. Опора на существующее (Retrieval Augmented Generation — RAG). Мы не разрабатывали базовый механизм RAG с нуля, а взяли за основу хорошо зарекомендовавшие себя принципы и фреймворки, активно развивающиеся в сообществе. Это дало нам надежную стартовую платформу и позволило не тратить время на уже решенные задачи.
2. Улучшение готового (Reranker). Мы адаптировали и внедрили reranker — дополнительную модель, которая повысила точность подбора релевантных фрагментов из базы знаний.
3. Создание нового под свои нужды (кастомные адаптации и разработки). Стандартные подходы RAG не всегда идеально ложились на нашу специфическую базу знаний и сценарии использования. Поэтому мы пошли дальше и внедрили:
GraphRAG для графа знаний: адаптировали концепцию GraphRAG от исследователей из Microsoft под структуру данных НГУ — так мы превратили нашу базу в граф знаний. Это позволило модели лучше понимать связи между сущностями (факультеты, преподаватели, курсы, правила) и давать более контекстно-точные ответы.
Фреймворк RAGU: для эффективной работы с этим графом знаний и реализации наших идей потребовались оптимизации. Так родился наш собственный фреймворк RAGU (RAG Utilities), включающий уникальные наработки для обработки запросов и данных в контексте графа.
Авторские решения для обработки текста и диалога: «умный чанкер» и «переписыватель вопросов». Вместо того, чтобы разбивать текст по символам, мы использовали smart_chunker — он делит информацию на смысловые части (чанки), что критически важно для качества поиска в RAG. А чтобы механизм поиска правильно понимал реплики пользователя в контексте (что значит «он» в следующем вопросе, или что в конкретном диалоге «ИТ» — это «Институт теплофизики», а не «информационные технологии»), мы внедрили компонент для разрешения местоименной анафоры и контекстуальной расшифровки аббревиатур. Это значительно улучшило плавность диалога.
Таким образом, стратегия «пробовать новое + использовать существующее» позволила не утонуть в разработке всего с нуля, взять лучшее из доступного и создать мощные уникальные компоненты конкретно под наши задачи.
Мы презентовали бота на AINL-2025 [32] — восточноевропейской конференции по искусственному интеллекту и обработке языков. А еще — в формате научной статьи представили наработки нашей команды в области обработки модальностей, отличных от текста. Само решение доступно в тестовом режиме, если абитуриенты есть среди читателей — заходите поспрашивать чат-бота [33].
Сейчас мы также разрабатываем искусственного семинариста — он будет помогать студентам по разным предметам, отвечать на вопросы по точечным и узкоспециализированным темам. Еще НГУ интересует мультимодальная модерация и копирайтинг данных.
Еще мы дополнительно исследуем способ превращения неструктурированной базы данных в БД с иерархией, с графами, где расположение данных будет иметь древовидную структуру. Это сделает поиск более быстрым и оптимальным. Когда закончим с этим, библиотеку выложим в открытый доступ.
Также планируем взаимодействие с другими университетами и организациями, которым будем поставлять наше решение.
А как считаете вы — полезен ли для вуза такой чат-бот? Хотели бы внедрить аналогичное решение у себя?
Автор: rmndrnts
Источник [34]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/17332
URLs in this post:
[1] @bond005: https://habr.com/ru/users/bond005/
[2] лаборатории прикладных цифровых технологий: https://mca.nsu.ru/labadt/
[3] опытом: http://www.braintools.ru/article/6952
[4] Как в НГУ появилась идея создать своего умного чат-бота: #%D0%9D%D0%93%D0%A31
[5] Задачи, которые предстояло выполнять чат-боту: #%D0%9D%D0%93%D0%A32
[6] Архитектура чат-бота: #%D0%9D%D0%93%D0%A33
[7] Параметры и конфигурация ВМ, на которой разместили чат-бота НГУ: #%D0%9D%D0%93%D0%A34
[8] Как запустить подобного чат-бота с LLM в Telegram: #%D0%9D%D0%93%D0%A35
[9] Советы для тех, кто тоже хочет развернуть собственный чат-бот с LLM: #%D0%9D%D0%93%D0%A36
[10] Наши планы: #%D0%9D%D0%93%D0%A37
[11] интеллекта: http://www.braintools.ru/article/7605
[12] по программе «Приоритет 2030»: https://priority2030.ru/
[13] обучения: http://www.braintools.ru/article/5125
[14] Meno-Tiny: https://huggingface.co/bond005/meno-tiny-0.1
[15] в бенчмарке МЕРА: https://mera.a-ai.ru/ru
[16] Cloud.ru Evolution: https://cloud.ru/evolution?utm_source=habr&utm_medium=article&utm_campaign=case_ngu_16072025
[17] Evolution Container Apps: https://cloud.ru/products/evolution-container-apps?utm_source=habr&utm_medium=article&utm_campaign=case_ngu_16072025
[18] Подготовьте среду: https://cloud.ru/docs/labs/services/topics/container-apps__berfore-work
[19] в GitVerse: https://gitverse.ru/home/
[20] https://gitverse.ru/cloudru/evo-containerapp-telegrambot-webhook-python-sample: https://gitverse.ru/cloudru/evo-containerapp-telegrambot-webhook-python-sample
[21] BotFather: https://t.me/BotFather
[22] лабораторной работы: https://cloud.ru/docs/labs/services/topics/container-apps__lab1__deploy-frontend-app?utm_source=habr&utm_medium=article&utm_campaign=case_ngu_16072025
[23] https://gitverse.ru/cloudru/evo-containerapp-telegrambot-foundation-models-sample.git#master: https://gitverse.ru/cloudru/evo-containerapp-telegrambot-foundation-models-sample.git#master
[24] https://cloud.ru/docs/marketplace/ug/services/ai-playground/api-ref__project-id: https://cloud.ru/docs/marketplace/ug/services/ai-playground/api-ref__project-id
[25] https://cloud.ru/docs/marketplace/ug/services/ai-playground/overview__ai-playground.html: https://cloud.ru/docs/marketplace/ug/services/ai-playground/overview__ai-playground.html
[26] https://cloud.ru/docs/console_api/ug/topics/guides__api_key#id2: https://cloud.ru/docs/console_api/ug/topics/guides__api_key#id2
[27] https://api.telegram.org/bot{BOT_TOKEN}/getWebhookInfo: https://api.telegram.org/bot%7BBOT_TOKEN%7D/getWebhookInfo
[28] https://api.telegram.org/bot{BOT_TOKEN}/deleteWebhook: https://api.telegram.org/bot%7BBOT_TOKEN%7D/deleteWebhook
[29] https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={PUBLIC_URL}/{BOT_TOKEN}: https://api.telegram.org/bot%7BBOT_TOKEN%7D/setWebhook?url=%7BPUBLIC_URL%7D/%7BBOT_TOKEN%7D
[30] AI-помощник Клаудия: https://cloud.ru/ai-assistant?utm_source=habr&utm_medium=article&utm_campaign=case_ngu_16072025
[31] внимание: http://www.braintools.ru/article/7595
[32] AINL-2025: https://ainlconf.ru/
[33] поспрашивать чат-бота: http://t.me/meno_nsu_bot
[34] Источник: https://habr.com/ru/companies/cloud_ru/articles/928132/?utm_source=habrahabr&utm_medium=rss&utm_campaign=928132
Нажмите здесь для печати.