Внутренний инструмент студии
ИИ · Telegram-бот

ИИ-помощник, который ловит собственные выдумки

Бот пишет текст нейросетью, а потом второй нейросетью проверяет каждое утверждение против списка проверенных фактов. Что не подтвердилось — подсвечивается человеку до отправки.

РольПроектирование и разработка
СтекPython · aiogram · LLM API
СхемаПисатель + аудитор
ФорматПолу-автомат
Задача

Нейросеть врёт правдоподобно

Задача выглядела просто: генерировать текст по шаблону. Реальная проблема вскрылась на замерах — модель выдумывает одно-два правдоподобных утверждения в каждом прогоне, и каждый раз новое. Не ошибку из стоп-листа, которую можно отфильтровать регуляркой, а свежую убедительную деталь.

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

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

Решение

Два слоя обороны

Писатель и аудитор — разные роли

Первая модель пишет текст. Вторая получает его вместе со списком проверенных фактов и работает по приёму «выпиши каждое утверждение и предъяви источник». Формулировка «найди плохое» давала ноль находок — модель просто хвалила текст. Разбор по утверждениям находит.

Отдельная проверка технологий

Ключевая находка: аудитор сверял проект, а подмена была в технологии. Строка «бот на aiogram» подтверждала упоминание бота — и аудитор успокаивался, пропуская приписанный фреймворк. Ввели отдельную категорию: технология сверяется буквально и независимо от проекта. Подмена ловится 10 из 10.

Третий статус вместо бинарного «да/нет»

Аудитор ставил «нет источника» на фразы вида «опыта с этим не было» — у отрицания источника не существует в принципе. Модель правило понимала, но статус выставить было некуда: ложных срабатываний 2 из 3. Добавили статус «не проверяется» для планов и отрицаний — стало 0 из 3. Проблема была не в промпте, а в том, что схема данных не вмещала реальность.

Типографику чинит код, а не промпт

Главная улика машинного текста — длинное тире. Промптом не лечится: после «усиления» инструкции их стало не меньше, а больше (6 → 9). Вычищаются кодом плюс петлёй перезапроса. Содержание при этом было человеческим — палила типографика, а не грамотность.

Как устроено

Конвейер

Вводтекст + файлы
Разборпарсер + метрики
Оценкавыполнимо?
ПисательLLM
Валидаторкод · петля ×4
АудиторLLM · источники
Человеквычитка
Интерфейс

Что видит человек

AF
Помощниконлайн
📎 ТЗ.docx · 84 КБ
📎 Принял ТЗ: ТЗ.docx12 480 символов
[вставлен текст задачи]
⚙️ Разбираю…Замерил сайт клиента
Прочитал вложение
Оценил выполнимость
Черновик готов1 113 символов · длинных тире: 0цена и срок — ориентир, решает человек
⚠️ ГЛЯНЬ СЮДА«Работаю с MCP, API, n8n»
источник: не найден в списке фактов
🖐 Не код, руками:доступ к серверу
согласование анкеты
✅ Отправил⏭ Пропустить
Результат

Замеры, а не ощущения

10/10подмена технологии поймана
0/8ложных срабатываний на отрицаниях
0машинных тире в готовом тексте
прогона на кейс — минимум для вывода

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

Стек

Технологии

Python 3.11aiogram 3LLM API Google PageSpeed APIpython-docxopenpyxl pdfplumberSQLiteA/B-замеры
Инструмент собран для внутренних задач студии. Полу-автомат по замыслу: машина готовит и подсвечивает сомнительное, решение и отправка — за человеком. Вычитка здесь несущая стена, а не украшение.