3,583 papers
arXiv:2610.05308 87 4 окт. 2026 г. FREE

RubricArmor: чек-лист оценки, который проверяют заведомо плохим ответом, прошедшим по нему

КЛЮЧЕВАЯ СУТЬ
Проблема: чек-лист, который LLM написала с первого раза, дырявый. Он ловит «назван Париж» и пропускает «Париж в Азии». Метод RubricArmor позволяет собрать чек-лист оценки ответов (рубрику), который уже прошёл проверку на взлом. Фишка: не проси модель критиковать свой список, заставь её написать плохой ответ, который этот список пропустит. Нашла дыру — критерий дописывают. Круг повторяется, пока контрпример не перестанет проходить, и остаётся список без известных лазеек.
Адаптировать под запрос

TL;DR

RubricArmor — это способ составить рубрику (список критериев, по которым судят ответ) через цикл «атака → починка». Модель не просто пишет критерии. Она сама пытается написать плохой ответ, который эти критерии пропустят. Если получилось, критерии дописывают, и круг повторяется, пока взломать список не удаётся.

Главная проблема в том, что рубрика, которую LLM написала «с первого раза», дырявая. Она проверяет очевидное («назван Париж») и пропускает остальное (Париж «в Азии»). Или формулирует критерий так расплывчато, что проходит неверный ответ. Просить модель «найди слабые места в своём списке» тоже мало. Она придумывает дефекты, которых на деле нет, и начинает штрафовать нормальные ответы. Работает только конкретный контрпример: готовый плохой текст, который прошёл все пункты.

Суть метода в нескольких ролях и повторах. Атакующий пишет ответ с одним скрытым дефектом. Проверяющий убеждается, что ответ набирает полный балл. Независимый судья подтверждает, что дефект реальный и портит ответ. Ремонтник правит рубрику, проверяющий убеждается, что плохой ответ теперь проваливается, а ревьюер следит, чтобы старые критерии не сломались. Останавливаются после 7 раундов или после 3 раундов подряд без правок.

🔬

Схема метода

ШАГ 0: Составитель → черновая рубрика из запроса (Direct)

ЦИКЛ (до T=7 раундов; стоп, если P=3 раунда подряд без правок):

  АТАКА
  ШАГ 1: Атакующий → плохой ответ с ОДНИМ скрытым дефектом,
         который проходит текущую рубрику (смотрит в память H)
  ШАГ 2: Проверяющий → оценивает ответ по рубрике. Не 100% → атака провалена
  ШАГ 3: Независимый судья → дефект реально есть и реально портит ответ?
         Нет → атака не засчитана

  РЕМОНТ
  ШАГ 4: Ремонтник → правит/добавляет критерии, не ломая старые
         (критерии атомарные, самодостаточные, непересекающиеся)
  ШАГ 5: Проверяющий → плохой ответ теперь теряет хотя бы один пункт?
  ШАГ 6: Ревьюер → дефект покрыт, хорошие критерии целы?
         Да → правка принята

ПАМЯТЬ H: все прошлые атаки, исходы и принятые правки
ВЫХОД: последняя принятая рубрика

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


🚀

Пример применения

Задача: Вы руководитель поддержки маркетплейса и внедряете ИИ-бота, который отвечает про возвраты. Нужен чек-лист приёмки ответов бота, чтобы LLM-судья проверял сотни ответов в неделю. Простой чек-лист от ChatGPT вроде «упомянут срок возврата» пропустит ответ, где срок верный, а условия выдуманы.

Промпт:

Ты проведёшь адверсарную доработку рубрики для проверки ответов бота поддержки.

ЗАПРОС КЛИЕНТА: «Хочу вернуть кроссовки, купил 10 дней назад, коробку выбросил. Как это сделать и сколько ждать деньги?»

ФАКТЫ ПОЛИТИКИ: возврат обуви надлежащего качества — в течение 14 дней; сохранены товарный вид и ярлыки (коробка не обязательна); возврат через пункт выдачи или курьера бесплатно; деньги возвращаются в течение 3–10 рабочих дней на способ оплаты.

Сначала составь черновую рубрику (5–7 критериев). Затем сделай до 5 раундов:
1. АТАКА: напиши ответ бота, который проходит ВСЕ текущие критерии, но содержит ОДИН реальный дефект, серьёзно портящий ответ. Назови дефект.
2. ПРОВЕРКА: пройди по критериям и честно покажи, что ответ получает полный балл. Если не получает — атака не засчитана.
3. СУД: как независимый судья оцени, что дефект действительно есть и серьёзно вредит клиенту. Если нет — атака не засчитана.
4. РЕМОНТ: поправь рубрику, чтобы дефект ловился. Критерии должны быть атомарными (одна проверка), самодостаточными (все факты и числа внутри критерия), непересекающимися. Не удаляй и не ослабляй удачные старые критерии.
5. ПЕРЕПРОВЕРКА: покажи, что плохой ответ теперь теряет хотя бы один пункт, и что прошлые плохие ответы тоже ловятся.
Веди «память»: список прошлых атак и принятых правок. Остановись, если 2 раунда подряд атаки не удались. В конце выдай финальную рубрику.

