Детектор ИИ-текста для русского языка

russian-ai-text-detector-bert оценивает вероятность, что русский текст написала нейросеть, а не человек. Обучен на текстах ChatGPT (GPT-3.5, GPT-4, GPT-4o, o1, o3), GigaChat, YandexGPT, Qwen, Llama, Gemma, DeepSeek, Mistral, Command R и других языковых моделей из корпуса LLMTrace. Помогает проверить текст на ИИ: статью, новость, отзыв, пост, ответ на вопрос.

Это дообученный энкодер cointegrated/rubert-tiny2 на 29.229.2 млн параметров, переведённый в ONNX с весами int8. Файл model.onnx занимает 29.729.7 МБ и работает на CPU через onnxruntime, без torch и GPU. Рядом лежит model_fp32.onnx на 117117 МБ с весами fp32, aiw-ru его не скачивает. Веса PyTorch для дообучения и своего экспорта — model.safetensors на 117117 МБ. На отложенной части корпуса ROC AUC 0.9870.987, accuracy 0.9450.945. У LightGBM на признаках aiw-ru ROC AUC 0.9430.943.

Модель необязательная: детектор и скиллы aiw-ru работают без неё. Ставится она только по имени, командой aiw-ru models install transformer, и только если пользователь попросит; в aiw-ru classify её выбирают ключом --model transformer. Другие модели aiw-ru: russian-ai-text-detector-mini-frida (mini-frida), russian-ai-text-detector-modernbert (modernbert), LightGBM на признаках aiw-ru (lightgbm).

In English

A Russian AI-generated text detector. It estimates the probability that a Russian text was written by a person or by an LLM such as ChatGPT (GPT-3.5, GPT-4, GPT-4o, o1, o3), GigaChat, YandexGPT, Qwen, Llama, Gemma, DeepSeek, Mistral, Command R and others, which makes it usable as an AI text detector, a ChatGPT detector or an "AI slop" filter for Russian. The model is cointegrated/rubert-tiny2 fine-tuned, trained on the Russian part of the LLMTrace corpus and exported to ONNX with int8 weights: model.onnx takes 29.729.7 MB and runs on CPU with onnxruntime, no torch or GPU needed. An fp32 export, model_fp32.onnx, is an optional extra file of 117117 MB. PyTorch weights for fine-tuning or your own export are in model.safetensors, 117117 MB. Test ROC AUC 0.9870.987, accuracy 0.9450.945. Install it with aiw-ru models install transformer. The rest of the card is in Russian; usage is below.

Какую модель выбрать

Это быстрый вариант среди трансформеров aiw-ru, за скорость он платит точностью.

Модель Людей принято за ИИ ROC AUC Accuracy Файл, МБ M1, мс x86, мс
modernbert 3.4%3.4\% 0.99300.9930 0.9630.963 140140 207.2207.2 —
transformer, эта модель 7.2%7.2\% 0.98690.9869 0.9450.945 29.729.7 39.839.8 101.1101.1
mini-frida 9.5%9.5\% 0.99090.9909 0.9480.948 130130 137.2137.2 216.2216.2
lightgbm 16.5%16.5\% 0.94310.9431 0.8680.868 10.010.0 — —
  • modernbert — самая точная: выбор по умолчанию, но тяжелее трансформера и в несколько раз медленнее.
  • transformer (эта модель) — почти так же точна, лёгкая и в несколько раз быстрее ModernBERT: для слабой машины.
  • mini-frida — ROC AUC выше, чем у трансформера, но при пороге 50 % чаще принимает людей за ИИ; в 4 раза тяжелее и в 3 раза медленнее.
  • lightgbm — самая лёгкая, работает и без onnxruntime (Mac на Intel), но заметно менее точна.

Если установлено несколько моделей, aiw-ru берёт вероятность у первой из них в порядке таблицы. Порядок задаёт доля людей, принятых за ИИ, а не ROC AUC: ошибиться в человеке дороже, чем пропустить ИИ-текст.

Задержка — один текст на 512512 токенов в один поток на M1 и на двух ядрах Xeon виртуальной машины Colab (x86). Размер у LightGBM — файл модели, признаки для неё считает сам детектор aiw-ru.

Данные

Русская часть LLMTrace classification (статья), ревизия 252e21e3dca7. Модель обучена на 237 929237\,929 текстах из train, лучший шаг и ранняя остановка — по ROC AUC на 49 74749\,747 текстах из valid. Итоговые цифры посчитаны по test, это 52 52152\,521 текст: эту часть корпуса модель при обучении не видела. Отчёт об обучении с выбором базы и командами для воспроизведения лежит на GitHub.

