Я сделал ИИ-рассказчика в Telegram. Что сломалось в первые две недели и что с этим делать
Я делаю Telegram-бота, который пишет интерактивную историю и подстраивается под читателя. Ты пишешь, что делает герой, или нажимаешь вариант, а бот продолжает сюжет и помнит мир. Пока это небольшой пилот на восьми тестерах, и поэтому интереснее не «вот мой проект», а три вещи, которые на нём сломались. Ссылка в конце.
Как это устроено
Вся история живёт в БД. На каждом шаге бот берёт последние десять сцен, факты о мире (их он выписывает сам и ищет по смыслу), профиль читателя и пишет следующую сцену. Модель одна, qwen3-235b через OpenRouter. Один шаг стоит порядка 0,2 цента, сцена пишется 10-20 секунд. Память мира обновляется в фоне, читателя она не задерживает.
Сломалось первое: фильтр 18+ обошли метафорой
Один тестер довёл историю до откровенных сцен, и модель писала их почти без прямых слов, через длинную метафору леса, корней и сока. Фильтр по словам такое не ловит: у смысла нет списка слов. Я оставил фильтр первым рубежом, а вторым добавил вопрос к той же модели: описывает ли этот текст откровенный сексуальный контент, независимо от лексики. Ответ да/нет, около секунды на сцену. Проверка на десяти реальных и синтетических текстах дала 10 из 10 без ложных срабатываний. Две дешёвые модели других провайдеров для этой проверки не подошли: на каждый запрос, даже безобидный, API отвечал отказом по условиям использования.
Сломалось второе: модель повторяет одну фразу
Я замерил 204 сцены. Оборот «не X, а Y» («не страх, а предчувствие») встречался в 78% сцен, три и больше раз в 30%. Первая мысль была добавить правило в промпт. Проверка на 12 реальных ситуациях показала, что одно правило почти ничего не меняет: три и больше оборотов остались в 3 сценах из 12, а курсива стало даже больше. Причина в том, что модель копирует стиль из своих же последних десяти сцен, лежащих в контексте.
Сработал пакет из трёх мер: правило в промпте, чистка курсива в истории (модель видит прошлые сцены без звёздочек) и одна автоматическая перегенерация, если в готовой сцене три и больше таких оборотов. Результат: три и больше оборотов остались в одной сцене из двенадцати, среднее с 2,8 упало до 1,4. Цена: примерно каждая четвёртая сцена приходит на десять секунд позже.
Сломалось третье: бот сам додумывает за героя
Примерно в каждой пятой сцене бот вкладывает герою реплику или мысль, которых игрок не писал («ты твёрдо говоришь», «ты понимаешь, что…»). Тут снова не помогло одно правило: нарушений было 67% до и 67% после. Помогла перегенерация, когда в сцене нашлись формы «ты чувствуешь», «ты решаешь»: такие обороты упали с 13 из 24 сцен до 2. Но я не стал делать это для всех: часть игроков такое додумывание любит. Поэтому после третьего шага бот один раз спрашивает, оставлять ли соавторство, и режим «строго» включается только по выбору читателя.
Чему это научило
- Одно правило в промпте часто не работает. Модель копирует контекст сильнее, чем слушается инструкции. Проверка должна быть измеряемой, а не «вроде стало лучше».
- Судья-модель шумная: часть найденных ею нарушений оказывается ложной. Цитаты стоит смотреть глазами.
- Приток людей оказался тяжелее, чем качество текста: пост про бота дал 520 просмотров и один переход, вернулись двое из восьми тестеров.
Ограничения честно
Выборки маленькие (десятки сцен, восемь людей), судья и автор это одна и та же модель, цифры стоит читать как направление, а не как статистику.
Если интересно попробовать (бесплатно, до 15 шагов в день, 18+ бот не пишет): https://t.me/vostory_ai_bot?start=vcru
Я читаю истории тестеров, чтобы улучшать бота, поэтому личного в них лучше не писать.