Как создать Telegram-бота на базе GPT

Пошаговая инструкция по созданию Telegram-бота с GPT на Python. От регистрации бота до деплоя.

Как создать Telegram-бота на базе GPT

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 APIpython-telegram-bot v20Grammy или Telegraf
LLMopenai, anthropic SDKopenai, @anthropic-ai/sdk
Хранение контекстаRedis / SQLiteRedis / MongoDB
ДеплойDocker + VPSDocker + VPS / Vercel
Веб-фреймворк (webhook)FastAPI / FlaskExpress

Минимальный рабочий бот на 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), горизонтальное масштабирование воркеров.