← Блог

Как тестировать LLM модели для написания текстов?

Сережа Рис · 30 June 2026

эвалыкритикиclaude-codeвайбкодинг

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

«Какая модель пишет лучше» это вкусовщина

Каждый месяц выходит новая модель. Все спорят, кто пишет живее: одни хвалят Opus, другие новый GPT, третьи Gemini. Аргументы у всех на уровне ощущений. Я и сам так делал: прочитал пару абзацев, вроде норм, оставил. Через неделю выходила следующая модель, и круг повторялся.

Можно было бы посадить LLM-судью и просто спросить «какой текст лучше». Но судья сам по себе ненадёжен. Исследования биасов LLM-судей показывают: вердикт плывёт даже при нулевой температуре, а если поменять два ответа местами, оценка переворачивается в 25-50% случаев. Судьи любят текст подлиннее и свои собственные формулировки. Получается зеркало, которое говорит то, что ты хочешь услышать.

Эвал для текста: переносим методику с кода на прозу

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

Грейдеры бывают двух видов. Детерминированный это обычный код, который что-то считает и выдаёт балл. Модельный это LLM, которая читает текст и оценивает. Правило выбора между ними короткое: опишешь «правильно» питоновским assert, бери код; опишешь «хорошо» только словами, бери LLM. Поэтому у меня работают оба, на разных слоях.

Что считает детерминированный грейдер

Попросил Claude Code собрать мне грейдер блог-постов. Один скрипт, который читает markdown и штрафует за машинные следы.

Собери питоновский грейдер для моих блог-постов. На вход markdown-файл. Считай вне блоков кода: длинные тире, шаблонную антитезу, клише-зачины из стоп-листа. Каждое нарушение снижает балл от 10. Посчитай слова тела статьи и проверь, что попадают в коридор 800-1200. Если есть хоть одно длинное тире, ставь стилю FAIL. Верни код выхода 0 при PASS и 1 при FAIL, чтобы повесить на pre-commit.

Агент написал скрипт. Старт 10 баллов, дальше вычитания за каждое нарушение, ниже нуля не падает. Гейт публикации тройной: ноль длинных тире, балл не ниже 8, слова в коридоре. Не сошлось хоть одно из трёх: черновик дальше не идёт.

Признаки я выбрал не наугад. Длинное тире после 2022 года стало заметным маркером AI-текста: модели сыплют им щедро. Монотонный ритм, когда все предложения по 18-24 слова, детекторы ловят как первый признак машины. Это мой скилл деаификации и чинит.

Черновик
   │
   ▼
5 критиков (LLM, параллельно)     чинят: ритм, конкретику, факты, персону
   │
   ▼
grade.py (код)                    гейт: тире, антитеза, клише, длина -> балл/10
   │  FAIL ──┐
   │         └─► флаги обратно критикам -> re-grade
   ▼ PASS
LLM-Judge (по rubric)             судит: голос, факты, AEO, структуру
   │
   ▼
Публикация

Зачем тогда критики и судья

Детерминированный грейдер ловит механику. По разным оценкам, код-проверки перехватывают 30-60% реальных проблем, и стоят они ноль. Но код не видит, выдумал ли я факт, звучит ли текст как живой человек, не съехал ли голос с вайбкодера на инженера. Это умеет только модель.

Поэтому слои идут по очереди. Сначала пять критиков на Haiku параллельно разбирают черновик и предлагают правки. Потом грейдер-код решает, чисто ли механически. И только если механика прошла, текст видит LLM-судья и оценивает субъективное. Дешёвое и точное впереди, дорогое и мутное в конце.

Главное: грейдер выбирает модель

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

Возьми этот бриф и напиши черновик блог-поста по моим правилам стиля. Ничего не объясняй, верни только текст статьи. Дальше я прогоню его через свой грейдер и сравню с черновиком от другой модели.

Так из «по ощущениям Opus живее» получается «Opus 9.0, новая модель 6.5, по этому брифу беру Opus». Именно так устроены и публичные бенчмарки письма: один запрос, разные модели, сравнение с поправкой на позиционный биас. Только мне их бенчмарк не нужен. Мой грейдер заточен под мой блог и меряет то, что важно мне, а средней статье в интернете без разницы.

Это ложится на то, как я держу стек моделей. Полезность агента задаёт инфраструктура вокруг модели, и грейдер как раз её часть. Модели у меня как набор ножей на кухне: Opus на сложное, Haiku на дешёвое. Грейдер говорит, какой нож острее именно для письма.

Этот пост прошёл через грейдер

Раз уж пишу про грейдер, этот пост сам прошёл через него перед публикацией. Вот что грейдер вернул:

СЛОВ: 849  (коридор 800–1200: OK)
em-dash (—): 0
en-dash (–): 0
АНТИТЕЗА: 0 попадание(й)
КЛИШЕ/СЛОП: 0 попадание(й)
МЕХАНИЧЕСКИЙ СЧЁТ: 10.0 / 10
STYLE: PASS
ПУБЛИКАЦИЯ (механика): ДА

Ловушка: не пиши ради грейдера

У подхода есть обратная сторона, и про неё предупреждает закон Гудхарта: когда метрика становится целью, она перестаёт быть хорошей метрикой. Начнёшь писать ради высокого балла, и текст научится обманывать грейдер: уберёт тире, но останется пустым. Это видно и на больших экспериментах. Модель, заточенную под rubric, судьи по тому же rubric хвалили в 85% случаев, а целостная оценка заваливала в 78%. Балл рос, текст деградировал.

Поэтому я честно отделяю, что грейдер меряет. Длинное тире и монотонный ритм это реальные машинные следы. Запрет на шаблонную антитезу и коридор 800-1200 слов это уже мой вкус и моё SEO, научного основания под ними нет. Грейдер у меня работает фильтром от слопа на выходе. Целью письма он не становится: цель ставит человек.

Что с этим делать

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

Подписаться на обновления — @sereja_tech