Результаты на test

Текст считается написанным ИИ, если вероятность не меньше 0.50.5. Текст длиннее 512512 токенов модель читает только до этой границы: среднее по окнам на valid не точнее.

Класс Precision Recall F1 Текстов
люди 0.9370.937 0.9280.928 0.9320.932 21 41721\,417
ИИ 0.9510.951 0.9570.957 0.9540.954 31 10431\,104
accuracy 0.9450.945 52 52152\,521
среднее по классам 0.9440.944 0.9420.942 0.9430.943 52 52152\,521

Сравнение с LightGBM на признаках aiw-ru и с оценкой правил детектора с порогом 4040 на том же test:

На test Эта модель modernbert mini-frida LightGBM Правила aiw-ru
Accuracy 0.9450.945 0.9630.963 0.9480.948 0.8680.868 0.5030.503
ROC AUC 0.9870.987 0.9930.993 0.9910.991 0.9430.943 0.6150.615
ROC AUC, люди против текстов с нуля 0.9890.989 0.9940.994 0.9920.992 0.9460.946 0.5970.597
F1, среднее по классам 0.9430.943 0.9620.962 0.9450.945 0.8630.863 0.4660.466
Людей принято за ИИ 7.2%7.2\% 3.4%3.4\% 9.5%9.5\% 16.5%16.5\% 5.9%5.9\%

На valid accuracy 0.9460.946, ROC AUC 0.9880.988.

По жанрам

Жанр Людей ИИ Accuracy ROC AUC ROC AUC LightGBM ROC AUC правил
article 51095109 53435343 0.9480.948 0.9890.989 0.9630.963 0.7090.709
factual 13831383 22092209 0.9150.915 0.9760.976 0.8960.896 0.6730.673
news 33263326 34883488 0.9310.931 0.9840.984 0.8900.890 0.5660.566
poetry 35613561 33833383 0.9370.937 0.9790.979 0.9320.932 0.4880.488
question 19321932 58945894 0.9580.958 0.9910.991 0.9510.951 0.7290.729
review 26782678 40194019 0.9600.960 0.9900.990 0.9600.960 0.6380.638
short_form 450450 30003000 0.9340.934 0.9800.980 0.9420.942 0.5560.556
story 29782978 37683768 0.9530.953 0.9910.991 0.9670.967 0.5700.570

По длине текста

Слова считает детектор aiw-ru, как и для LightGBM.

Слов в тексте Текстов Accuracy ROC AUC Accuracy LightGBM ROC AUC LightGBM
0–490\text{–}49 14 74214\,742 0.9250.925 0.9800.980 0.8190.819 0.9020.902
50–14950\text{–}149 17 76617\,766 0.9420.942 0.9860.986 0.8490.849 0.9240.924
150–399150\text{–}399 16 32716\,327 0.9630.963 0.9930.993 0.9130.913 0.9680.968
400400 и больше 36863686 0.9620.962 0.9800.980 0.9520.952 0.9700.970

По типу задания генератору

create — текст с нуля; update, delete, expand — модель правила, сокращала или дописывала человеческий текст.

Задание генератору ИИ-текстов Recall Recall LightGBM
create 14 06414\,064 0.9630.963 0.8990.899
delete 59665966 0.9240.924 0.8120.812
expand 48504850 0.9720.972 0.9450.945
update 62246224 0.9630.963 0.9030.903

По моделям-генераторам

Самые частые генераторы в test.

Модель-генератор Текстов в test Recall Recall LightGBM
gpt-3.5 47724772 0.9770.977 0.9290.929
gpt-4o 38843884 0.9830.983 0.9080.908
databricks/dbrx-instruct 15131513 0.9270.927 0.8590.859
google/gemma-2-27b-it 14981498 0.9770.977 0.8880.888
01-ai/Yi-1.5-34B-Chat 14721472 0.9520.952 0.8980.898
yandex/YandexGPT-5-Lite-8B-instruct 14691469 0.9320.932 0.8530.853
CohereForAI/c4ai-command-r-08-2024 14611461 0.9900.990 0.9510.951
unsloth/Llama-3.3-70B-Instruct 14521452 0.9640.964 0.9150.915
Qwen/Qwen2.5-72B-Instruct 14491449 0.9590.959 0.8870.887
mistralai/Ministral-8B-Instruct-2410 13961396 0.9030.903 0.8290.829
Qwen/QwQ-32B 13861386 0.9740.974 0.8850.885
GigaChat-Max 12661266 0.9580.958 0.9310.931
gigachat 11811181 0.9360.936 0.8310.831
deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 942942 0.9600.960 0.8690.869
WizardLM-2-7B 891891 0.9800.980 0.9260.926