Результат: Модель покажет черновую рубрику, затем по раундам: плохой ответ (например, с верным сроком, но придуманным требованием), оценку по критериям, вердикт судьи, правку рубрики. В конце придёт финальный список критериев, куда вошли проверки, которых не было в черновике: условия возврата, бесплатность, срок выплаты. Список можно вставить в промпт LLM-судьи.


🧠

Почему это работает

Слабость: когда LLM пишет критерии «по запросу», она описывает идеальный ответ со стороны и не проверяет, как его можно обойти. Получаются критерии, которые проходят и хорошие, и плохие тексты. Ещё хуже, если попросить модель «покритиковать» свой список. Она описывает дефекты абстрактно и может выдумать несуществующие. Правки тогда бьют по нормальным ответам.

Сильная сторона: LLM хорошо пишет конкретный текст по заданным ограничениям («верно в пунктах А, Б, но неверно в В»). Она также неплохо проверяет текст по пунктам и подтверждает «да, это ошибка».

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

Рычаги управления: - Число раундов (T) → меньше для простых задач, больше для сложных. Выигрыш в статье растёт с раундами, но число критериев тоже растёт. - Терпение (P) → сколько неудачных атак подряд считать концом. - Независимый судья → убери его, и атаки станут «выдуманными дефектами». Лучше другой чат или другая модель. - Свойства критериев (атомарность, самодостаточность, непересечение) → можно заменить своими требованиями. - Память → без неё ремонтник «чинит одно, ломает другое».


📋

Шаблон промпта


Ты ведёшь адверсарную доработку рубрики (списка критериев оценки ответа).
Роли: Составитель, Атакующий, Проверяющий, Независимый_судья, Ремонтник, Ревьюер.



Запрос: {запрос_или_тип_задачи}
Факты и требования: {факты_политика_стандарты}
T = {макс_раундов}
P = {терпение_раундов_без_правок}



R = Составитель.build_rubric(Запрос)   # черновик, {число_критериев} критериев
H = []                                  # память: атаки, исходы, принятые правки
u = 0



for t in 1..T:
    # АТАКА
    (y, defect) = Атакующий.attack(Запрос, R, H)
        # Напиши ответ, который проходит ВСЕ критерии R, но содержит ОДИН
        # реальный дефект, серьёзно снижающий качество. Назови дефект.
    full = Проверяющий.grade(y, R)          # прошёл ли по всем критериям?
    real = Независимый_судья.confirm(y, defect, Запрос)
        # дефект действительно есть в y и действительно портит ответ?

    R_new = R
    if full == True and real == True:
        # РЕМОНТ
        R_new = Ремонтник.repair(R, y, defect, H)
            # Критерии: атомарные, самодостаточные (все факты/числа внутри),
            # непересекающиеся. Не ломать удачные старые критерии.
        ok_score = Проверяющий.grade(y, R_new) < полный_балл
        ok_review = Ревьюер.review(R_new, defect, R)
            # дефект покрыт? старые валидные критерии и три свойства целы?
        if not (ok_score and ok_review):
            R_new = R                        # правка отклонена

    H.append(y, defect, исход, принятая_правка)
    u = 0 if R_new != R else u + 1
    R = R_new
    if u >= P: break



Верни финальную R и краткий журнал: какие атаки удались и какие критерии добавлены.
Показывай ход каждого раунда: y, defect, оценка, вердикт, правка.

Что подставлять: {запрос_или_тип_задачи} — запрос или класс задач (ответ бота, текст КП, ревью кода). {факты_политика_стандарты} — внутренние правила и числа, чтобы критерии были самодостаточными. {макс_раундов} — 3–7. {терпение_раундов_без_правок} — 2–3.

🚀 Быстрый старт — вставь в чат:

Вот шаблон RubricArmor. Адаптируй под мою задачу: [опиши, ответы какого типа
нужно оценивать и для чего]. Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

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


⚠️

Ограничения

⚠️ Исходная цель — обучение: авторы строят рубрики для обучения с подкреплением (RL). Вы можете взять рубрики для LLM-судьи, но в статье это не проверялось на бизнес-задачах напрямую.

