Несколько недель назад мы с коллегой сделали ChatGPT-proxy бота в Telegram, который помогал в наших рабочих чатах и просто развлекал нас. Он написан на TypeScript и потрясающем фреймворке Grammy, использует Open AI API, а именно модель gpt3.5-turbo, которая используется в оригинальном ChatGPT.

UPD: Telegram разбанил нашего бота.

Немного о самом боте
Сам по себе бот является простым мостом между Telegram и ChatGPT, при этом он помнит предыдущие сообщения в чате, используя их в качестве контекста очередного вопроса. Кроме того, бот поддерживает групповые чаты. Причём у нас включен Privacy Mode в группах, так что бот видит только те сообщения, которые содержат команду /ask.

Мы добавили много дополнительного функционала, например, боту можно отправить ссылку на любой сайт/статью, или даже YouTube-видео и задать вопрос, на который бот ответит, добавив в контекст субтитры или контент сайта, который бот получает, рендеря его в Puppeteer. В обоих случаях приходится мириться с ограничением контекста в 4096 токенов в GPT-3.5. В качестве решения нашёлся npm-пакет ts-textrank, который позволил нам суммаризировать содержимое текста до нужной длины, теряя при этом минимум информации, насколько это возможно.



Также мы добавили возможность распознавания голоса через Google Cloud Speech API, но планируем перейти на более мощный Whisper от Open AI. Кстати, эту модель можно поднять хоть у себя дома на GPU, проект лежит на GitHub. Самый большой вариант этой модели, поддерживающий все языки, занимает ~10 GB видеопамяти.
Где распознавание голоса, там и синтезация. В 2023 году такие вещи делаются очень просто, достаточно установить соответствующий npm-пакет и вызвать 1 метод. Кстати, мы планируем генерировать русский голос через Yandex Speech Kit, который даёт гораздо более качественный результат, нежели Google Cloud Text To Speech API.
В итоге наш бот с точки зрения знаний всего и вся с большим отрывом заменил Siri, Алису от Яндекса и тому подобных современных голосовых помощников, и всё это в паре строчек кода, используя 3 npm пакета!
Наконец, в какой-то момент мы научили бота генерировать картинки по текстовому описанию через DALL·E. Единственная проблема состоит в том, что этот API поддерживает только английский язык. Не беда! У нас всегда есть GPT, который может принять инструкцию на русском и подробно проинструктировать своего собрата DALL·E на английском языке. Вообще, возможности применения GPT безграничные, боюсь представить что будет в будущем.

Много чего ещё было добавлено в процессе. Например, настройка креативности ответов бота, набор готовых инструкций, которые задают роль бота в чате (Copilot, интервьювер, генератор бизнес идей, гопник и куча других), можно даже самому написать такую инструкцию через команду /prompt.
Deploy в production
В какой-то момент мы поняли что наш бот разлетелся по чатам наших коллег и друзей, а также по их коллегам и друзьям. Мы решили попробовать монетизировать этот проект, и начали готовить всё к запуску:
-
Нарисовали и сверстали красивый лендинг
-
Подключили платёжные системы для рекуррентных платежей
-
Задеплоили всю инфраструктуру в Google Cloud, используя исключительно Cloud Functons, Cloud Pub/Sub, Cloud SQL и Cloud Redis
-
Настроили CI/CD через GitHub Actions
-
Подготовили бота к большой нагрузке, выполнив Deployment Checklist в документации Grammy. Очень важно использовать вебхуки вместо long-polling'a, настроить ratelimiter, чтобы нашего бота не заспамили, а также хранение сессий в Redis.
-
Настроили Sentry для отслеживания runtime ошибок.
-
Накидали дашборд в Grafana для мониторинга основных метрик — количество запросов к Open AI API, их status code, latency, и т.д.
-
Добавили английский язык
-
Реализовали несколько платных планов с разными ограничениями и функционалом
-
Добились повышения лимитов биллинга в Open AI до $3200 в месяц.
В целом, инфраструктура получилась очень отказоустойчивой, минималистичной, предсказуемой, масштабируемой и относительно дешёвой (на самом деле пока что Google Cloud для нас бесплатный, поскольку там всем аккаунтам дают $300 при регистрации.)
Реклама
В первые дни мы получили около 5000 пользователей, купив пару постов в Telegram-пабликах, а также настроив таргет в яндексе. Спрос на этого бота у людей огромный. Те, кто купил подписку, пользовались им буквально каждый день.
Через неделю мы купили рекламу в Telegram-паблике на 3.7 млн. подписчиков и ~800 тысяч просмотров постов. Это принесло нам ещё 22000 пользователей.
Фиаско
Спустя чуть больше суток, бот просто пропал, будто его никогда и не существовало. В BotFather он тоже исчез. На саппорт Telegram можно не расчитывать, так как у мессенджера его, как известно, просто не существует. Сейчас мы находимся в полном непонимании что нам делать дальше, как можно вообще развивать какие-то проекты в Telegram, если в какой-то момент твой бизнес может просто исчезнуть, без каких-либо предупреждений и объяснений.
Есть подозрения, что кто-то убедил нашего бота прислать такой ответ, на который можно легко пожаловаться. Проблема в том, что мы не можем наложить никаких ограничений на ответы бота, поскольку это чёрный ящик и в данный момент существует огромное множество jailbreak-ов для обхода встроенной цензуры ChatGPT. Да, есть Moderation API, но, к сожалению, оно поддерживает только английский язык.
Послесловие
Telegram разблокировал нашего бота, но подобная ситуация может случиться с каждым. Поэтому небольшая инструкция как быть, если ваш бот в Телеграме просто испарился.
1) Немедленно обратиться в официальную поддержку ботов @BotSupport подробно описав весь кейс
2) В Телеграме, через меню перейти в раздел «Ask a Question» (Задать вопрос) и продублировать туда всю доступную информацию.
3) Продублировать информацию в чат разработчиков ботов - @BotTalk
4) Если проблему не получилось решить в течении суток-двое: прийдется искать другие пути - вроде публичных постов на Хабре, VC.
Желаем удачи всем тем, кто столкнулся с подобной проблемой. Поддержка сообщила что «Произошла ошибка на стороне Телеграма, которую уже поправили, больше не должно повториться». Вероятно, это жалобы-репорты от конкурентов, другие причины тяжело себе представить.
Автор: Макаров Максим