AI-компаньон, который помнит вас: как один диалог заставил переизобрести память бота

Кейс Telegram-сервиса эмоциональной поддержки на Claude: архитектура «живой памяти» вместо длины контекста, детектор кризиса с высшим приоритетом, персона с биографией и естественный онбординг без анкеты. 25 000 строк кода, ~3 000 пользователей, LTV/CAC 13,7x — solo, от идеи до питча.

Как я в одиночку собрал production-сервис эмоциональной поддержки на современной языковой модели, довёл его до ~3 000 пользователей при LTV/CAC 13,7x — и почему один странный диалог оказался важнее любой фичи.

Мира — образ AI-персоны: женщина, которая сама прошла через выгорание

Это кейс не про «болталку с нейросетью». Это про то, как решение обещать пользователю «я помню тебя» превращается в отдельную инженерную подсистему — и как один живой диалог показал, что её у меня, по сути, не было.

Попробовать вживую: бот @MiraDrug_bot · лендинг miradrug.ru (новая версия).

Аудио-обзор кейса

Разговорный подкаст по материалам проекта — послушайте, если удобнее слушать, чем читать.

Коротко о продукте

MIRA — Telegram-бот, AI-компаньон для женщин, переживающих выгорание. За ним не промпт в одну строку, а система: архитектура «живой памяти», анализ настроения по 12 эмоциям, детектор кризисных состояний с приоритетом над обычным флоу, извлечение профиля прямо из переписки и потоковые ответы в реальном времени.

Стек: Python 3.10 · python-telegram-bot v21 · Claude Sonnet 4.5 · SQLAlchemy 2.0 (async) · FastAPI · Redis · PostgreSQL · Google Cloud Storage · Docker · systemd.

Метрика Значение Ориентир по индустрии
Пользователей ~3 000  —
Сообщений на пользователя 178 ~30–50
Retention D7 42% 20–25%
NPS 68 30–40
Рост +35% в месяц  —
LTV/CAC 13,7x 3x — «здоровый»
Маржинальность 78%  —

Масштаб: 25 000+ строк кода, 100+ улучшений AI-слоя, 13 фаз роста — solo, от идеи и архитектуры до деплоя и питча инвесторам.


Проблема, ради которой всё затевалось

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

  • 💰 Дорого — от 5 000 ₽ за сеанс, а нужно 10+.
  • Долго — запись на 3–4 недели вперёд.
  • 🙈 Стыдно — стигма вокруг терапии никуда не делась.
  • 📍 Недоступно — дефицит специалистов в регионах.

Знакомое состояние: усталость, серый город, «просто дойти до дома»

Идея была не в том, чтобы заменить психотерапевта. А в том, чтобы закрыть разрыв между «мне плохо прямо сейчас» и «приём через месяц». Компаньон, доступный 24/7 за цену в разы ниже живого сеанса — который помнит вас и умеет вовремя распознать, что человеку по‑настоящему плохо.

Бизнес-кейс проекта одним экраном


Ключевое решение: персона, а не ассистент

Первое, что определило продукт, — отказ от абстрактного ассистента в пользу персоны с биографией. Мира — женщина за сорок, замужем много лет, двое детей, сама прошла через выгорание. Это не косметика: биография зашита в системный промпт и задаёт тон — эмпатичный, без осуждения, с практичными советами вместо шаблонного «я тебя слышу».

Официальный аватар бота — так Миру видят пользователи

Персона задаёт и границы. Мира не ставит диагнозы и не назначает лечение — за это отвечает отдельный фильтр, а при маркерах кризиса разговор переключается в протокол помощи. Забегая вперёд: одна и та же модель с характером «Миры» и без него — это два разных продукта. 178 сообщений на пользователя — цифра как раз про характер, а не про модель.


Диалог, который изменил проект

На четвёртый день жизни бота пришёл человек и в первом же разговоре раскрылся так, как редко раскрываются даже живому специалисту. Разговор прошёл бережно и правильно — с уточняющими вопросами, без осуждения.

А на следующий день он вернулся — и бот встретил его как незнакомца. Ни имени, ни темы, ни того, к чему они вчера пришли. Каждый новый диалог начинался с чистого листа.