⚠️ Проверка на парах: качество рубрики мерили тем, выбирает ли она лучший из двух ответов. Это хороший, но косвенный показатель.

⚠️ Дорого по токенам и времени: до 7 раундов и 5–6 вызовов на раунд. Для разовой простой проверки это избыточно.

⚠️ Одна модель во всех ролях: атакующий и судья одной модели имеют общие слепые зоны. Если судья ошибается вместе с атакующим, фиктивный дефект попадёт в рубрику.

⚠️ Субъективное и стиль: сильнее всего прирост на проверяемых задачах (математика, знания, рассуждения, код). На «чатовых» и стилевых запросах выигрыш скромнее, а обученные генераторы там конкурентны.

⚠️ Рост рубрики: с раундами критериев становится больше. Все равны по весу, поэтому раздутая рубрика может размыть важное.


🔍

Как исследовали

Команда взяла девять тестовых наборов из трёх бенчмарков (JudgeBench, RM-Bench, RewardBench) по знаниям, рассуждениям, математике, коду, чату и безопасности. В каждом примере есть запрос, хороший и плохой ответ. Рубрика считалась качественной, если по ней хороший ответ набирал больше баллов. Сравнивали с «прямой» генерацией (Direct), четырьмя известными методами улучшения списков (TICK, RocketEval, ChasingTail, RRD-Uniform) и тремя дообученными генераторами рубрик на 8B. Оценщиком везде был GPT-4.1-mini, а базовой моделью, генерирующей рубрики, — Gemini-3.1-Flash-Lite.

Результат: RubricArmor — 77,09 в среднем против 70,11 у Direct и 73,97 у сильнейшего конкурента. Он лучше Direct на всех девяти наборах. Дообученные генераторы оказались слабее Direct в среднем (64–68), поскольку привязаны к своим доменам. Интереснее всего абляции. Если атакующий лишь описывает дефекты без написания ответа, это 71,69. Если пишет ответ без умышленного дефекта и без подтверждения судьёй, это 72,80. Полный метод даёт 77,09, больше суммы двух вкладов. Идея в том, что цель «ищи дефект» определяет что искать, а конкретный ответ делает дефект проверяемым.

Метод проверили на пяти моделях (Gemini, GPT-4.1, DeepSeek, Qwen, GLM) и три набора. На всех он улучшил Direct, в том числе у слабых и сильных моделей. Например, у Gemini на JudgeBench точность выросла с 62,10 до 73,63 (+18,6% отн.).


💡

Адаптации и экстраполяции

🔧 Техника: один раунд вместо цикла → дешевле. Оставь шаги «Атакующий → Судья → Ремонтник» один раз и убери память H. Для быстрых проверок хватает. Выигрыш будет меньше, чем в статье, но это не проверялось.

🔧 Техника: независимый судья → в отдельном чате. Вынеси Независимый_судья в новый чат или другую модель, передай только запрос, ответ и заявленный дефект. Это снижает шанс, что атакующий «уговорит» судью.

Экстраполяция: критерии приёмки в файл инструкций агента (CLAUDE.md, AGENTS.md). Эту идею нет в статье, это перенос принципа:

Перед тем как вернуть результат, составь критерии приёмки к задаче «{задача}».
Затем попробуй написать результат, который формально проходит все критерии,
но на деле плохой (одна реальная проблема). Если получилось — дополни критерии
и повтори. В конце проверь свой результат по финальным критериям.

🔗

Ресурсы

  • RubricArmor: Adversarial Evolution Improves LLM-Based Rubric Generation
  • Авторы: Haocheng Yang (NUS), Yuchao Zhang, Licheng Pan, Jiajun Fan, Maolin Wang, Kangning Zhang, Shuai Shao, Shijian Wang, Yuan Lu, Chunyuan Zheng, Hao Wang (MBZUAI) и др.
  • Код: https://github.com/yhc-666/RubricArmor.git
  • Упомянутые бенчмарки: JudgeBench, RM-Bench, RewardBench. Методы-конкуренты: TICK, RocketEval, ChasingTail, RRD-Uniform

📋 Дайджест исследования

Ключевая суть

Проблема: чек-лист, который LLM написала с первого раза, дырявый. Он ловит «назван Париж» и пропускает «Париж в Азии». Метод RubricArmor позволяет собрать чек-лист оценки ответов (рубрику), который уже прошёл проверку на взлом. Фишка: не проси модель критиковать свой список, заставь её написать плохой ответ, который этот список пропустит. Нашла дыру — критерий дописывают. Круг повторяется, пока контрпример не перестанет проходить, и остаётся список без известных лазеек.

