Бот пишет текст нейросетью, а потом второй нейросетью проверяет каждое утверждение против списка проверенных фактов. Что не подтвердилось — подсвечивается человеку до отправки.
Задача выглядела просто: генерировать текст по шаблону. Реальная проблема вскрылась на замерах — модель выдумывает одно-два правдоподобных утверждения в каждом прогоне, и каждый раз новое. Не ошибку из стоп-листа, которую можно отфильтровать регуляркой, а свежую убедительную деталь.
Худший случай поймали живьём: модель приписала опыт с фреймворком, которого у нас нет. Проекты назвала настоящие, а технологию подставила ту, которую хотел видеть читатель. Такой текст не отличить от правды, не зная предметной области.
Отсюда вывод, вокруг которого построена вся система: на прямой вопрос «ты уверен?» модель всегда отвечает «да». Спрашивать бесполезно — нужно заставлять её разбирать текст на утверждения и предъявлять источник по каждому.
Первая модель пишет текст. Вторая получает его вместе со списком проверенных фактов и работает по приёму «выпиши каждое утверждение и предъяви источник». Формулировка «найди плохое» давала ноль находок — модель просто хвалила текст. Разбор по утверждениям находит.
Ключевая находка: аудитор сверял проект, а подмена была в технологии. Строка «бот на aiogram» подтверждала упоминание бота — и аудитор успокаивался, пропуская приписанный фреймворк. Ввели отдельную категорию: технология сверяется буквально и независимо от проекта. Подмена ловится 10 из 10.
Аудитор ставил «нет источника» на фразы вида «опыта с этим не было» — у отрицания источника не существует в принципе. Модель правило понимала, но статус выставить было некуда: ложных срабатываний 2 из 3. Добавили статус «не проверяется» для планов и отрицаний — стало 0 из 3. Проблема была не в промпте, а в том, что схема данных не вмещала реальность.
Главная улика машинного текста — длинное тире. Промптом не лечится: после «усиления» инструкции их стало не меньше, а больше (6 → 9). Вычищаются кодом плюс петлёй перезапроса. Содержание при этом было человеческим — палила типографика, а не грамотность.
Методический вывод, который дороже кода: один прогон врёт. Первый замер показал «ноль ложных срабатываний» — на трёх прогонах оказалось два из трёх. С тех пор любое правило проверяется минимум тремя прогонами, а метрика формулируется как «поймано X из N», а не «сработало».