Длинные тексты

Тексты длиннее 512512 токенов, в test их 54985498. Сравниваются вероятность по началу текста и среднее по окнам:

Правило ROC AUC valid Accuracy valid ROC AUC test Accuracy test
начало текста 0.9810.981 0.9650.965 0.9800.980 0.9570.957
среднее по окнам 0.9760.976 0.9630.963 0.9730.973 0.9590.959

Нормализация

В LLMTrace оформление говорит о том, откуда взят человеческий текст: переводы строк, markdown, вид тире и кавычек, ё. Поэтому до токенизации текст проходит нормализацию: разметка и типографика сводятся к простому виду, правила лежат в inference.json. В пилоте база cointegrated/rubert-tiny2 без нормализации дала ROC AUC 0.9600.960 на valid, с нормализацией 0.9570.957. Нормализация всё равно остаётся: модель, выучившая оформление корпуса, ошибётся на человеческом тексте, набранном в другом редакторе или скопированном из чата.

Скорость и размер

Задержка на один текст в миллисекундах, медиана 3030 прогонов, Apple M1, 8 ядер:

Среда 128 токенов, потоков: 1 128 токенов, потоков: 8 512 токенов, потоков: 1 512 токенов, потоков: 8
onnxruntime fp32 9.69.6 4.54.5 57.757.7 26.926.9
onnxruntime int8 5.15.1 2.82.8 39.839.8 22.722.7
torch fp32 3.03.0 3.53.5 19.319.3 10.110.1

На двух ядрах виртуальной машины Colab, это ближе к слабому ноутбуку на x86, Intel(R) Xeon(R) CPU @ 2.00GHz, 2 ядра:

Среда 128 токенов, потоков: 1 128 токенов, потоков: 2 512 токенов, потоков: 1 512 токенов, потоков: 2
onnxruntime fp32 21.521.5 12.012.0 111.2111.2 95.895.8
onnxruntime int8 17.617.6 10.010.0 101.1101.1 87.487.4
torch fp32 12.812.8 12.612.6 70.770.7 48.948.9

Размер зависимостей вывода после установки через uv для Python 3.12:

Зависимости вывода Платформа МБ на диске
onnxruntime + tokenizers aarch64-apple-darwin 127127
onnxruntime + tokenizers x86_64-manylinux_2_28 156156
onnxruntime + tokenizers x86_64-pc-windows-msvc 112112
torch + transformers aarch64-apple-darwin 669669
torch + transformers x86_64-manylinux_2_28 56495649
torch (CPU) + transformers x86_64-manylinux_2_28 908908
torch + transformers x86_64-pc-windows-msvc 642642

Размер считается вместе со всеми зависимостями, в том числе numpy и huggingface-hub, которые aiw-ru с extra ml и так ставит для LightGBM.

На этой машине torch считает быстрее onnxruntime: 19.319.3 мс против 39.839.8 мс у ONNX int8 на 512512 токенах в один поток. Но torch с transformers занимает на диске в 5.3–5.85.3\text{–}5.8 раза больше, а на Linux со сборкой torch под CUDA по умолчанию — 56495649 МБ. aiw-ru ставят и на слабые ноутбуки, поэтому в поставке ONNX: установка лёгкая, а ROC AUC на test совпадает с PyTorch до четвёртого знака.

Как пользоваться

Из командной строки:

uv tool install "aiw-ru[ml]"
aiw-ru models install transformer
aiw-ru classify --model transformer текст.md

Из Python без aiw-ru нужны только onnxruntime, tokenizers и numpy:

import json
import os
import re

# Без этой строки onnxruntime 1.30 при импорте включает телеметрию Microsoft,
# и процесс изредка падает на выходе (recursive_mutex lock failed, код 134).
os.environ.setdefault("ORT_DISABLE_TELEMETRY", "1")

import numpy as np
import onnxruntime as ort
from huggingface_hub import snapshot_download
from tokenizers import Tokenizer

files = ["inference.json", "model.onnx*", "tokenizer.json"]
path = snapshot_download("toiletsandpaper/russian-ai-text-detector-bert", allow_patterns=files)
spec = json.load(open(f"{path}/inference.json", encoding="utf-8"))
session = ort.InferenceSession(f"{path}/{spec['file']}", providers=["CPUExecutionProvider"])
tokenizer = Tokenizer.from_file(f"{path}/{spec['tokenizer']}")
tokenizer.no_truncation()
tokenizer.no_padding()