Принцип работы

Работает как цикл из ролей. Каждая роль делает одну узкую работу. 1. Атакующий пишет ответ с ОДНИМ скрытым дефектом. Ответ должен набрать полный балл по текущим критериям. 2. Проверяющий считает баллы. Не 100% — атака провалена. 3. Независимый судья подтверждает: дефект реальный и портит ответ. Нет — атака не засчитана. 4. Ремонтник правит критерии. Проверяющий убеждается: плохой ответ теперь теряет балл. 5. Ревизор следит, чтобы старые хорошие критерии не сломались. Критерий появляется только тогда, когда есть живой плохой ответ, который прошёл мимо. Это как краш-тест: машину не обсуждают, её сначала бьют об стену. Останов — 7 раундов или 3 раунда подряд без правок. Ещё нужна память обо всех прошлых атаках, иначе ремонтник чинит одно и ломает другое.

Почему работает

Когда LLM пишет критерии «по запросу», она описывает идеальный ответ со стороны. Обходные пути она не проверяет. Если попросить её «найти слабые места», она придумывает дефекты, которых нет. Потом начинает штрафовать нормальные ответы. Но конкретный текст по ограничениям («верно в пунктах А и Б, неверно в В») LLM пишет хорошо. Чужой текст по пунктам она тоже проверяет неплохо. Готовый плохой ответ, прошедший чек-лист, — это доказательство дыры, а не мнение. Его можно перепроверить и по нему можно чинить точно. В абляции (отключении частей метода) каждая половина дала мало. Критика без конкретного ответа дала чуть-чуть. Ответ без умышленного дефекта тоже. Вместе они дали заметно больше суммы частей. Уберёшь независимого судью — атаки превратятся в выдуманные дефекты.

Когда применять

Оценка ответов LLM → особенно когда чек-лист скармливают LLM-судье на сотнях ответов и пропуск плохого ответа стоит дорого. Примеры: бот поддержки с политикой возвратов, коммерческие предложения, ревью кода, фактологические ответы. Лучше всего там, где есть проверяемые факты и числа. НЕ подходит для разовой простой проверки: до 7 раундов и 5–6 вызовов на раунд — это дорого. Для стиля и «чатовых» запросов выигрыш скромнее. В статье метод строили для обучения с подкреплением, на бизнес-задачах его напрямую не проверяли.

Мини-рецепт

1. Собери факты: выпиши правила, сроки и числа, которые считаются истиной. Без них критерии получатся расплывчатыми.
2. Сделай черновик: пусть модель составит 5–7 критериев по запросу.
3. Разнеси роли: лучше по разным чатам или моделям. Если всё в одном промпте, у судьи и атакующего общие слепые зоны.
4. Запусти атаку: <роль>Атакующий пишет ответ с одним реальным дефектом, который проходит все критерии. Дефект он называет сам.
5. Отсей выдумки: судья подтверждает дефект. Не подтвердил — правки нет.
6. Почини: каждый критерий — одна проверка, все числа внутри, пересечений нет. Старые удачные критерии не трогай.
7. Перепроверь: плохой ответ теряет хотя бы один пункт, прошлые плохие ответы всё ещё ловятся.
8. Остановись: 3–7 раундов, терпение 2–3 раунда. Не гони дальше: критериев станет слишком много, а все они равны по весу и размывают важное.
9. Забери результат: финальную рубрику вставь в промпт LLM-судьи.

Примеры

[ПЛОХО] : Составь чек-лист для проверки ответов бота поддержки про возврат товара (Получишь «упомянут срок возврата». Ответ с верным сроком и выдуманными условиями пройдёт.)
[ХОРОШО] : Проведи доработку чек-листа через атаку. Запрос клиента: «Купил кроссовки 10 дней назад, коробку выбросил. Как вернуть и когда придут деньги?» Факты: возврат за 14 дней, коробка не обязательна, возврат бесплатный, деньги приходят за 3–10 рабочих дней. Составь черновик из 5–7 критериев. Потом до 5 раундов: 1) напиши ответ бота, который проходит ВСЕ критерии, но содержит один реальный дефект, назови его; 2) покажи, что он получает полный балл; 3) как независимый судья подтверди, что дефект реальный; 4) поправь критерии: одна проверка в каждом, все числа внутри, без пересечений; 5) покажи, что плохой ответ теперь теряет балл. Веди список прошлых атак. Остановись, если 2 раунда подряд атаки не удались. В конце выдай финальный чек-лист. (В итоге появятся критерии, которых не было в черновике: условия возврата, бесплатность, срок выплаты.)
Источник: RubricArmor: Adversarial Evolution Improves LLM-Based Rubric Generation
ArXiv ID: 2610.05308 | Сгенерировано: 2026-10-06 06:00

