Мы потом проверим текст на ИИ-детекторе – так звучит одно из условий работы с редактором. Периодически это сразу записывают в ТЗ, например, никаких нейромаркеров, процент ИИ — не выше такого-то. Какой детектор будет проверять и что он считает машинным, обычно никто не говорит.

Десять лет назад заказчики просили уникальность не меньше 95%, теперь гуманизированность. Но директор уникальности хотя бы показывал совпавшие строки, ИИ-сканер судит только по языку.

Потом детектор сообщает: «Вероятность ИИ — 17%». Вот только 17% чего?

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

Хоп-хоп, и нейрослоп

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

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

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

Подход

Что система получает

Что она ищет

Вероятностные метрики 

Текст и языковую модель 

Насколько предсказуема последовательность для этой модели 

Классификатор 

Размеченные человеческие и машинные тексты 

Похож ли текст на человеческие или машинные примеры из обучающей выборки 

Стилометрия 

Явные языковые признаки 

Лексику, синтаксис, пунктуацию и ритм 

Водяной знак 

Схему маркировки, иногда секретный ключ 

Специально внесенное распределение токенов 

История текста 

Черновики, правки, подпись или запись о генерации 

Есть ли информация о том, как создавался текст 

Первые три подхода работают с готовым текстом. Водяной знак ищет сигнал, который генератор оставил заранее. Разберем каждый.

Перплексия, или удиви меня

Языковая модель читает текст по частям и для каждого следующего токена — слова или его фрагмента — рассчитывает вероятность. После фразы «заказчик вернул текст на…» LLM очень ждет слово доработка. Подоконник тоже возможен, но модель удивится.

Степень этого удивления называют surprisal:

S(xᵢ) = −log₂ P(xᵢ | контекст)

Чем ниже вероятность токена, тем выше его surprisal. Опечатка, редкая фамилия и неожиданная метафора играют на руку автору, потому что модель не оценивает литературное качество, она фиксирует отклонение от ожидаемого продолжения.

У surprisal есть близкий родственник — ранг токена. Модель выстраивает возможные продолжения по вероятности: одно ставит на первое место, другое — на десятое, третье прячет куда-нибудь за тысячу. Детектор смотрит, какие места занимали токены настоящего текста.

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

Перплексия собирает отклонения по всему тексту:

PPL = 2^(средний surprisal)

Если в расчете используют натуральный логарифм, та же формула записывается как exp(средний token loss). Низкая перплексия означает, что модель довольно легко угадывала продолжения. Высокая — текст чаще нарушал ее ожидания.

В детекторе это выглядит так. Текст разбивают на токены, затем оценивающая языковая модель по очереди вычисляет вероятность каждого из них. Значения усредняют и сравнивают с результатами на контрольных человеческих и машинных текстах. Если последовательность оказалась слишком удобной для модели, это добавляет баллов в пользу генерации. Иногда сервис также смотрит, как перплексия меняется от предложения к предложению, или передает ее классификатору вместе с другими признаками.

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

Эту метрику используют неслучайно для определения машинных текстов. LLM выбирает токены из вероятностного распределения и, особенно при низкой температуре, чаще берет наиболее ожидаемые. На этом был построен GLTR: он показывал, насколько высоко каждое использованное слово стояло в списке возможных продолжений GPT-2. 

Для примера возьмем открытый русскоязычный детектор. В его тестовом наборе есть файл sample_ai_1.txt — небольшой текст о выборе ноутбука, заранее размеченный как машинный. Начинается он с «важно отметить», затем появляется «ключевая роль», а к финалу поспевает «подводя итог». Штампы расставлены почти учебно:

Важно отметить, что выбор ноутбука для учебы играет ключевую роль в образовательном процессе. 

Метка «ИИ» здесь известна заранее: она записана в тестовой разметке. Детектор пока ничего не определял — ему дали пример с готовым ответом, чтобы проверить расчеты.

Содержимое файла попадает в функцию lmtoken_stats(text). Языковая модель оценивает вероятность каждого следующего токена, а код переводит эти оценки в числовые признаки.

logprobs = torch.log_softmax(shift_logits, dim=-1)
token_loss = -logprobs[idx, shift_labels]

true_logit = shift_logits[idx, shift_labels].unsqueeze(1)
ranks = (shift_logits > true_logit).sum(dim=1)

losses = token_loss.cpu().numpy()
perplexity = float(np.exp(losses.mean()))

Это фрагмент features.py из репозитория k1y0miiii/ru-ai-text-detector  

