Автор Telegram-бота для превращения голосовых заметок в сценарии описал практический способ убрать из ответов Claude признаки машинного письма: длинные тире, антитезы и шаблонные обороты. Одной просьбы в промпте оказалось мало, поэтому в рабочем процессе появились второй проход нейросети и детерминированный фильтр. Подход пригодится тем, кто публикует тексты от имени бизнеса или автора; начать можно с правил для промптов ChatGPT и Claude.
Почему одной инструкции в промпте не хватило
Бот принимает голосовые, аудиофайлы, видео и текст, отправляет речь на Whisper через Groq, а готовит сценарии с помощью Claude Sonnet 4.6. Пользователь выбирает формат, получает текст и может попросить о правке. Проблема возникла не в содержании, а в узнаваемой манере: длинных тире, фраз вроде «важно понимать» и конструкций «не X, а Y».
Сначала автор добавил чек-лист в промпт. Затем выяснилось, что в боте больше десятка путей генерации, и часть из них этого правила не видела. Правила перенесли в общую константу ANTISLOP_RULES, которую добавляют в конец каждого промпта. Это улучшило результат, но длинные сценарии всё равно иногда нарушали запрет.
- Длинные тире там, где ожидались точка или запятая.
- Антитезы «это не X, это Y», «не X, а Y», «дело не в X, а в Y» и «X, а не Y».
- Клише, тройки прилагательных и слишком длинные предложения.
Второй проход исправляет стиль, но не даёт гарантии
После генерации текст отправляют в Claude ещё раз с узкой задачей редактора: убрать маркеры, не переписывать материал заново и сохранить заголовки, нумерацию, эмодзи, разделители и блок задания для ассистентов. Для этого прохода указаны температура 0,2 и лимит 8000 токенов. Отдельно проверяются оба порядка антитезы, потому что форма «X, а не Y» пропускалась чаще.
Однако модель не всегда надёжно выполняет буквальный запрет на символ. Поэтому второй проход оставили редакторским слоем, а проверяемую часть вынесли в код. Такой фильтр решает ограниченную задачу и не доказывает, что весь результат написан человеком.
Регулярка закрывает конкретную дыру
Функция strip_ai_markers проходит через каждый выход бота. Регулярное выражение заменяет пять вариантов тире — em dash, en dash, горизонтальную черту, знак минуса и figure dash — обычным дефисом. Последовательность ━ намеренно исключили: на ней держатся разделители секций и нарезка длинных сообщений Telegram.
Антитезы регуляркой не переписывают. Для них используются четыре выражения, ограниченные одним предложением и диапазоном от 1 до 40 символов между частями. Детектор только запускает одну прицельную попытку переписывания: автоматическое удаление могло бы сломать смысл. После каждого ответа модели фильтр запускается снова, а оставшееся совпадение записывается в лог.
- Сначала тире удаляются детерминированно, чтобы они исчезли даже при сбое API.
- Затем выполняется второй проход Claude, если включён ANTISLOP_SECOND_PASS.
- При найденной антитезе допускается одна повторная попытка.
Что проверить в собственном боте
После внедрения автор нашёл шесть обходных путей, где ответы модели уходили пользователю напрямую: советник, рецензия, групповой чат, ежедневная шутка, темы и описания для YouTube. Теперь каждый выход проходит хотя бы через strip_ai_markers, а быстрый групповой чат использует только этот слой.
Практический вывод прост: недостаточно улучшить главный сценарий, нужно перечислить все места, где текст покидает систему. Промпт задаёт желаемый стиль, модель пытается его выдержать, а код проверяет то, что можно проверить однозначно.