Проблемы LLM

ПроблемаСутьКак обойти
Чек-лист, написанный моделью с первого раза, пропускает плохие ответыПросишь модель составить критерии оценки ответа. Она описывает идеальный ответ со стороны. Не проверяет, как критерии можно обойти. Критерии получаются общие: «назван срок», «упомянут город». Ответ с верным сроком и выдуманными условиями проходит. Проверяющий модель-судья даёт полный балл плохому тексту. Проблема для любых чек-листов: оценка ответов, приёмка текстов, ревью кодаНе доверяй черновику. Проверь его атакой: пусть модель напишет плохой ответ, который проходит все пункты. Если получилось, в списке дыра. Допиши критерий и повтори
Просьба «найди слабые места в своём списке» даёт выдуманные дефектыПросишь модель покритиковать свои критерии. Она пишет абстрактные замечания. Часть из них выдумана. Правки по таким замечаниям начинают штрафовать нормальные ответы. Список становится хуже, а не лучшеНе проси мнение. Проси готовый артефакт: конкретный плохой текст с одним названным дефектом, который проходит текущие критерии. Затем пусть второй проверяющий подтвердит, что дефект реальный

Методы

МетодСуть
Атака контрпримером — починка чек-листа по реальной дыреЦикл из шести шагов. 1) Составь черновик критериев. 2) Атака: пусть модель напишет ответ с ОДНИМ скрытым дефектом, который проходит все критерии. 3) Проверка: пройди по критериям. Не полный балл — атака провалена. 4) Суд: независимый судья подтверждает, что дефект есть и портит ответ. Нет — атака не засчитана. 5) Ремонт: поправь или добавь критерий. Требования: атомарный (одна проверка), самодостаточный (все факты и числа внутри), без пересечений. Старые удачные критерии не ослабляй. 6) Перепроверка: плохой ответ теперь теряет балл? Прошлые плохие ответы тоже ловятся? Остановись, когда 2–3 раунда подряд атаки не удаются, или после 5–7 раундов. Почему работает: модель хорошо пишет конкретный текст по ограничениям («верно в А и Б, неверно в В»). Хорошо проверяет текст по пунктам. Готовый плохой ответ — доказательство дыры. Его можно перепроверить и по нему можно точно чинить. Один дефект за раунд делает правку точечной. Когда да: чек-лист для LLM-судьи, который проверит сотни ответов. Есть факты и правила, которые считаются истиной. Задачи с проверяемой правильностью: знания, расчёты, код, политика компании. Когда нет: разовая простая проверка (дорого: 5–6 вызовов на раунд). Стиль и вкус: дефект трудно доказать. Нет фактов под рукой: критерии выйдут расплывчатыми

Тезисы

ТезисКомментарий
Тот, кто нашёл дефект, не должен сам его подтверждатьЕсли атакующий и судья — один чат или одна модель, у них общие слепые зоны. Судья соглашается с выдуманным дефектом, и он попадает в критерии. Отдельный судья отсекает фиктивные атаки. Применяй: подтверждение дефекта делай в новом чате или другой моделью. Давай судье только запрос, ответ и названный дефект
📖 Простыми словами

RubricArmor: Adversarial Evolution ImprovesLLM-Based Rubric Generation

arXiv: 2610.05308

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

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

Механика простая: цикл «атака → починка». Сначала идёт черновик критериев, затем модель генерирует паршивый ответ и скармливает его судье. Если судья пропустил откровенную дичь, правила переписывают, закрывая лазейку, и так по кругу. В поддержке маркетплейса пункт «указать срок возврата» — это дыра: бот назовёт верные 14 дней, но соврёт про платный возврат. Метод ловит такой обман на тесте и вбивает в рубрику жёсткое требование проверки условий.

Исследовали метод на ботах поддержки, но подход универсален для любой системы LLM-as-a-Judge. Модерация токсичности, юридическая вычитка договоров, оценка кода или проверка студенческих работ — везде стандартные промпты дают сбой. Если ты выпускаешь ИИ-судью без стресс-теста на излом, ты пропускаешь галлюцинации в красивой обёртке, считая, что система работает идеально.

Хватит просить нейросеть «написать хороший чек-лист» — заставь её ломать собственные правила. Без состязательного цикла любая сгенерированная рубрика остаётся дырявым решетом. Автоматизируешь контроль качества с помощью LLM — внедряй эволюционный отбор критериев, иначе твои пользователи первыми найдут, как развести бота на деньги.

Работа с исследованием

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

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с