Сделал сервис, который отличает понимание от воды в школьных эссе. Показываю, как он работает

Сделал сервис, который отличает понимание от воды в школьных эссе. Показываю, как он работает

Вот кусок настоящего эссе по физике:

«Квантовая механика является фундаментальным аспектом современной физики, что демонстрирует комплексность субатомных взаимодействий в многомерном контексте. Данная область науки играет важную роль и имеет большое значение.»

Прочитайте ещё раз. Что автор сказал о квантовой механике? Что она важная и сложная. Всё. Двадцать семь слов, ноль информации.

А теперь вычеркнем из этого абзаца каждый оборот, который ничего не утверждает:

Осталось: «Квантовая механика аспектом современной физики, что субатомных взаимодействий. Данная область науки и».

Не осталось ничего. И это не приговор нейросети — это механическое вычёркивание по словарю, которое можно проверить руками.

Сервис называется ThoughtCheck, он работает по адресу thoughtcheck.ru и он бесплатный. Сейчас бета — поэтому и пишу.

Зачем это вообще

Школьника и студента много лет учат одному приёму: не знаешь — пиши длинно и умно. Работает безотказно. Проверяющий видит сложные слова, ровные абзацы и связки «таким образом» — и ставит четвёрку, потому что придраться формально не к чему.

Проблема не в лени. Проблема в том, что этот приём поощряется системой. Ученик, который честно написал «я понимаю до сих пор, а дальше нет», получит меньше, чем тот, кто залил объём водой.

Дальше стало хуже. ChatGPT и его аналоги производят такой текст в промышленных количествах и лучшего качества. Учитель, у которого тридцать работ и два часа, отличить не может. Не потому что глупый — потому что это физически невозможно за четыре минуты на работу.

Антиплагиат тут не помогает: текст-то оригинальный. Он просто пустой.

Мы проверяем грамматику и уникальность. Мы не проверяем понимание. ThoughtCheck пытается закрыть именно эту дыру.

Что он делает

Bullshit Score — шесть сигналов, а не «нейросеть так решила»

Локальный движок, без ИИ, считает шесть независимых признаков:

Сделал сервис, который отличает понимание от воды в школьных эссе. Показываю, как он работает

Шестой сигнал появился не сразу. Первая версия поставила пародийному эссе — специально написанной бессмыслице — твёрдую четвёрку. Разбор показал почему: текст был написан простыми словами, а движок ловил в основном наукообразие. Пришлось разделить словари на «связки рассуждения» (показывают форму аргумента) и «проверяемые опоры» (то, что читатель может пойти и перепроверить). Уверенная чушь простым языком — отдельный жанр, и ловить его нужно отдельно.

После правки та же пародия получила F.

Рентген текста — самое интересное

Это приём Фейнмана, сделанный механически. Берём текст, вычёркиваем всё, что ничего не утверждает, и показываем две вкладки: «оригинал с пометками» и «что осталось».

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

Цифры на реальных текстах:

Сделал сервис, который отличает понимание от воды в школьных эссе. Показываю, как он работает

Тут я чуть не совершил ровно ту ошибку, ради борьбы с которой всё затевалось.

Первая версия метрики считала долю предложений, где есть проверяемая опора — число, дата, имя. Красиво, измеримо. И она поставила 0 % нормальному объяснению квантовой механики — только за то, что в нём не было цифр.

Это была бы ложь в лицо. Объяснение механизма без единого числа — обычный хороший текст, и наказывать за это — то же самое, за что мы ругаем школьную систему: оценивать форму вместо содержания.

Переформулировал вопрос. Инструмент отвечает не на «хорош ли текст» — на этот вопрос механически честно не ответить. Он отвечает на «рассыпалось ли предложение, когда убрали обороты». Показывает, где пусто, а не выдаёт справку о качестве.

Отдельно ценно, что рентген работает без ИИ вообще. Чистая функция от строки: тот же текст всегда даёт тот же результат. Когда ученик говорит «нейросеть придирается» — спорить не о чем. Вот текст, вот что вычеркнуто, смотрите сами.

Вопросы, на которые нельзя ответить пересказом

После разбора сервис задаёт 3–4 вопроса по работе. Не «о чём текст» — на такое ответит любой, кто его переписал. Вопросы про механизм, собственный пример, следствие, границы применимости.

Знаешь тему — ответишь. Списал или залил водой — нет. Это и есть проверка, которую невозможно обойти красивыми словами.

Детектор ИИ — с честной оговоркой

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

Поэтому у нас он для разговора, а не для наказания.

Для учителя

Класс по коду, аналитика по ученикам, динамика от версии к версии. Плюс генератор материалов: вводите тему и класс — получаете план урока с таймингом, домашнее задание с критериями и проверочный тест с ключом ответов. Полминуты вместо вечера.

Как это устроено

Стек простой: FastAPI и PostgreSQL на бэкенде, Next.js на фронте, всё в Docker на одном сервере в Москве, HTTPS через Caddy.

Главное архитектурное решение — разделить локальный движок и нейросеть.

Соблазн был очевидный: отдать текст модели и попросить оценить. Так делают все, и это плохо по трём причинам. Каждый разбор стоит денег и секунд. Результат недетерминирован — тот же текст завтра получит другую оценку. И спорить с ним невозможно: на «почему 70?» ответа нет.

