Я долго игнорировал тему личных ботов в Telegram. Казалось — зачем, если ChatGPT открывается в браузере за две секунды. Но однажды поймал себя на том, что за день переключился между вкладками раз тридцать, каждый раз заново объясняя контекст. Кто я, чем занимаюсь, в каком тоне отвечать. Раз тридцать.
После этого я потратил вечер на настройку собственного бота — и вот уже несколько месяцев он живёт у меня в телефоне как отдельный контакт. Расскажу, как это устроено и где я споткнулся.
Что вообще имеется в виду под "персональным ассистентом"
Прежде чем лезть в код — стоит определиться с тем, что ты строишь. "ИИ-бот в Telegram" — это очень широко.
Самый простой вариант: бот пробрасывает твои сообщения в GPT-4 и возвращает ответ. Поднимается за пару часов, но пользы примерно столько же, сколько от браузерной вкладки.
Интереснее — когда бот помнит контекст разговора, знает твои предпочтения и работает по заданным правилам. Я своего настроил так: он знает, что я пишу технические тексты на русском, не терпит водянистых ответов и всегда предлагает конкретный следующий шаг вместо общих рассуждений.
Есть и следующий уровень — когда бот умеет что-то делать: искать в интернете, сохранять заметки, дёргать внешние сервисы. Это уже агент. Туда я пока не полез — на первый раз хватило базового.
Технический минимум: что нужно для старта
Расскажу про то, что использовал сам, а не про абстрактный список вариантов.
Основа — Python-библиотека python-telegram-bot и API OpenAI. Хостинг — Railway: там деплоишь за пять минут без настройки сервера. Для хранения истории поначалу хватило обычного словаря в памяти, потом переехал на SQLite.
Токен для бота получить просто: находишь в Telegram аккаунт @BotFather, пишешь /newbot, придумываешь имя — и через две минуты токен у тебя.
Самая простая структура выглядит так:
import os
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# История диалога для каждого пользователя
conversation_history = {}
SYSTEM_PROMPT = """Ты — личный ассистент. Отвечай коротко и по делу.
Пиши на русском. Без воды и общих фраз."""
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
user_text = update.message.text
# Инициализация истории для нового пользователя
if user_id not in conversation_history:
conversation_history[user_id] = [
{"role": "system", "content": SYSTEM_PROMPT}
]
# Добавляем сообщение пользователя
conversation_history[user_id].append(
{"role": "user", "content": user_text}
)
# Запрос к OpenAI
response = client.chat.completions.create(
model="gpt-4o",
messages=conversation_history[user_id],
max_tokens=1000
)
assistant_reply = response.choices[0].message.content
# Сохраняем ответ в историю
conversation_history[user_id].append(
{"role": "assistant", "content": assistant_reply}
)
await update.message.reply_text(assistant_reply)
app = ApplicationBuilder().token(os.environ["TELEGRAM_TOKEN"]).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()
Это минимально рабочая версия. Дальше — надстройки.
Где я потратил время зря
Первая ошибка — сразу полез делать "умный" системный промпт. Написал огромный текст на полстраницы: кто я, что люблю, как думаю, какие задачи решаю. Бот стал отвечать... хуже. Слишком много инструкций конфликтовали между собой.
Откатился к короткому промпту на пять строк — стало лучше. Вывод простой: системный промпт — это не биография, а несколько чётких правил.
Вторая ошибка — история диалога без ограничений. Через несколько дней активного использования контекст раздулся настолько, что каждый запрос влетал в копеечку. Добавил обрезку: храню последние 20 сообщений плюс системный промпт. Этого хватает для связного разговора и не разоряет по токенам.
MAX_HISTORY = 20
def trim_history(history):
# Оставляем системный промпт + последние MAX_HISTORY сообщений
system_messages = [m for m in history if m["role"] == "system"]
other_messages = [m for m in history if m["role"] != "system"]
return system_messages + other_messages[-MAX_HISTORY:]
Третья ошибка — не добавил защиту от чужих. Бот был открыт всем, кто знал его имя. Спохватился быстро, добавил проверку по user_id:
ALLOWED_USERS = {ваш_telegram_id} # узнать можно через @userinfobot
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
if update.effective_user.id not in ALLOWED_USERS:
await update.message.reply_text("Нет доступа.")
return
# остальной код
Что реально изменилось в работе
Честно — я ожидал большего. Первые две недели пользовался активно, потом немного подзабыл, потом снова вернулся.
Дело вот в чём. Бот на телефоне удобнее браузера, когда нужно быстро что-то проверить или набросать. Печатаешь голосом — Telegram сам расшифровывает — получаешь ответ. Это работает хорошо и без лишних движений.
Ещё одна вещь, которую я не ожидал: когда бот настроен под твой контекст, не нужно каждый раз объяснять фон. Я написал в системном промпте пару строк о том, чем занимаюсь — и ответы сразу стали точнее, без лишних уточнений.
Чего не хватает — памяти между сессиями. Когда перезапускаю бота, история обнуляется. Это следующий шаг, который я пока не сделал: подключить нормальную базу данных и сохранять диалоги постоянно. Технически несложно, просто руки не дошли.
Что дальше
Базовый бот поднимается за вечер — это правда. Основная часть времени уходит не на код, а на формулировку системного промпта и понимание того, для чего именно ты его используешь.
Если ты технический человек и хочешь попробовать — старт простой: BotFather, токен, тридцать строк Python, Railway. Первая версия будет кривая, и это нормально. Моя тоже была.
На практике персональный бот полезен ровно настолько, насколько ты готов его настраивать под себя. Из коробки — просто ещё один интерфейс к GPT. Но если потратить время на промпт и заточить под свои задачи — получается что-то, что реально экономит голову.
