Как я написал Telegram-бота с помощью ИИ, получил 130+ пользователей и узнал, почему нейросети не волшебная таблетка

Как я написал Telegram-бота с помощью ИИ, получил 130+ пользователей и узнал, почему нейросети не волшебная таблетка
Я продакт, который не умеет программировать, но решил сделать Telegram-бота для дисциплины. Весь код писал с помощью нейросетей. За два месяца получилось 5 тысяч строк, 130 пользователей и куча интересных наблюдений - не только про разработку, но и про то, как люди на самом деле пытаются быть дисциплинированными и почему большинство трекеров привычек не работают. В статье честный опыт без прикрас: что получилось, что пошло не так, какие баги довели до нехилого раздражения и как ИИ помогал (и мешал).

О чём этот бот и зачем он нужен

Я много лет работаю продактом и давно заметил одну вещь: люди (и я в том числе) постоянно срывают маленькие, но важные цели. Зарядка по утрам, чтение, пет-проект, ранний подъём. Вроде хочешь, а через неделю бросаешь.

Проблема не в отсутствии мотивации. Проблема в том, что:

  1. Один пропуск обесценивает всё. Держишь серию 14 дней, потом срыв — и кажется, что всё насмарку. Проще удалить приложение, чем видеть ноль.

  2. Слишком сложно. Большинство трекеров привычек перегружены: кучи настроек, графиков, категорий. На входе — порог, а не помощь.

  3. Давление. Многие приложения кричат «ты должен», «не сдавайся». Это работает, пока есть силы. Когда сил нет — вызывает отвращение.

Я подумал: а можно сделать проще? Чтобы система не добивала, когда ошибся, а мягко напоминала и позволяла вернуться без чувства вины.

Так появился Консильери — Telegram-бот для дисциплины.

Как он работает (JTBD)

Бот решает одну конкретную задачу: помочь человеку не бросать начатое, делая маленькие шаги без давления.

Сценарий простой:

  • Пользователь выбирает один фокус на день (например, «10 минут зарядки» или «1 страница книги»).

  • Утром бот присылает напоминание.

  • Вечером спрашивает: «Как прошло?» и предлагает три варианта: ✅ сделано, 🌓 частично, 😕 не сделано.

  • Ведёт статистику, считает серию, даёт награды за достижения.

Главное отличие от других трекеров: здесь нет наказания за пропуск. Если сорвался — бот говорит: «бывает, завтра новый день». Серия обнуляется, но ты не чувствуешь себя лузером. Можно начать заново.

Потом, из общения с пользователями, добавились фичи, которые закрывают конкретные боли:

  • Дни отдыха. Жизнь случается: праздники, болезни, просто усталость. Можно взять паузу, не ломая серию. За 30 дней подряд открывается третий день отдыха в месяц.

  • Частичное выполнение. Если сделал не всё, но что-то — это засчитывается в серию. Мозг не видит «провал», а видит «прогресс».

  • Челленджи. Для тех, кому скучно — 14, 21 или 30 дней без пропусков с наградами.

  • Тотемные животные. По статистике бот определяет твой «дух»: черепаха, волк, лев, орёл. Оказалось, люди любят смотреть на себя через такие метафоры.

Сейчас ботом пользуются больше 130 человек. 15-25 активных чекинов в день. Цифры скромные, но для меня это живой эксперимент: я вижу, как люди реально используют продукт, что им помогает, а что нет.

Как ИИ помогал (и мешал)

Основной инструмент — Perplexity, иногда Claude. Работа строится так: я формулирую задачу, получаю код, тестирую, правлю, снова тестирую.

Сначала казалось, что это просто: «нейросеть всё напишет». На практике вышло иначе. MVP ии пишет норм, а когда заходит речь о продукте с нагрузкой и пользователями — нужно еще проделать 80% дополнительной работы.