Для чат‑помощника это терпимо. Для сервиса, который обещает «я помню тебя», — это провал в самой сути продукта. Я сформулировал проблему так: дело не в плохой памяти, а в том, что система не знала, что она забывает. Не было мета‑осознания. Именно этот случай стал катализатором главной инженерной работы проекта — архитектуры «живой памяти».

Архитектура «живой памяти»: от инструмента с амнезией — к системе, которая перерабатывает опыт


Что происходит за одним сообщением

Самое интересное — не «отправить текст в модель», а конвейер вокруг него. Каждое входящее сообщение проходит цепочку детекторов и сборщиков контекста и только потом попадает в LLM.

Схема «Ввод → движок → мозг-оркестратор → вывод»: визуализация конвейера обработки

flowchart TD
    U[Пользователь<br/>текст / голос] --> TG[Telegram Bot API]
    TG --> SAN[Санитайзер<br/>XSS / SQLi / длина]
    SAN --> RL{Rate limit<br/>Redis}
    RL -- превышен --> LIM[Ответ-заглушка<br/>апселл Premium]
    RL -- ок --> VOICE{Голос?}
    VOICE -- да --> WSP[Whisper<br/>речь → текст]
    VOICE -- нет --> CRISIS
    WSP --> CRISIS{Детектор кризиса}
    CRISIS -- маркер паники/суицида --> PROTO[Протокол помощи<br/>хелплайн, приоритет]
    CRISIS -- норма --> CTX[Сборщик контекста]

    subgraph AI[AI-слой]
        CTX --> MEM[(Живая память<br/>эпизоды / эмоции /<br/>отношения / эволюция)]
        CTX --> SYS[Системный промпт<br/>персона «Мира»]
        MEM --> LLM[Языковая модель<br/>стриминг]
        SYS --> LLM
    end

    LLM --> STREAM[Стриминг в Telegram<br/>обновление сообщения]
    STREAM --> POST[Пост-обработка]
    POST --> MOOD[Анализ настроения<br/>12 эмоций]
    POST --> PROF[Извлечение профиля<br/>парсинг фактов]
    POST --> COST[Учёт стоимости API]
    MOOD --> DB[(PostgreSQL)]
    PROF --> DB
    COST --> DB

Принципы, которые нельзя ломать:

  • Детекция кризиса — высший приоритет. Нашёлся маркер — обычный флоу прерывается, человек получает хелплайн. Это важнее любой «красоты» ответа.
  • Анализ настроения не блокирует ответ. Настроение считается после генерации или параллельно, чтобы не тормозить стриминг.
  • Весь ввод‑вывод асинхронный. База, Telegram API, стриминг модели — никаких блокирующих вызовов, только asyncio.
  • Мягкая деградация. Упал внешний API — бот отвечает заготовкой и пишет в лог, а не падает.

Слои системы

graph TB
    subgraph Clients[Клиенты]
        BOT[Telegram-бот]
        MINI[Telegram Mini App]
        ADMIN[Админ-панель]
    end

    subgraph App[Приложение]
        HANDLERS[Хендлеры]
        AISVC[AI-сервисы]
        SVC[Сервисы<br/>оплата, рефералы,<br/>хранилище, планировщик]
        API[FastAPI<br/>webapp + admin]
    end

    subgraph Data[Данные]
        REPO[Репозитории<br/>единая точка доступа к БД]
        PG[(PostgreSQL)]
        RD[(Redis<br/>лимиты, кэш)]
        GCS[(Cloud Storage<br/>фото / голос)]
    end

    BOT --> HANDLERS
    MINI --> API
    ADMIN --> API
    HANDLERS --> AISVC
    HANDLERS --> SVC
    HANDLERS --> REPO
    API --> REPO
    REPO --> PG
    SVC --> RD
    SVC --> GCS

Жёсткое правило проекта: доступ к данным только через репозитории. Ни одного SQL-запроса в хендлерах — даже простого SELECT. Это дало предсказуемость и позволило безболезненно эволюционировать схему через миграции.


«Живая память»: почему бот действительно помнит вас

После того случая я перестал думать о памяти как о «длине контекста». Дешёвый бот просто закидывает историю в окно и надеется на лучшее. Здесь память — отдельная подсистема, которая перерабатывает опыт, а не хранит логи. Четыре типа:

  • Эпизодическая — конкретные факты и события из жизни человека.
  • Эмоциональная — динамика настроения, триггеры, кризисы.
  • Отношений — история общения: как менялось доверие, стиль разговора.
  • Эволюционная — как сам бот адаптировался под конкретного человека.
