Детектор ИИ-текста для русского языка
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 на млн параметров, переведённый в ONNX с весами int8.
Файл model.onnx занимает МБ и работает на CPU через onnxruntime, без
torch и GPU. Рядом лежит model_fp32.onnx на МБ с весами fp32, aiw-ru его не скачивает. Веса PyTorch для дообучения и своего экспорта — model.safetensors на МБ. На отложенной части корпуса ROC AUC , accuracy . У LightGBM на признаках aiw-ru ROC AUC .
Модель необязательная: детектор и скиллы 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 MB and runs on CPU with onnxruntime, no torch
or GPU needed. An fp32 export, model_fp32.onnx, is an optional extra file of MB. PyTorch weights for fine-tuning or your own export are in model.safetensors, MB.
Test ROC AUC , accuracy . 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 |
— | |||||
transformer, эта модель |
||||||
mini-frida |
||||||
lightgbm |
— | — |
modernbert— самая точная: выбор по умолчанию, но тяжелее трансформера и в несколько раз медленнее.transformer(эта модель) — почти так же точна, лёгкая и в несколько раз быстрее ModernBERT: для слабой машины.mini-frida— ROC AUC выше, чем у трансформера, но при пороге 50 % чаще принимает людей за ИИ; в 4 раза тяжелее и в 3 раза медленнее.lightgbm— самая лёгкая, работает и без onnxruntime (Mac на Intel), но заметно менее точна.
Если установлено несколько моделей, aiw-ru берёт вероятность у первой из них в порядке таблицы. Порядок задаёт доля людей, принятых за ИИ, а не ROC AUC: ошибиться в человеке дороже, чем пропустить ИИ-текст.
Задержка — один текст на токенов в один поток на M1 и на двух ядрах Xeon виртуальной машины Colab (x86). Размер у LightGBM — файл модели, признаки для неё считает сам детектор aiw-ru.
Данные
Русская часть LLMTrace classification
(статья), ревизия 252e21e3dca7. Модель обучена на текстах из train, лучший шаг и ранняя остановка — по ROC AUC на текстах из valid.
Итоговые цифры посчитаны по test, это текст: эту часть
корпуса модель при обучении не видела. Отчёт об обучении с выбором базы и командами для
воспроизведения лежит на GitHub.
Результаты на test
Текст считается написанным ИИ, если вероятность не меньше . Текст длиннее токенов модель читает только до этой границы: среднее по окнам на valid не точнее.
| Класс | Precision | Recall | F1 | Текстов |
|---|---|---|---|---|
| люди | ||||
| ИИ | ||||
| accuracy | ||||
| среднее по классам |
Сравнение с LightGBM на признаках aiw-ru и с оценкой правил детектора с порогом на том же test:
| На test | Эта модель | modernbert |
mini-frida |
LightGBM | Правила aiw-ru |
|---|---|---|---|---|---|
| Accuracy | |||||
| ROC AUC | |||||
| ROC AUC, люди против текстов с нуля | |||||
| F1, среднее по классам | |||||
| Людей принято за ИИ |
На valid accuracy , ROC AUC .
По жанрам
| Жанр | Людей | ИИ | Accuracy | ROC AUC | ROC AUC LightGBM | ROC AUC правил |
|---|---|---|---|---|---|---|
article |
||||||
factual |
||||||
news |
||||||
poetry |
||||||
question |
||||||
review |
||||||
short_form |
||||||
story |
По длине текста
Слова считает детектор aiw-ru, как и для LightGBM.
| Слов в тексте | Текстов | Accuracy | ROC AUC | Accuracy LightGBM | ROC AUC LightGBM |
|---|---|---|---|---|---|
| и больше |
По типу задания генератору
create — текст с нуля; update, delete, expand — модель правила,
сокращала или дописывала человеческий текст.
| Задание генератору | ИИ-текстов | Recall | Recall LightGBM |
|---|---|---|---|
create |
|||
delete |
|||
expand |
|||
update |
По моделям-генераторам
Самые частые генераторы в test.
| Модель-генератор | Текстов в test | Recall | Recall LightGBM |
|---|---|---|---|
gpt-3.5 |
|||
gpt-4o |
|||
databricks/dbrx-instruct |
|||
google/gemma-2-27b-it |
|||
01-ai/Yi-1.5-34B-Chat |
|||
yandex/YandexGPT-5-Lite-8B-instruct |
|||
CohereForAI/c4ai-command-r-08-2024 |
|||
unsloth/Llama-3.3-70B-Instruct |
|||
Qwen/Qwen2.5-72B-Instruct |
|||
mistralai/Ministral-8B-Instruct-2410 |
|||
Qwen/QwQ-32B |
|||
GigaChat-Max |
|||
gigachat |
|||
deepseek-ai/DeepSeek-R1-Distill-Qwen-32B |
|||
WizardLM-2-7B |
Длинные тексты
Тексты длиннее токенов, в test их . Сравниваются вероятность по началу текста и среднее по окнам:
| Правило | ROC AUC valid | Accuracy valid | ROC AUC test | Accuracy test |
|---|---|---|---|---|
| начало текста | ||||
| среднее по окнам |
Нормализация
В LLMTrace оформление говорит о том, откуда взят человеческий текст: переводы
строк, markdown, вид тире и кавычек, ё. Поэтому до токенизации текст проходит
нормализацию: разметка и типографика сводятся к простому виду, правила лежат в
inference.json. В пилоте база cointegrated/rubert-tiny2 без нормализации дала ROC AUC на valid, с нормализацией . Нормализация всё равно остаётся: модель, выучившая оформление корпуса, ошибётся на человеческом тексте, набранном в другом редакторе или скопированном из чата.
Скорость и размер
Задержка на один текст в миллисекундах, медиана прогонов, Apple M1, 8 ядер:
| Среда | 128 токенов, потоков: 1 | 128 токенов, потоков: 8 | 512 токенов, потоков: 1 | 512 токенов, потоков: 8 |
|---|---|---|---|---|
| onnxruntime fp32 | ||||
| onnxruntime int8 | ||||
| torch fp32 |
На двух ядрах виртуальной машины Colab, это ближе к слабому ноутбуку на x86, Intel(R) Xeon(R) CPU @ 2.00GHz, 2 ядра:
| Среда | 128 токенов, потоков: 1 | 128 токенов, потоков: 2 | 512 токенов, потоков: 1 | 512 токенов, потоков: 2 |
|---|---|---|---|---|
| onnxruntime fp32 | ||||
| onnxruntime int8 | ||||
| torch fp32 |
Размер зависимостей вывода после установки через uv для Python 3.12:
| Зависимости вывода | Платформа | МБ на диске |
|---|---|---|
| onnxruntime + tokenizers | aarch64-apple-darwin |
|
| onnxruntime + tokenizers | x86_64-manylinux_2_28 |
|
| onnxruntime + tokenizers | x86_64-pc-windows-msvc |
|
| torch + transformers | aarch64-apple-darwin |
|
| torch + transformers | x86_64-manylinux_2_28 |
|
| torch (CPU) + transformers | x86_64-manylinux_2_28 |
|
| torch + transformers | x86_64-pc-windows-msvc |
Размер считается вместе со всеми зависимостями, в том числе numpy и
huggingface-hub, которые aiw-ru с extra ml и так ставит для LightGBM.
На этой машине torch считает быстрее onnxruntime: мс против мс у ONNX int8 на токенах в один поток. Но torch с transformers занимает на диске в раза больше, а на Linux со сборкой torch под CUDA по умолчанию — МБ. 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, токены вокруг окна, правила нормализации из обучения, порог и число окон для длинных текстов.
Для дообучения и своего экспорта в репозитории есть веса 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 |
| Параметров | млн |
| Устройство | Tesla T4, cuda |
| Точность | fp16, GPU без bf16 (T4): fp16 с масштабированием потерь (GradScaler) |
| Эпох | не больше , лучшая проверка на эпохе |
| Ранняя остановка | после проверок без роста ROC AUC на valid, сработала |
| Проверок на valid за эпоху | |
| Оптимизатор | AdamW, скорость 0.0001, разогрев шагов, линейный спад |
| Затухание весов, клиппинг градиента | 0.01, 1 |
| Пачка | текста близкой длины |
max_length |
токенов |
seed |
|
| Время обучения | мин, текстов в секунду |
| Файл модели | model.onnx, веса int8, МБ |
| Обучено | 2026-09-25, коммит 60cb897+правки |
Ограничения
- Корпус один. На научных статьях, дипломах и диссертациях модель не проверялась, а жанры за пределами таблицы по жанрам она не видела.
- Вероятность — не доказательство авторства. Не используйте модель для решений о людях: на test она принимает за ИИ человеческих текстов.
- Правку человеческого текста моделью распознать труднее, чем текст с нуля, см. таблицу по типу задания.
- Нормализация убирает оформление, но не длину: короткие тексты модель различает хуже, см. таблицу по длине.
- В корпусе генераторы до 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
Model tree for toiletsandpaper/russian-ai-text-detector-bert
Base model
cointegrated/rubert-tiny2Dataset 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
- Accuracy on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.945
- ROC AUC on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.987
- Macro F1 on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.943
- Precision (AI) on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.951
- Recall (AI) on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.957
- F1 (AI) on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.954
- Precision (human) on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.937
- Recall (human) on LLMTrace classification (ru)test set aiw-ru scripts/train_transformer.py0.928