token_loss — это surprisal, неожиданность отдельного токена. Перплексия складывается из средней неожиданности всего фрагмента. Рядом считается ранг токена — сколько продолжений модель считала более вероятными. 

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

Плюс перплексия зависит и от модели, которой отдали текст. Если взяли другую модель, вместе с ней сменились токенизатор и распределение вероятностей, тем более в тексте на русском языке одну словоформу токенизатор представит одним токеном, а другой разрежет на несколько частей. Значения, полученные разными моделями, напрямую сравнивать нельзя. 

Классификатор. Кого с кем сравнили?

Классификатор не получает готового списка признаков ИИ. Ему дают тексты с известными метками: эти написал человек, эти сгенерировала модель. Дальше он ищет различия между двумя группами.

И тут годится все: жанр, тема, синтаксис, даже источник, откуда собрали тексты.

Предположим, человеческие тексты собрали из отзывов на маркетплейсе:

Брал ноутбук для учебы. Вентилятор ночью слышно, наклейка Intel почему-то приклеена криво, но заряд держит до вечера.

Машинные попросили написать как справку:

При выборе ноутбука следует учитывать производительность, объем оперативной памяти и время автономной работы.

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

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

Первая мысль — детектор ошибся. Хотя нет, не совсем. Он честно нашел то, чему его учили: отзывы с личными подробностями у него были человеческими, инструкции без автора — машинными. Происхождение текста потерялось где-то раньше.

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

Почерк или обстоятельства 

Стилометрия пытается поймать стиль в цифрах. Она считает длину предложений, повторы, местоимения, знаки препинания, любимые слова и синтаксические конструкции. 

В детекторах подход используют для сравнения человеческих и машинных текстов. Но здесь появляется старый вопрос: почерк принадлежит автору или ситуации?

Например, технический писатель утром пишет в свой тг-блог:

Уааа! Опять проспал, побегу на электричку кому должен написать- отпишусь потом

А после обеда этот же человек пишет в документации:

Если ссылка возвращает ошибку 404, проверьте регистр символов в имени файла. 

В использованном выше детекторе эти фрагменты получили бы примерно такие стилометрические признаки:

Признак

Пост

Документация

Средняя длина предложения

6,3 слова

10 слов

Разброс длины предложений

0,47

0

Лексическое разнообразие

0,95

1

Разнообразие пунктуации

0,38

0,25

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

Скрытый текст

import re

from statistics import mean, pstdev

WORD_RE = re.compile(

    r"[а-яеa-z]+(?:-[а-яеa-z]+)*",

    re.IGNORECASE,

)

SENTENCE_RE = re.compile(r"(?<=[.!?])\s+")

PUNCT_RE = re.compile(r"[.,;:!?—–()\-]")