def probability(text: str) -> float:
    """Вероятность, что текст написала языковая модель."""
    text = text[: spec["max_chars"]]
    for rule in spec["normalize"]:
        text = re.sub(rule["pattern"], rule["replacement"], text, flags=re.MULTILINE)
    ids = tokenizer.encode(text.strip(), add_special_tokens=False).ids
    prefix, suffix = [spec["cls_id"]], [spec["sep_id"]]
    width = spec.get("read_length", spec["max_length"]) - len(prefix) - len(suffix)
    windows = [ids[i : i + width] for i in range(0, max(len(ids), 1), width)][: spec["max_windows"]]
    windows = [[*prefix, *w, *suffix] for w in windows]
    batch = np.full((len(windows), max(map(len, windows))), spec["pad_id"], dtype=np.int64)
    mask = np.zeros_like(batch)
    for k, w in enumerate(windows):
        batch[k, : len(w)] = w
        mask[k, : len(w)] = 1
    logits = session.run([spec["output"]], {"input_ids": batch, "attention_mask": mask})[0]
    p = np.exp(logits - logits.max(axis=1, keepdims=True))
    return float((p[:, spec["labels"].index("ai")] / p.sum(axis=1)).mean())


print(probability(open("текст.md", encoding="utf-8").read()))

inference.json описывает вывод целиком: файл ONNX, токенизатор, max_length, токены вокруг окна, правила нормализации из обучения, порог 0.50.5 и число окон для длинных текстов.

Для дообучения и своего экспорта в репозитории есть веса PyTorch, model.safetensors. aiw-ru и пример выше их не скачивают. Их читает transformers:

from transformers import AutoModelForSequenceClassification, AutoTokenizer

model = AutoModelForSequenceClassification.from_pretrained("toiletsandpaper/russian-ai-text-detector-bert")
tokenizer = AutoTokenizer.from_pretrained("toiletsandpaper/russian-ai-text-detector-bert")

Текст перед токенизатором нормализуй по правилам normalize из inference.json, как в примере выше: на нём модель и обучалась.

Обучение

Параметр Значение
База cointegrated/rubert-tiny2, ревизия e8ed3b0c8bbf
Параметров 29.229.2 млн
Устройство Tesla T4, cuda
Точность fp16, GPU без bf16 (T4): fp16 с масштабированием потерь (GradScaler)
Эпох не больше 33, лучшая проверка на эпохе 2.002.00
Ранняя остановка после 33 проверок без роста ROC AUC на valid, сработала
Проверок на valid за эпоху 44
Оптимизатор AdamW, скорость 0.0001, разогрев 6.0%6.0\% шагов, линейный спад
Затухание весов, клиппинг градиента 0.01, 1
Пачка 3232 текста близкой длины
max_length 512512 токенов
seed 11
Время обучения 3232 мин, 338338 текстов в секунду
Файл модели model.onnx, веса int8, 29.729.7 МБ
Обучено 2026-09-25, коммит 60cb897+правки

Ограничения

  • Корпус один. На научных статьях, дипломах и диссертациях модель не проверялась, а жанры за пределами таблицы по жанрам она не видела.
  • Вероятность — не доказательство авторства. Не используйте модель для решений о людях: на test она принимает за ИИ 7.2%7.2\% человеческих текстов.
  • Правку человеческого текста моделью распознать труднее, чем текст с нуля, см. таблицу по типу задания.
  • Нормализация убирает оформление, но не длину: короткие тексты модель различает хуже, см. таблицу по длине.
  • В корпусе генераторы до 2025 года; тексты новых моделей могут распознаваться хуже.

Лицензия и данные

Модель распространяется по лицензии MIT, как и cointegrated/rubert-tiny2. Корпус LLMTrace — Apache 2.0, человеческие тексты в нём собраны из сторонних источников со своими лицензиями.

@misc{tolstykh2025llmtrace,
  title = {LLMTrace: A Corpus for Classification and Fine-Grained Localization of AI-Written Text},
  author = {Tolstykh, Irina and Tsybina, Aleksandra and Yakubson, Sergey and Kuprashevich, Maksim},
  year = {2025},
  eprint = {2509.21269},
  archivePrefix = {arXiv},
}

cointegrated/rubert-tiny2 описан в посте автора на Хабре.

Downloads last month
57
Safetensors
Model size
29.2M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for toiletsandpaper/russian-ai-text-detector-bert

Finetuned
(86)
this model

Dataset used to train toiletsandpaper/russian-ai-text-detector-bert

Collection including toiletsandpaper/russian-ai-text-detector-bert

Paper for toiletsandpaper/russian-ai-text-detector-bert

Evaluation results