flowchart LR
    MSG[Новое сообщение] --> PE[Извлечение профиля<br/>AI-парсинг фактов]
    PE --> FACTS{Что извлекли?}
    FACTS --> P1[Партнёр, дети,<br/>работа, хобби]
    FACTS --> P2[Попытки решения<br/>«я уже пробовала...»]
    FACTS --> P3[Триггеры<br/>чувствительные темы]
    FACTS --> P4[Эмоциональная<br/>память]
    P1 & P2 & P3 & P4 --> STORE[(профили<br/>+ таблицы памяти)]
    STORE --> CB[Сборщик контекста]
    CB --> LLM[Модель<br/>Free: 10 сообщений<br/>Premium: 20 + долгая память]

Несколько находок, которыми горжусь:

  • Память о попытках. Если человек сказал «я уже пробовала медитировать», бот не будет советовать медитацию снова. Мелочь — но именно из таких мелочей складывается ощущение «меня слышат».
  • Личные триггеры. Система помечает чувствительные темы и автоматически их обходит.
  • Детектор просьбы о поддержке. Фраза вроде «я же не плохая мать?» — это не вопрос, а просьба о поддержке, и отвечать на неё надо иначе. Такие распознаются отдельно.
  • Детектор противоречий — бережно уточняет, если человек рассказывает несовместимые вещи, а не «верит» ошибочному факту.
  • Осознанное забывание. Память не копит мусор, а отпускает то, что мешает росту отношений, — забывание здесь часть развития, а не баг.

Итог блока: по внутренним замерам — +40% к удержанию и +50% к мотивации возвращаться.


Приоритеты: во что вкладываться первым

Проект рос по чёткой пирамиде. Сначала фундамент — техническая стабильность: обработка ошибок API, база эмоциональной памяти, валидация фактов. Затем эмоциональный интеллект. Потом философия честного общения. И только сверху — новые фичи и монетизация.

Пирамида приоритетов: техстабильность → эмоциональный интеллект → философия → рост

Главный принцип развития я сформулировал как «не чини — усиль резонанс»: не латать симптомы, а усиливать то, что и так работает хорошо.


Анализ настроения

После каждого диалога отдельный модуль классифицирует состояние по 12 эмоциям с оценкой уверенности:

радость · грусть · тревога · злость · спокойствие · воодушевление · одиночество · стресс · перегрузка · благодарность · надежда · разочарование

Данные ложатся в базу и превращаются в график динамики настроения в мини‑приложении. Человек видит свой прогресс — а это само по себе инструмент удержания.

Отношения и близкие — частая тема диалогов, которую бот удерживает в контексте


Админ‑панель и наблюдаемость

Чтобы управлять живым продуктом, нужна была своя админка — не «pgAdmin поверх базы», а инструмент под задачи проекта: пользователи, воронка онбординга, платежи, рассылки, контекст диалогов, управление персоной, затраты на API. Собрана как SPA на нативном JS с Material Design 3, backend — FastAPI.

Админ-панель: вкладки «Обзор / Пользователи / Аналитика / Платежи / Контекст»

Здесь же «наблюдаемость по делу»: логирование 11 событий онбординга, статистика воронки, точки отсева и доля успешного AI-парсинга профиля. Видно не «сколько всего сообщений», а где именно люди спотыкаются.


Технические челленджи и решения

1. Стриминг вместо «крутилки». Ждать 8–10 секунд полного ответа — плохой UX. Ответы стримятся и обновляют одно и то же сообщение в Telegram в реальном времени. Пришлось аккуратно работать с лимитами Telegram на редактирование сообщений и с буферизацией по чанкам.

2. Безопасность выше логики диалога. Детектор кризиса стоит до генерации ответа. Ошибка здесь стоит дорого — поэтому это отдельный модуль с высшим приоритетом, а не «ещё один тег в промпте».

3. Стоимость модели под контролем. Каждый вызов трекается, лимит проверяется через Redis до обращения к модели. Результат — предсказуемые затраты и маржинальность 78% при доступной цене подписки.