def style_features(text: str) -> dict[str, float]:

    sentences = [

        part

        for part in SENTENCE_RE.split(text.strip())

        if part

    ]

    words_by_sentence = [

        WORD_RE.findall(sentence.lower())

        for sentence in sentences

    ]

    words = [

        word

        for sentence in words_by_sentence

        for word in sentence

    ]

    lengths = [

        len(sentence)

        for sentence in words_by_sentence

        if sentence

    ]

    punctuation = set(PUNCT_RE.findall(text))

    return {

        "mean_sentence_words":

            mean(lengths) if lengths else 0.0,

        "sentence_length_std":

            pstdev(lengths) if len(lengths) > 1 else 0.0,

        "type_token_ratio":

            len(set(words)) / len(words) if words else 0.0,

        "punctuation_variety":

            float(len(punctuation)),

На этом наш пример заканчивается: функция посчитала четыре признака, но еще никого не признала ни человеком, ни машиной.

Для детектора нужен следующий шаг — классификатор. Во время обучения через такую функцию прогоняют тексты с известным происхождением. Каждый – набор чисел, рядом остается метка: 0 — человек, 1 — ИИ. Классификатор ищет, какие сочетания чаще встречаются с каждой меткой.

Потом приходит новый текст. Программа снова считает признаки и получает, например: [10.0, 0.0, 1.0, 2.0]

Это средняя длина предложения, ее разброс, лексическое разнообразие и количество видов пунктуации. Классификатор смотрит, к какой части обучающей выборки такой набор ближе, и выдает оценку. После заданного порога она делает вывод: «человек» или «ИИ».

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

Водяной знак или черная метка

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

Во время генерации таких выборов много. Водяной знак немного меняет их вероятность: при одном контексте преимущество получает один вариант, при другом — другой. Какой именно, определяет секретный ключ. Особых слов или невидимых символов в тексте не появляется.

Только выбирает модель все-таки не слова, а токены. Русская словоформа может остаться целой, а может распасться на несколько частей. Поэтому знак не сидит в отдельном суффиксе, тире или «поэтому». Он появляется понемногу, из многих выборов. На одной фразе его еще нет — точнее, проверить его там почти невозможно.

В августе 2026 года Anthropic объявила, что новые модели Claude будут маркировать текст при генерации. Не весь Claude сразу, это важно. Модели, выпущенные после 2 августа, должны поддерживать маркировку с запуска; старые Anthropic подключает постепенно. Для проверки компания обещает отдельный API, но его еще готовят.

Claude использует версию SynthID-Text. Невидимых символов нет, данных о пользователе или конкретном чате в знаке тоже. Он показывает только, что последовательность выборов похожа на ту, которую Claude составляет с известным ключом.

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

Пять детекторов и одно вступление

Я отправила вступление этого текста в несколько детекторов. Основа везде одна; только в двух проверках сохранились Markdown-бэктики вокруг surprisal, поэтому там 859 символов вместо 857. Перепроверила этот момент на открытой модели: перплексия изменилась, итоговый вердикт — нет.

Сервис

Результат

Как посчитал текст

Что показал дополнительно

Aidetector.ru

100% человек

В поле ввода: 121 слово, 857 символов. В отчете: 118 слов, 11 предложений, 856 символов

Лексическая уникальность — 84,75%;
средняя длина слова — 5,86;
средняя длина предложения — 10,73 слова;
полисиллабических слов — 48, или 40,68%.

«Человек?»

10% ИИ, вероятность низкая. Вердикт: «Авторский текст»

Подсчет слов и предложений на экране результата не указан

Происхождение — оригинальное; вариативность — высокая;
следы редакции — минимальные; следы перевода не выявлены

MyDetector

0% ИИ, 0% смешанного текста, 100% человек

Сначала указал 119 слов, затем в отчете — 122. Символов — 859

«Предложений с высокой вероятностью ИИ не найдено»

Isgen

0% ИИ, 100% человек

859 символов

Выдал только общее распределение между человеком и ИИ

ru-ai-text-detector, версия v1

p(ИИ)=0,101 при пороге 0,86. Вердикт: «человек»

112 слов, 9 предложений, 857 символов

Перплексия — 76,801;
средний surprisal — 4,341;
разброс перплексии — 41,438;
энтропия рангов — 2,209;
разброс длины предложений — 6,669;
MATTR — 0,974; клише — 0; разнообразие пунктуации — 0,625

Еще два сервиса до вердикта не дошли. Smodin принимает тексты не короче 1000 знаков, а Rephrasely после ввода попросил зарегистрироваться. У детектора тоже бывают требования к объему и документы на входе.

Получилось почти трогательное единодушие: все пять систем признали текст человеческим. Только вот его происхождение сложнее. Я написала черновик, специально попросила ChatGPT в BotHub его доработать, а его вариант снова правила сама. 

Во всей этой истории с детекторами у заказчика соблазн поймать халтурщика, у автора — максимально облегчить свою задачу. Но детектор никому не может пообещать этого на 100%.

Если сервис написал «87% ИИ», это повод перечитать текст, а не отказывать в оплате. Он не проверил факты, ход мысли, работу с источниками и соответствие задаче. Суперредактора внутри нет, только модель, которая сравнила готовый текст со своими образцами.

Но и «100% человек» не делает из сырой генерации хорошую статью. Нейросеть могла выдумать цифру, несколько раз повторить одну мысль, прикрыть пустоту аккуратным синтаксисом и все-таки пройти проверку. Публиковать такое без редактуры странно даже не потому, что можно попасться. Хотя бы из уважения к читателю и собственной профессии.

Комментарии (3)


  1. SoloHolo
    28.08.2026 07:01

    Хорошая статья! И главное, что я всё понял


  1. Pyroraptor
    28.08.2026 07:01

    Фу-фу-фу, а вот GPTZero говорит, что все равно ИИ многовато


    1. ELF19 Автор
      28.08.2026 07:01

      Спасибо за дополнительную проверку) GPTZero я не включала, потому что русский у него не относится к полностью поддерживаемым языкам. Для эксперимента брала системы, рассчитанные на русскоязычные тексты