Как создать Telegram-бота на базе GPT
Пошаговая инструкция по созданию Telegram-бота с GPT на Python. От регистрации бота до деплоя.
Telegram-боты на базе языковых моделей стали одним из самых популярных способов внедрить ИИ в повседневные рабочие процессы. По данным Telegram, к началу 2026 года на платформе работают более 10 миллионов ботов, и значительная часть новых проектов использует GPT или аналогичные модели. Разберём, как собрать такого бота с нуля на Python — от регистрации до запуска на сервере.
Что понадобится для старта
Для создания бота потребуются три компонента: аккаунт в Telegram, API-ключ OpenAI (или другого провайдера LLM) и сервер для хостинга. Python выбран как основной язык — экосистема библиотек для работы с Telegram и LLM здесь наиболее развита.
Минимальные требования к серверу скромные: 512 МБ оперативной памяти и один виртуальный процессор достаточно для бота с нагрузкой до нескольких тысяч сообщений в час. Подойдёт VPS за 300–500 рублей в месяц.
Шаг 1: Регистрация бота в Telegram
Откройте @BotFather в Telegram и отправьте команду /newbot. BotFather попросит указать имя бота (отображаемое в чатах) и юзернейм (уникальный, заканчивается на «bot»). После регистрации вы получите токен — строку вида 7012345678:AAF1.... Этот токен даёт полный доступ к управлению ботом, поэтому хранить его нужно в переменных окружения, а не в коде.
Полезные команды BotFather для настройки: /setdescription — описание бота, /setcommands — меню команд, /setuserpic — аватарка.
Шаг 2: Настройка окружения Python
Создайте виртуальное окружение и установите зависимости:
python3 -m venv venv
source venv/bin/activate
pip install python-telegram-bot openai python-dotenvБиблиотека python-telegram-bot (версия 21+) поддерживает асинхронную работу из коробки. openai — официальный SDK для работы с API OpenAI. Файл .env хранит секреты:
TELEGRAM_TOKEN=7012345678:AAF1...
OPENAI_API_KEY=sk-proj-...Шаг 3: Базовый код бота
Минимальный бот, который отвечает на сообщения через GPT:
import os
from dotenv import load_dotenv
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes
from openai import AsyncOpenAI
load_dotenv()
client = AsyncOpenAI(api_key=os.getenv("OPENAI_API_KEY"))
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_text = update.message.text
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": user_text}],
max_tokens=1024
)
await update.message.reply_text(response.choices[0].message.content)
app = ApplicationBuilder().token(os.getenv("TELEGRAM_TOKEN")).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()Этот код уже работает: бот получает текстовое сообщение, отправляет его в GPT-4o и возвращает ответ. Но для продакшена нужно добавить несколько вещей.
Шаг 4: Контекст разговора и системный промпт
GPT не помнит предыдущие сообщения между запросами. Чтобы бот вёл связный диалог, нужно хранить историю и передавать её при каждом запросе. Подробнее о том, как работают промпты, читайте в нашем гайде по промпт-инжинирингу.
from collections import defaultdict
conversation_history = defaultdict(list)
SYSTEM_PROMPT = """Ты — полезный ассистент. Отвечай кратко и по делу.
Если не знаешь ответа — скажи об этом прямо."""
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.effective_chat.id
user_text = update.message.text
# Добавляем сообщение пользователя
conversation_history[chat_id].append({"role": "user", "content": user_text})
# Ограничиваем историю последними 20 сообщениями
history = conversation_history[chat_id][-20:]
messages = [{"role": "system", "content": SYSTEM_PROMPT}] + history
response = await client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=1024
)
reply = response.choices[0].message.content
conversation_history[chat_id].append({"role": "assistant", "content": reply})
await update.message.reply_text(reply)Ограничение в 20 сообщений предотвращает превышение контекстного окна модели и контролирует расходы на API. Для большинства задач этого достаточно.
Шаг 5: Обработка ошибок и ограничения
В продакшене бот должен корректно обрабатывать три типа ошибок: сетевые сбои, превышение лимитов API и некорректный ввод пользователя.
import logging
from openai import RateLimitError, APIError
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
try:
# ... основная логика ...
pass
except RateLimitError:
await update.message.reply_text("Слишком много запросов. Подождите минуту.")
except APIError as e:
logger.error(f"OpenAI API error: {e}")
await update.message.reply_text("Сервис временно недоступен.")
except Exception as e:
logger.error(f"Unexpected error: {e}")
await update.message.reply_text("Произошла ошибка. Попробуйте позже.")Стоит добавить ограничение частоты запросов — например, не более 10 сообщений в минуту от одного пользователя. Это защитит и от злоупотреблений, и от случайного исчерпания бюджета API.
Шаг 6: Деплой на сервер
Самый надёжный способ запуска — systemd-юнит на VPS. Создайте файл /etc/systemd/system/gpt-bot.service:
[Unit]
Description=GPT Telegram Bot
After=network.target
[Service]
Type=simple
User=botuser
WorkingDirectory=/opt/gpt-bot
ExecStart=/opt/gpt-bot/venv/bin/python bot.py
Restart=always
RestartSec=10
EnvironmentFile=/opt/gpt-bot/.env
[Install]
WantedBy=multi-user.targetЗапуск: sudo systemctl enable --now gpt-bot. Бот автоматически перезапустится при сбоях и после перезагрузки сервера.
Альтернатива — Docker-контейнер, что упрощает воспроизводимость окружения. Но для простого бота systemd проще и достаточно.
Контроль расходов
Стоимость API зависит от модели и объёма использования. GPT-4o обрабатывает запрос среднего размера (500 токенов вход + 500 выход) примерно за $0.005. При 1000 сообщений в день это около $5 в месяц. Модель GPT-4o mini обойдётся в 10–15 раз дешевле, но и качество ответов будет ниже.
Установите лимит расходов в панели OpenAI — это обязательная мера безопасности. Подробнее о выборе модели под конкретную задачу — в нашем руководстве по выбору языковых моделей.
Что дальше
Базовый бот готов. Следующие шаги для развития: добавить обработку голосовых сообщений через Whisper, подключить базу знаний компании через RAG, реализовать генерацию изображений по запросу. Каждый из этих модулей добавляется независимо от основной логики и расширяет возможности бота без переписывания существующего кода.
Архитектура Telegram-бота на LLM
Современный Telegram-бот с ИИ состоит из: Telegram Bot API (webhooks/polling), обработчик сообщений, контекстное хранилище (история диалога), LLM API. Для production добавляют: Rate limiting, база данных пользователей, аналитику, очередь задач.
Стек для быстрого старта
| Компонент | Вариант 1 (Python) | Вариант 2 (Node.js) |
|---|---|---|
| Telegram API | python-telegram-bot v20 | Grammy или Telegraf |
| LLM | openai, anthropic SDK | openai, @anthropic-ai/sdk |
| Хранение контекста | Redis / SQLite | Redis / MongoDB |
| Деплой | Docker + VPS | Docker + VPS / Vercel |
| Веб-фреймворк (webhook) | FastAPI / Flask | Express |
Минимальный рабочий бот на Python
from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes
from openai import AsyncOpenAI
openai_client = AsyncOpenAI(api_key='sk-...')
user_histories = {} # простое хранение в памяти
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
text = update.message.text
# Добавляем в историю
if user_id not in user_histories:
user_histories[user_id] = []
user_histories[user_id].append({'role': 'user', 'content': text})
# Вызов LLM
response = await openai_client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'system', 'content': 'Ты полезный ИИ-ассистент.'}]
+ user_histories[user_id][-10:] # последние 10 сообщений
)
reply = response.choices[0].message.content
user_histories[user_id].append({'role': 'assistant', 'content': reply})
await update.message.reply_text(reply)
app = Application.builder().token('BOT_TOKEN').build()
app.add_handler(MessageHandler(filters.TEXT, handle_message))
app.run_polling()Продвинутые возможности
RAG по документам: загрузка PDF → индексация в ChromaDB → при вопросе находим релевантные чанки → передаём как контекст в LLM. Бот отвечает только на основе загруженных документов.
Inline-кнопки: после ответа показывать кнопки «Подробнее», «Пример», «Следующая тема» для управления диалогом без ввода текста.
Streaming ответов: Telegram не поддерживает нативный стриминг, но можно обновлять сообщение каждые N токенов через editMessageText — создаёт эффект печатания.
Стоимость и масштабирование
Бот для 1 000 активных пользователей: GPT-4o-mini ~$10–20/мес (при ~100 сообщений/пользователь/мес). VPS на Hetzner (~€5/мес) + Redis (~$0) = полная инфраструктура за $15–25/мес. При росте до 100K пользователей: очередь задач (Celery/RQ), горизонтальное масштабирование воркеров.