Что работало хорошо:

  • Рутинные вещи: функции для работы с БД, простые хендлеры, миграции — ИИ делает быстро и без ошибок.

  • Рефакторинг: когда нужно переписать кусок кода под новые требования, нейросеть неплохо справляется.

  • Поиск багов: иногда проще скормить лог ошибки и попросить объяснить, чем самому гуглить.

Что было сложно:

  • Длинные диалоги. Perplexity начинает тупить, теряет контекст, приходится переоткрывать треды. В итоге сформировал большой файл со всеми вводными, правилами и контекстом и скармливаю. когда открываю новый тред.

  • Нейросети любят выдумывать функции, которых нет. Пару раз пытался запустить код, а он падал, потому что ИИ использовал несуществующий метод.

  • Архитектурные решения. Когда дело дошло до FSM с несколькими состояниями, нейросеть путалась в последовательности. Пришлось самому рисовать схему и уже по ней править код.

  • Главная проблема, которую я порешал жестким «не пытайся мне угодить, отвечай честно и объективно» — его дурацкие реплики как я классно придумал и бросание во все тяжкие, что бы я не выдумал.

И главный лайфхак, до которого сам дошел: после того, как все сделано, ии все проверил, тесты прошли (ии любит все «мОкать», все с виду в целом хорошо — нужно закинуть полностью весь код в другую ИИ для проверки, совсем без контекста — тут вываливается, как правило, кучу сюрпризов)

Конкретный пример: баг с вечерними уведомлениями

После одного из обновлений бот начал отправлять вечерние сообщения каждую минуту. Пользователи молчали (или не замечали), но в логах был ад. Оказалось, я забыл обновлять поле last_checkin_reminder_sent после отправки. ИИ эту ошибку не заметил, хотя код выглядел логично. Пришлось лезть в логи самому и разбираться.

Потом добавил тест, который проверяет, что после отправки поле обновляется. Больше эта ошибка не возвращалась.

Ещё один случай: feature flags

Реферальная система открывает доступ к фичам после трёх приглашённых друзей. Изначально я использовал один ключ message_style и для флага доступа, и для хранения текущего стиля. При смене стиля доступ пропадал. ИИ предложил разделить на styles_unlocked и current_style. Сработало.

Сейчас в БД у пользователей JSON-поле с фичами. Для 130 человек — норм, для 1000 — возможно, придётся переделывать. Посмотрим.

Что с тестами

Когда кода стало много, перестал понимать, что ломается. Постепенно написал 90 автотестов. Не идеально, но базовые сценарии покрывают.

Пример из тестов

 async def test_challenge_done_victory(monkeypatch):
    challenge_data = {'level': 'easy', 'current_day': 13, 'partial_used': 0}
    async def mock_get_active(*args): return challenge_data
    monkeypatch.setattr('bot.get_active_challenge', mock_get_active)
    # ...
    ended, msg = await process_challenge_checkin(123, "done")
    assert ended is True
 

Проверяем, что при выполнении всех условий вызов завершается с победой. Без такого теста баги в логике челленджей могли жить долго.

Цифры на сегодня

Пользователей: 130+ (кто хоть раз заходил)
Активных в день: 15-20
DAU: около 15%
Конверсия онбординга: 95%
Adoption фактов: 70% включили

Retention после 7 дней падает — это главная проблема. Сейчас думаю, как мягко возвращать людей без спама. Streak freeze, напоминания через день, может быть, что-то ещё.

Что дальше

Планы на ближайшие месяцы:

  • миграция с SQLite на PostgreSQL (чтобы не думать о масштабировании)

  • веб-панель со статистикой (чтобы можно было смотреть прогресс не только в телефоне)

  • английская локализация (попробовать зайти на Reddit)

Но главное — слушать пользователей. В боте есть /feedback, каждое сообщение приходит мне. Из таких фидбеков родились дни отдыха, челленджи, тотемные животные. Без обратной связи продукт мёртв.

Если интересно

Бот живёт тут: @focuscompanion_bot
Про разработку и метрики пишу в канале: @discipline_bot_consigliere

Буду рад любой обратной связи — идеям, критике, баг-репортам. Это реально помогает.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Скопировано