4. Естественный онбординг вместо анкеты. Первая версия «убивала вайб»: стена текста после старта, кнопки «Соглашение» и «Справка», слэш‑команды как для программистов. Переписал по принципу «один экран — одна мысль — одно действие». AI-парсинг вытаскивает профиль прямо из свободного текста: человек пишет «Мне 34, живу в Москве, работаю маркетологом, люблю йогу» → система извлекает возраст, город, профессию, хобби и сохраняет. 11 пунктов профиля собираются за 4 сообщения, без ощущения анкеты.

5. Production-надёжность. Бот и API живут как systemd-сервисы: автоперезапуск при падении, watchdog, гарантия единственного экземпляра, лимиты памяти, логирование. Медиа пользователей — в облачном хранилище с политикой хранения.

graph LR
    subgraph Server[VPS · systemd]
        BOT[бот<br/>watchdog 60 c<br/>лимит 1 ГБ]
        API[API<br/>лимит 512 МБ]
        MON[монитор здоровья<br/>каждые 5 мин]
    end
    NGINX[nginx<br/>статика Mini App] --> API
    MON -. 3 попытки + рестарт .-> API
    BOT --> DB[(PostgreSQL)]
    API --> DB

Продукт и бизнес‑модель

Freemium с понятной воронкой:

flowchart LR
    A[Онбординг<br/>~3 мин] --> B[Trial<br/>3 дня Premium]
    B --> C[Free<br/>10 сообщений/день]
    C --> D[Premium<br/>подписка]
    D --> E[Реферал<br/>+7 дней обоим]
    E --> C

Онбординг собирает расширенный профиль, trial даёт почувствовать Premium, а реферальная программа возвращает людей в воронку. Итоговая юнит‑экономика: маржа 78%, LTV/CAC 13,7x, рост +35% в месяц, удержание D7 42%, NPS 68.

Продукт про возвращение к жизни, а не про «поговорить с ботом»

Как это выглядит вживую

Несколько экранов бота и мини‑приложения — приветствие Миры, диалог, анализ настроения, подписка и реферальная программа. Нажмите на любой, чтобы рассмотреть.

Приветствие Миры — «Что умеет этот бот» Диалог с Мирой Экран бота Экран бота Мини‑приложение: подписка и реферальная программа Экран мини‑приложения Экран мини‑приложения Экран мини‑приложения Экран бота Экран бота Экран бота Экран бота Экран бота
Интерфейс бота Мира и мини‑приложения. Клик — просмотр с пролистыванием.

Что я вынес из проекта

  • Один реальный диалог ценнее ста гипотез. Тот случай на четвёртый день дал больше для архитектуры, чем недели планирования. Продукт нужно щупать на живых людях.
  • Персона важнее модели. Характер, границы и тон дают вовлечённость. 178 сообщений на пользователя говорят сами за себя.
  • Память — это инженерия, а не длина контекста. Закинуть всю историю в большое окно недостаточно; ценность даёт структурированное извлечение фактов, попыток и триггеров — и осознанное забывание.
  • Там, где речь о состоянии человека, безопасность — часть архитектуры, а не фича. Кризис‑протокол с высшим приоритетом закладывался с первого дня.
  • Solo-разработка требует дисциплины. Слой репозиториев, строгая типизация, тесты и async-only ввод‑вывод — то, что позволило одному человеку тащить систему такого размера в production.

Отчёт об эволюции: 25 000+ строк кода, 100+ улучшений, 13 фаз роста


Стек одним списком. Backend: Python 3.10, python-telegram-bot v21, SQLAlchemy 2.0 (async), FastAPI, Pydantic. AI: Claude Sonnet 4.5, Whisper (STT), собственные детекторы (кризис, настроение, профиль, триггеры), архитектура «живой памяти». Данные: PostgreSQL, Redis, Cloud Storage, Alembic. Инфраструктура: Docker, systemd, nginx, VPS, health-мониторинг. Качество: pytest + coverage, mypy (strict), black, isort, CI.


Посмотреть вживую

Перейти на сайтmiradrug.ru Телеграм‑бот@MiraDrug_bot

Следующий шаг: хотите AI-продукт с характером — бота, который помнит пользователя и ведёт его сам, напишите мне в Telegram.

Комментарии

Войдите через Telegram, чтобы оставить комментарий:

Пока нет комментариев. Будьте первым.