Я спроектировал и собрал бота от тревоги «Министерство Экзистенциальной Безопасности» от и до — продукт, архитектуру и код, в режиме AI-native разработки. Решающий ход здесь не «обернуть всё нейронкой», а провести границу: где модели можно импровизировать, а где ей запрещено касаться ответа. Нейронка пишет только сатирическую разрядку. Терапию и обработку кризиса ведёт детерминированный код без единого вызова модели — потому что там неудачное слово стоит не шутки, а человека в дистрессе.
Это и есть моя работа как ИИ-консультанта: я решаю, где модели место, а где она риск — и закрепляю эту границу в коде, а не в промпте.
Граница ИИ — это архитектурное решение о том, где модели позволено выдавать ответ, а где нет. Здесь модель пишет только сатирическую разрядку; терапия, заземление и обработка кризиса детерминированы и не содержат вызова модели. Граница закреплена в коде, а не оставлена на промпт.
Что это за бот и почему вся суть в границе?
Бот переводит человека от вспышки тревоги к конкретному следующему шагу. У него две части, и разница между ними — это и есть кейс.
Часть первая — разрядка. Вы выгружаете то, что грызёт, а уставший чиновник «Министерства Экзистенциальной Безопасности» выдаёт сатирический «Акт №404», который перемалывает страх через масштаб Вселенной и чёрный юмор. Эта часть генеративная — её пишет языковая модель. Импровизация тут ровно то, что и работает, а неудачное слово стоит лишь чуть более слабой шутки.
И разрядка тут не просто подводка к разбору — она уже работает, сразу двумя путями, до всякого анализа. Во-первых, само то, что человек выписывает тревогу словами, выгружает её из головы в текст, уже запускает разрядку. Во-вторых, когда чиновник перемалывает страх через абсурд и масштаб Вселенной, становится легче ещё до разбора — смех обесценивает страх. И это ровно то, почему модель тут безопасна: облегчение даёт сам акт выписывания и абсурдная рамка, а не точность отдельной формулировки.
Часть вторая — разбор. Здесь бот ведёт через настоящую регуляцию эмоции: назвать чувство, проверить, бьётся ли оно с фактами, и пошагово сделать телесное «действие наоборот». В этой части нейронки нет. Каждое слово собрано руками из клинического источника, потому что здесь неудачное слово стоит человеку неверной инструкции.
Этот раздел и есть архитектура. Модель допущена туда, где ошибка безвредна, и закрыта там, где может навредить. Всё остальное работает на эту одну линию.
Где модель работает, а где ей вход закрыт?
Я пустил модель ровно в одно место и закрыл ей вход во все остальные. Терапевтический контент, обработка кризиса и заземление — детерминированные модули без вызова модели. Модель — одна изолированная функция за одной частью продукта.
app/
api/
bot вебхук: роутинг, обе части, кризис-чек, лимит, админка
cron фоновый дёрж молчунов (тихие часы, раз в 3-6 дней)
admin панель статистики + рассылка
lib/
prompts системный промпт модели — ЕДИНСТВЕННОЕ место, где живёт ИИ
utils вызов DeepSeek: таймаут 58с, ручной abort, ответ в образе при сбое
emotion_reg Часть 2, разбор: статичный DBT-движок, 9 эмоций (БЕЗ ИИ)
grounding заземление, фиксированные шаги (БЕЗ ИИ)
crisis перехват по стоп-словам, до всего остального (БЕЗ ИИ)
supabase данные: пользователи, логи сообщенийСостояние разговора — конечный автомат, хранится по пользователю, а не «в голове модели»: разбор шагает по шагам в базе, идемпотентно, поэтому обновление страницы или двойной тап его не ломают.
Обёртка над LLM или архитектура с границей?
Обёртка отправляет всё в модель и надеется, что ответ безопасен. Архитектура с границей решает, что модели позволено выдавать, а что — нет. Вот разница построчно.
| Обёртка над LLM | Граница (этот проект) | |
|---|---|---|
| Где работает модель | везде, на любой ввод | только безопасная зона (разрядка) |
| Терапевтический контент | генерит модель | захардкожен из клинического источника |
| Кризисное сообщение | тоже уходит в модель | детерминированный путь → человек |
| Риск галлюцинации | на пользователе | вырезан архитектурой |
| Если модель сбоит | человек остаётся ни с чем | человек всё равно получает ответ |
| Роль автора | промпт-инженер | архитектор границ |
Какие решения и сделали продукт?
Кейс не в том, что «собрался бот от тревоги». Кейс — в том, где проведена линия.
Модель работает только в безопасной зоне
Она пишет сатирический «Акт» и больше ничего. Вся терапевтическая суть продукта лежит вне её.
Терапия захардкожена из клинического источника
Разбор собран по таблицам регуляции эмоций из работы Кристин Данкли — назвать эмоцию, сверить с фактами, телесное «действие наоборот». Бот выдаёт выверенный метод, одинаково каждый раз, а не выдумывает советы. Подсказки о состоянии тела даны через «если Вы съёжились…», чтобы бот не приписывал человеку чувство, которого у того нет.
Кризис всегда доходит до человека
Детерминированная проверка по стоп-словам о самоповреждении стоит до любой другой обработки, в обоих режимах. При совпадении бот прекращает шутки и упражнения и направляет человека к живому специалисту. Это единственное место, которое нельзя отдавать вероятностной модели.
Человек всегда получает ответ
У генеративного вызова таймаут 58 секунд под лимитом Vercel в 60 и ручной abort, а при любом сбое уходит внятное сообщение в образе, а не зависание и не луп. Надёжность лежит в коде, а не в настроении модели. (Ранняя версия как раз зацикливалась и падала по таймауту; починка — увести этот путь из-под милости модели.)
Состояние — автомат, а не память
Разбор идёт по явным шагам в базе, идемпотентно к обновлениям и двойным тапам. Контекст модели нарочно крошечный — лишь несколько последних сообщений — чтобы ничего не разрасталось и не разъезжалось.
Персона — обезболивающее
Бюрократический чёрный юмор — «Шредер Реальности», «Акт №404» — обесценивает страх через масштаб и смех. Он живёт только в первой части; в разборе и в кризисе тон серьёзный и уважительный, потому что там насмешка навредила бы. После шутки-разрядки одна кнопка гласит «а теперь разобрать по-настоящему» и переводит человека из катарсиса в саму работу.
Это работает?
Да. Развёрнуто в продакшене на Vercel, вебхук здоров — ноль ошибок и ноль зависших апдейтов, обе части работают, кризис-фильтр и детерминированный разбор работают как задумано. Я не публикую «снизил тревогу на N%»: честной базы для такого замера нет, и выдумывать её не буду. За что я ручаюсь — за проект: рискованные части детерминированы и выверены, а модель отгорожена от всего, что может навредить человеку.
Почему это лучше обёртки над моделью?
Обёртка отправляет всё в модель и надеется, что ответ безопасен. Я решаю, что модели позволено выдавать. Смешная часть остаётся свободной и генеративной; клиническая часть и кризисный путь остаются детерминированными, читаемыми и неизменными. Эта граница и есть результат — у большинства «ИИ-продуктов» её нет, и ровно там они и ломаются.
Строите с ИИ и не уверены, где модели место?
Я решаю, где модель оправдывает себя, а где она риск — и проектирую эту линию, а не просто пишу промпты. AI-native разработка доводит продукт от идеи до развёрнутой системы за дни, с границей, вшитой с самого начала.
