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

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

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

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

4. Соберите образ и присвойте тег. Как создать реестр в сервисе Artifact Registry и получить ключи доступа, описано в шагах 3–5 лабораторной работы. Если реестр и ключи доступа уже есть, можно сразу переходить к сборке образа. Если нужно создать новые или их нет, пройдите шаги 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 --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.
Model_ID — ID модели, к которой будет обращаться бот https://cloud.ru/docs/marketplace/ug/services/ai-playground/overview__ai-playground.html
KEY_ID/SECRET_ID — Персональные ключи доступа https://cloud.ru/docs/console_api/ug/topics/guides__api_key#id2

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

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

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

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

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

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

Готово. Кстати, сейчас со всеми настройками и запуском ВМ помогает новый AI-помощник Клаудия. Жаль, что этой фичи еще не было, когда мы размещали своего бота.
Советы для тех, кто тоже хочет развернуть собственный чат-бот с LLM
Нюансов много: нужно подумать и об архитектуре проекта, и о том, как будет выстроена командная работа. Что можно порекомендовать исходя из нашего опыта?
Первый совет: продумать архитектуру бота, быть готовыми перенастроить ее в процессе. Надо уделить большое внимание тому, как в работу встроены базы данных, LLM и эмбеддеры, как они взаимодействуют, в одном или в разных контейнерах находятся модель и сам бот. Предусмотреть, как будут обновляться базы данных, какой контекст из них модель будет подтягивать для ответов.
Отдельно стоит подумать о масштабировании, как модель будет справляться с пиковыми нагрузками — например, во время приемной кампании после ЕГЭ или в дни открытых дверей. Лучше продумать как можно больше на этапе разработки, чем потом переписывать и рефакторить большую часть проекта.
Второй совет: не оставлять большой техдолг. Даже если кажется, что какие-то задачи проще отложить на потом, они накопятся, как снежный ком. Из этого вытекает следующий пункт.
Третий совет: организовать грамотный менеджмент проекта. Мы делали проект командой студентов и преподавателей: у всех разная занятость и разный опыт. Обязательно должен быть какой-то трекер и человек, который следит за процессами, но не «душит» людей контролем.
Четвертый совет: пробовать новое и одновременно — присматриваться к существующим решениям. Не стоит изобретать велосипед там, где есть проверенные инструменты и подходы. Но и ограничиваться только ими не стоит, особенно если специфика проекта требует нестандартных решений. Важно анализировать опыт других — опубликованные решения, кейсы и статьи, — оценивать их применимость к вашей задаче, создавать адаптации или новые компоненты там, где это дает преимущество. Вот как это работало в проекте чат-бота НГУ:
1. Опора на существующее (Retrieval Augmented Generation — RAG). Мы не разрабатывали базовый механизм RAG с нуля, а взяли за основу хорошо зарекомендовавшие себя принципы и фреймворки, активно развивающиеся в сообществе. Это дало нам надежную стартовую платформу и позволило не тратить время на уже решенные задачи.
2. Улучшение готового (Reranker). Мы адаптировали и внедрили reranker — дополнительную модель, которая повысила точность подбора релевантных фрагментов из базы знаний.
3. Создание нового под свои нужды (кастомные адаптации и разработки). Стандартные подходы RAG не всегда идеально ложились на нашу специфическую базу знаний и сценарии использования. Поэтому мы пошли дальше и внедрили:
GraphRAG для графа знаний: адаптировали концепцию GraphRAG от исследователей из Microsoft под структуру данных НГУ — так мы превратили нашу базу в граф знаний. Это позволило модели лучше понимать связи между сущностями (факультеты, преподаватели, курсы, правила) и давать более контекстно-точные ответы.
Фреймворк RAGU: для эффективной работы с этим графом знаний и реализации наших идей потребовались оптимизации. Так родился наш собственный фреймворк RAGU (RAG Utilities), включающий уникальные наработки для обработки запросов и данных в контексте графа.
Авторские решения для обработки текста и диалога: «умный чанкер» и «переписыватель вопросов». Вместо того, чтобы разбивать текст по символам, мы использовали smart_chunker — он делит информацию на смысловые части (чанки), что критически важно для качества поиска в RAG. А чтобы механизм поиска правильно понимал реплики пользователя в контексте (что значит «он» в следующем вопросе, или что в конкретном диалоге «ИТ» — это «Институт теплофизики», а не «информационные технологии»), мы внедрили компонент для разрешения местоименной анафоры и контекстуальной расшифровки аббревиатур. Это значительно улучшило плавность диалога.
Таким образом, стратегия «пробовать новое + использовать существующее» позволила не утонуть в разработке всего с нуля, взять лучшее из доступного и создать мощные уникальные компоненты конкретно под наши задачи.
Итоги и наши планы
Мы презентовали бота на AINL-2025 — восточноевропейской конференции по искусственному интеллекту и обработке языков. А еще — в формате научной статьи представили наработки нашей команды в области обработки модальностей, отличных от текста. Само решение доступно в тестовом режиме, если абитуриенты есть среди читателей — заходите поспрашивать чат-бота.
Сейчас мы также разрабатываем искусственного семинариста — он будет помогать студентам по разным предметам, отвечать на вопросы по точечным и узкоспециализированным темам. Еще НГУ интересует мультимодальная модерация и копирайтинг данных.
Еще мы дополнительно исследуем способ превращения неструктурированной базы данных в БД с иерархией, с графами, где расположение данных будет иметь древовидную структуру. Это сделает поиск более быстрым и оптимальным. Когда закончим с этим, библиотеку выложим в открытый доступ.
Также планируем взаимодействие с другими университетами и организациями, которым будем поставлять наше решение.
А как считаете вы — полезен ли для вуза такой чат-бот? Хотели бы внедрить аналогичное решение у себя?