21 октября 2026 г. · Анатолий Крылов, редактор Тераферма
Telegram-бот на своей нейросети: OpenAI-совместимый API и LLM на арендованной GPU
Telegram-бот на своей нейросети собирается за час: на арендованной RTX 4090 запускаете vLLM с моделью Qwen3 8B, он отдаёт API в формате OpenAI, а бот на aiogram в 40 строк пересылает ему сообщения. Час работы стоит 48 ₽, месяц круглосуточно — 34 560 ₽. Открывать порт и покупать белый IP не нужно: бот и модель работают на одной машине.
Как это устроено
Схема из трёх частей, и все они живут на одном сервере:
- vLLM загружает модель в видеопамять и поднимает HTTP-сервер на порту 8000 с эндпоинтом
/v1/chat/completions, тем же, что у OpenAI. - Бот на Python с библиотекой aiogram забирает сообщения из Telegram методом long polling, то есть сам ходит на серверы Telegram. Входящие соединения ему не нужны.
- Клиент OpenAI внутри бота отправляет запросы не в api.openai.com, а на
http://localhost:8000/v1.
Плюс такой схемы в том, что код бота не зависит от модели. Сегодня у вас Qwen3 8B, завтра Llama 70B на другой карте, и меняется одна строка с названием модели. И если когда-нибудь захотите вернуться к облачному API, код тоже почти не поменяется.
Какую модель и карту выбрать
Для бота важны три вещи: качество ответов на русском, скорость и сколько диалогов помещается одновременно.
| Модель | Память под веса | Карта | Цена, ₽/час | Для чего |
|---|---|---|---|---|
| Qwen3 8B (BF16) | ~16 ГБ | RTX 4090, 24 ГБ | 48 | Ассистент, FAQ, черновики ответов |
| Qwen3 8B (AWQ, 4 бита) | ~6 ГБ | RTX 3090, 24 ГБ | 26 | То же дешевле, больше памяти под диалоги |
| gpt-oss-20b | ~14 ГБ | RTX 4090 или RTX 5090 | 48 / 83 | Рассуждения, работа с инструкциями |
| Qwen3 32B (AWQ) | ~19 ГБ | RTX 5090, 32 ГБ | 83 | Сложные вопросы, меньше ошибок |
| Llama 3.3 70B (AWQ) | ~40 ГБ | RTX A6000, 48 ГБ | 66 | Максимум знаний, 1–3 диалога одновременно |
Модель 70B на одной карте возможна, но с оговорками по контексту и числу одновременных диалогов, они разобраны в статье про RTX A6000 для LLM 70B.
Для начала берите Qwen3 8B на RTX 4090: модель хорошо говорит по-русски, работает быстро, и после загрузки весов остаётся 5–6 ГБ под кэш диалогов. Сравнение моделей для русского языка есть в статье Qwen, DeepSeek или Llama для русского.
Шаг 1. Арендуйте сервер и запустите vLLM
Арендуйте RTX 4090 в каталоге и подключитесь по SSH или через терминал Jupyter. В шаблоне с PyTorch установите vLLM:
pip install vllm
Запустите сервер модели в фоне, чтобы он не остановился при закрытии терминала:
nohup vllm serve Qwen/Qwen3-8B \
--max-model-len 8192 \
--gpu-memory-utilization 0.90 \
--port 8000 > vllm.log 2>&1 &
Первый запуск скачивает модель с Hugging Face — около 16 ГБ, это несколько минут. Когда в vllm.log появится строка о старте сервера, проверьте его:
curl http://localhost:8000/v1/models
--max-model-len 8192 ограничивает длину диалога и экономит память. Для бота поддержки этого хватает с запасом: 8 тысяч токенов — это примерно 20 страниц переписки. Подробнее о параметрах vLLM читайте на странице запуска vLLM.
Шаг 2. Создайте бота в Telegram
- Напишите @BotFather в Telegram, отправьте
/newbot, задайте имя и username. - BotFather пришлёт токен вида
123456:ABC.... Это пароль бота: не публикуйте его и не коммитьте в репозиторий. - На сервере сохраните токен в переменную окружения:
export BOT_TOKEN=....
Шаг 3. Код бота
Установите библиотеки:
pip install aiogram openai
Создайте файл bot.py:
import asyncio, os
from collections import defaultdict
from aiogram import Bot, Dispatcher, F
from aiogram.types import Message
from openai import AsyncOpenAI
llm = AsyncOpenAI(base_url="http://localhost:8000/v1", api_key="local")
bot = Bot(os.environ["BOT_TOKEN"])
dp = Dispatcher()
SYSTEM = "Ты вежливый помощник. Отвечай по-русски, коротко и по делу."
history = defaultdict(list) # user_id -> последние сообщения
@dp.message(F.text == "/start")
async def start(m: Message):
history[m.from_user.id].clear()
await m.answer("Привет! Задайте вопрос.")
@dp.message(F.text)
async def chat(m: Message):
h = history[m.from_user.id]
h.append({"role": "user", "content": m.text})
del h[:-10] # храним 10 последних реплик
r = await llm.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[{"role": "system", "content": SYSTEM}] + h,
max_tokens=600,
temperature=0.6,
extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
answer = r.choices[0].message.content
h.append({"role": "assistant", "content": answer})
await m.answer(answer[:4000])
asyncio.run(dp.start_polling(bot))
Ответ приходит целиком после генерации. Если хочется, чтобы текст появлялся по мере написания, включите stream=True и раз в секунду редактируйте сообщение через bot.edit_message_text, чаще Telegram не разрешает.
Запустите его тоже в фоне: nohup python bot.py > bot.log 2>&1 &. Напишите боту в Telegram, ответ придёт через 1–3 секунды.
Что здесь важно:
enable_thinking: Falseотключает у Qwen3 режим рассуждений. С ним ответы точнее на сложных вопросах, но длиннее и медленнее. Для бота поддержки обычно лучше без него.del h[:-10]ограничивает память диалога. Без этого история растёт, каждый запрос становится дороже, и рано или поздно диалог упрётся вmax-model-len.answer[:4000]: у Telegram лимит 4 096 символов на сообщение.- История в памяти процесса теряется при перезапуске бота. Для продакшена храните её в SQLite или Redis.
Если бот должен отвечать нескольким людям в группе, добавьте его в чат и выдайте права на чтение сообщений через @BotFather (команда /setprivacy). По умолчанию бот в группе видит только команды и ответы на свои сообщения, это защищает от случайной обработки всей переписки.
Шаг 4. Сделайте бота полезным
Голая модель отвечает на общие вопросы. Чтобы бот знал про ваш продукт, есть три пути, от простого к сложному.
- Системный промпт. Вставьте в
SYSTEMописание продукта, тарифы, частые вопросы и правила тона. До 2–3 тысяч токенов работает отлично и не требует ничего, кроме текста. - RAG — поиск по документам. Документы режутся на фрагменты, перед ответом бот ищет подходящие и вставляет в промпт. Это нужно, когда база знаний больше нескольких страниц.
- Дообучение LoRA. Модель учится на ваших диалогах и перенимает стиль и терминологию. Имеет смысл, когда накопились тысячи хороших ответов операторов.
Для большинства ботов хватает первого или второго пути.
Частые ошибки при запуске
vLLM не стартует с ошибкой нехватки памяти. Чаще всего он пытается выделить кэш под полный контекст модели, у Qwen3 это 32 тысячи токенов и больше. Уменьшите --max-model-len или --gpu-memory-utilization.
Бот отвечает с тегами <think>. Режим рассуждений не отключён. Проверьте параметр enable_thinking в extra_body или используйте модель без этого режима.
Ответы приходят через 20–30 секунд. Модель пишет слишком длинно. Снизьте max_tokens и добавьте в системный промпт «отвечай в 3–5 предложениях». Ещё одна причина — включённый режим рассуждений: модель сначала «думает» сотни токенов, а потом отвечает.
Бот перестал отвечать после выхода из SSH. Процесс был запущен без nohup или tmux и завершился вместе с сессией. Запускайте оба процесса в фоне и проверяйте логи командой tail -f bot.log.
Ответы на русском с ошибками или вставками на английском и китайском. Для маленьких моделей это бывает. Помогает явная инструкция в системном промпте, снижение temperature до 0,3–0,5 или переход на модель покрупнее.
Своя модель или облачный API
Свою LLM для бота выбирают по трём причинам: данные пользователей не уходят третьим лицам, нет счёта за каждый токен и можно дообучить модель под себя. Минусы тоже понятные: сервер нужно поддерживать, а маленькая модель уступает крупным облачным в сложных вопросах.
Грубое правило по деньгам: если бот обрабатывает десятки сообщений в день, облачный API почти всегда дешевле — вы платите за токены, а не за часы простоя карты. Если сообщений тысячи в день или бот должен работать с закрытыми данными, своя модель на арендованной карте выигрывает: стоимость часа одинакова при 10 и при 1 000 сообщениях.
Сколько пользователей выдержит одна карта
vLLM обрабатывает много запросов одновременно, объединяя их в батчи. Поэтому одна RTX 4090 с моделью 8B обслуживает не одного человека, а десятки.
Оценка для Qwen3 8B в BF16 на RTX 4090:
- скорость одного ответа — около 45–55 токенов в секунду;
- ответ в 300 токенов приходит за 6–7 секунд;
- одновременно в кэше помещается 10–20 диалогов по 2–4 тысячи токенов.
Если пользователь пишет в среднем раз в минуту, а 10% пользователей активны одновременно, одна карта держит несколько сотен активных пользователей в день. Подробный расчёт с формулами есть в статье сколько GPU нужно на 1 000 пользователей.
Сколько стоит бот на своей LLM
Оплата поминутная, поэтому цена зависит от того, сколько часов в сутки бот онлайн.
| Режим | Часов в месяц | RTX 3090 | RTX 4090 |
|---|---|---|---|
| Тест и отладка | 5 | 130 ₽ | 240 ₽ |
| Рабочее время, 10 ч × 22 дня | 220 | 5 720 ₽ | 10 560 ₽ |
| Круглосуточно | 720 | 18 720 ₽ | 34 560 ₽ |
Формула для своего случая: стоимость = часы онлайн × цена часа карты. От числа сообщений цена не зависит, пока карта справляется с нагрузкой. Это главное отличие от облачных API, где каждый токен оплачивается отдельно: при большом потоке сообщений своя модель выходит дешевле, при редких — наоборот.
Пополнить баланс можно от 500 ₽ криптовалютой (USDT, BTC и другие монеты), оплата картой РФ и счёт для юрлиц — скоро.
Что учесть перед запуском в работу
- Диск удаляется при остановке сервера. Держите код бота в Git-репозитории, а модель после перезапуска скачается заново за несколько минут. Историю диалогов храните во внешней базе, если она важна.
- Автозапуск. Если машина перезагрузится, процессы vLLM и бота нужно поднять снова. Соберите оба запуска в один скрипт
start.sh. - Управление сервером — через кабинет. Публичного API для запуска и остановки серверов у Терафермы пока нет, поэтому расписание «включать в 9, выключать в 19» делается вручную.
- Ограничение доступа. Если бот для своих, проверяйте
m.from_user.idпо списку разрешённых пользователей. Иначе им сможет пользоваться любой, кто найдёт username. - Длина ответа.
max_tokensзащищает от бесконечных ответов, которые занимают карту и раздражают пользователя. - Логи. Сохраняйте вопросы и ответы: по ним видно, где бот ошибается и что дописать в системный промпт.
Как проверить качество до запуска
Соберите 30–50 реальных вопросов ваших пользователей: из почты, чата поддержки, комментариев. Прогоните их через бота и оцените ответы сами: правильно, частично, неверно. Если неверных больше 10–15%, сначала доработайте системный промпт или подключите поиск по документам, а потом уже открывайте бота людям. Такая проверка занимает час аренды и экономит репутацию.
Когда качество устраивает, запустите бота сначала для небольшой группы (коллег или постоянных клиентов) и неделю собирайте обратную связь. Это дешёвый способ найти вопросы, которых не было в тестовом наборе, и понять, какая нагрузка придёт на карту в реальности.
Свой Telegram-бот на открытой LLM — это vLLM с OpenAI-совместимым API, 40 строк на aiogram и одна видеокарта на 24 ГБ. Входящие порты не нужны, переписка остаётся на вашем сервере, а цена зависит от часов работы, а не от числа сообщений. Для старта хватит Qwen3 8B на RTX 4090.
Арендуйте сервер для нейросети на пару часов, запустите vLLM и проверьте бота на своих вопросах, прежде чем держать его онлайн круглосуточно.