Поэтому шесть сигналов Bullshit Score и весь рентген считаются локально, обычным кодом по словарям. Мгновенно, бесплатно, воспроизводимо. Нейросеть подключается сверху — она хорошо ловит то, чего словарь не увидит: подмену тезиса, ложную причинность, уверенное враньё по существу. Итоговая оценка — смесь, где локальный движок задаёт основу, а модель корректирует.

Один раз эта смесь сработала против меня — та самая история с пародийным эссе. GigaChat поставил ему заслуженную двойку, локальный движок — четвёрку, и в среднем вышло прилично: слабое звено вытянуло оценку вверх, а не сильное вниз.

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

Список граблей на деплое, каждая стоила часа-двух: пароль от базы, сгенерированный через openssl, случайно содержал слэш — а слэш в строке подключения интерпретируется как разделитель, поэтому драйвер ругался на «неизвестный хост» и ни словом не упоминал пароль. Сборка Next.js на сервере с 2 ГБ памяти падала без внятной ошибки — процесс убивал OOM-killer, в логе оставалось одно слово «Killed». В образе хостинга обнаружился предустановленный nginx, занявший 80-й порт, — узнал об этом только после двадцати минут сборки, когда упал последний из четырёх контейнеров. А контейнеры вдобавок унаследовали от хоста адрес локального DNS-резолвера, из-за чего изнутри переставали резолвиться все имена, а в логах — сухое «connection refused» без единого слова про DNS. Ни одну из этих проблем нельзя было предвидеть, читая документацию.

Тестов 164, и это не для красоты: каждый второй написан после того, как что-то сломалось. Есть тест на то, что регистрация физически не проходит без согласия на обработку данных. Есть на то, что демо-лимит строже тарифного и счётчик под полем ввода не обещает того, чего сервер не примет. Есть даже на то, что при вычёркивании слова «просто» не выедается кусок из середины слова «простое». Каждый новый тест я проверяю, специально ломая код: тест, который не падает на сломанной версии, — это не тест, а украшение.

Про данные — коротко и по делу

Проект сначала жил на Vercel + Render + Neon. Всё бесплатно, всё удобно, всё за рубежом.

Часть 5 статьи 18 152-ФЗ требует хранить персональные данные граждан РФ на серверах в России. Имя школьника и текст его работы — это персональные данные. С такой связкой сервис нельзя было показывать реальным ученикам, только демонстрировать.

Переехали на свой сервер в Москве. База в контейнере рядом с приложением, порт наружу не опубликован — подключиться к ней можно только с самого сервера. Политика обработки данных написана по факту, а не по шаблону: там указано, что текст работы уходит в GigaChat, кто оператор и как отозвать согласие. Аккаунт удаляется из личного кабинета вместе со всеми работами — по-настоящему удаляется, а не помечается неактивным.

Смысловой анализ делает GigaChat от Сбера. Выбран не из патриотизма: он работает из России без VPN, у него есть бесплатная квота, и его серверы в РФ — значит, трансграничной передачи нет.

Чего он не умеет

Раз уж сервис про честность, скажу и это.

  • Он не читает предмет. Движок видит структуру рассуждения, а не физику. Написать связную чушь с числами и обмануть его можно.
  • Детектор ИИ ошибается. У всех ошибается. Поэтому — вероятность и оговорка.
  • Сервер слабый. Одно ядро, 2 ГБ. Тридцать человек, нажавших «Анализировать» одновременно, встанут в очередь. Для класса, который сдаёт работы в разное время, — нормально.
  • Русский язык проработан лучше английского. Словари собирались под русский.

Ограничения бесплатной версии

Их два, и оба не жадность, а необходимость:

  • 1500 слов на разбор без регистрации, 2500 слов — на одну работу в аккаунте. Это примерно десять страниц: любое школьное эссе или курсовая проходят, диплом нет. Ограничение не про деньги — на ста страницах Bullshit Score усредняется в ровную серединку, и разбор становится бессмысленным.
  • 5 анализов в неделю. Хватает на три-четыре версии одной работы: смысл продукта именно в цикле «написал → разобрал → переписал → разобрал снова».

Платных тарифов нет. Они описаны на странице «Планы» с пометкой «в разработке», чтобы было видно направление, но оплаты в системе нет вообще, и бесплатный тариф не станет платным задним числом.

Что мне нужно от вас

Это бета. Сервис работает, но обкатан на десятке текстов, а не на тысяче.

Зайдите на thoughtcheck.ru и вставьте любой текст. Регистрация не нужна. Своё старое эссе, чужую статью, пресс-релиз, отчёт с работы — что угодно, где вы подозреваете воду. Тридцать секунд.

И напишите, что не так. Внизу главной есть форма обратной связи — без регистрации, три поля. Мне полезнее всего:

  1. Ложные срабатывания. Хороший текст, которому поставили низкую оценку. Это самая вредная ошибка: сервис, который ругает за честное письмо, хуже, чем его отсутствие.
  2. Пропуски. Очевидная вода, которую он не заметил.
  3. Непонятные места в отчёте. Если метрику приходится расшифровывать — она плохо названа.

Если вы учитель — попробуйте генератор материалов и скажите, годится ли результат для реального урока. Мне это оценить неоткуда.

Ругайте прямо. Ответ «неплохо, но не моё» бесполезен, а «вот этот абзац хороший, а вы поставили ему 70» — золото.

Сервис бесплатный, реклама не планируется, данных ваших мне не нужно — при желании аккаунт удаляется из личного кабинета вместе со всем содержимым.

5