3,583 papers
arXiv:2610.17473 71 12 окт. 2026 г. FREE

REA (Resolve–Express–Act): правильный ответ модели пропадает на выходе — как этого не допустить

КЛЮЧЕВАЯ СУТЬ
В одном тесте почти все правильно найденные опасные запросы были пропущены. Модель не ошиблась: она ответила «Этот запрос является опасным, потому что…», а фильтр ждал одно слово «Опасно». Метод REA позволяет найти, где верные ответы модели теряются по дороге к действию, и починить это без смены модели. Фишка: мерь не только точность, а долю верных ответов, которые дошли до программы. Сначала явно пропиши форму ответа в промпте, потом читай его гибким разборщиком. Без указания формата нарушали три ответа из четырёх, с чётким указанием почти никто.
Адаптировать под запрос
⚡

TL;DR

REA — способ посмотреть на путь ответа модели в три остановки: что модель решила → дошло ли решение до программы в нужном виде → какое действие программа выполнила. Автоматизация почти всегда читает ответ модели кодом или фильтром: ищет метку, поле, последнюю строку. Если ответ выглядит не так, как ждёт этот разборщик, верное решение теряется. Точность модели при этом остаётся высокой.

Главная находка: модель часто отвечает правильно, но не в той форме. Ждёшь одно слово «Опасно», а приходит «Этот запрос является опасным, потому что…». Фильтр «ответ равен "Опасно"» не срабатывает, и в дело вступает запасной вариант: «при сбое пропускать» или «при сбое блокировать». В одном тесте из-за такого несовпадения почти все правильно найденные опасные запросы были пропущены. Модель всё поняла верно, программа просто не смогла это прочитать. Причина простая: модель генерирует текст по привычному шаблону, а привычка — отвечать предложением. Строгий формат появляется, только если его явно потребовать.

Что делать: явно прописать форму ответа в промпте, дать модели достаточно места на рассуждение, читать ответ гибким разборщиком (приводить регистр, пробелы, ловить метку в заданном блоке) и заранее решить, что происходит, когда разбор всё же не удался. Мерить стоит не только «насколько модель права», но и «какая доля правильных ответов дошла до действия».

🔬

Схема метода

ШАГ 1 (Resolve): что модель на самом деле решила? → читаем ответ глазами, игнорируя формат
ШАГ 2 (Express): дошло ли решение до разборщика в нужной форме? → доля доставленных среди верных
ШАГ 3 (Act): что сделала система, когда разбор не удался? → «пропустить» или «заблокировать» / на ручную проверку

Две цифры:
  A  = доля верных решений
  κ  = доля верных решений, которые дошли до программы (доставка)
  A × κ = доля ответов, которые верны И сработали

Это порядок проверки, а не один промпт. Делается вручную на 20–50 ответах.

🚀

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

Задача: Вы ведёте магазин на Wildberries и Ozon. Автоматизация в n8n читает входящие сообщения покупателей из Telegram и раскладывает по веткам: «жалоба», «вопрос», «спам». Ветка «жалоба» сразу уведомляет менеджера. Модель определяет тип сообщения. По факту половина жалоб не доходит до менеджера: узел сравнения ждёт ровно слово «жалоба», а модель пишет «Это сообщение является жалобой, так как…».

Промпт:

Ты сортируешь сообщения покупателей интернет-магазина.

Допустимые метки (ровно одна из): жалоба | вопрос | спам

Сообщение покупателя:
«Заказ 3 недели назад, курьер не приехал, деньги не вернули. Верните деньги или напишу в Роспотребнадзор.»

Формат ответа:
1. Сначала напиши одно-два предложения рассуждения.
2. Последней строкой выведи метку строго в таком виде:
метка
После закрывающего тега не пиши ничего.

Результат: Модель выдаст короткое рассуждение и в конце строку с меткой в теге. В n8n достаточно узла, который вытаскивает текст между и , приводит его к нижнему регистру и обрезает пробелы. Такой разбор переживает вариации вроде «Жалоба» или «жалоба ». Если тега нет, сообщение уходит менеджеру на ручную проверку, а не в мусор.

🧠

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

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

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

Как метод это использует. Мы просим решение в узнаваемом месте (последняя строка, тег), даём место на рассуждение и читаем ответ терпимо. Так форма перестаёт быть слабым звеном.

Рычаги управления: - Фраза «ничего после тега» → убери, если после метки нужен комментарий, но тогда разборщик должен искать тег, а не последнюю строку. - Место метки (первая строка или последняя) → для рассуждающих ответов надёжнее конец, для коротких — начало. - Лимит токенов → увеличь, если ответ обрывается. Проверяй, доходит ли модель до метки, а не только правильна ли она. - Запасное действие при сбое разбора → для рискованных решений «заблокировать/на проверку человеку», для безобидных «пропустить». - Строгость разборщика → мягче (приведение регистра, лишние пробелы) вернёт почти все потерянные ответы.

📋

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

Ты {роль_задачи}.

Допустимые метки (ровно одна из): {метка_1} | {метка_2} | {метка_3}

{входные_данные}

Формат ответа:
1. Сначала напиши {объём_рассуждения}.
2. Последней строкой выведи решение строго в таком виде:
метка
После закрывающего тега не пиши ничего.

Что подставлять: {роль_задачи} — что именно классифицируешь или решаешь; {метки} — закрытый список вариантов; {входные_данные} — сообщение, текст или запрос; {объём_рассуждения} — «одно-два предложения» или «до трёх коротких шагов».

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

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

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

LLM спросит, какие метки допустимы, куда пойдёт ответ (n8n, Make, таблица) и что произойдёт при сбое. Эти три вещи определяют, будет ли формат ловиться без потерь.

⚠️

Ограничения

⚠️ Малая выборка в части тестов: классификацию новостей и тональности проверяли на очень небольшом наборе текстов. Это иллюстрация эффекта, а не точная оценка частоты в вашей задаче.

⚠️ Небольшие специализированные модели: главные цифры про безопасность получены на двух маленьких моделях-охранниках. Для универсальных чатов (ChatGPT, Claude, Gemini) направление вывода, скорее всего, то же, но масштаб эффекта другой.

⚠️ Жёсткая JSON-схема может ухудшить сам ответ: в их тесте при требовании структурированного JSON с рассуждением ответ принимался почти всегда, но точность решений упала сильно. Строгая форма — не бесплатная защита, проверяйте оба показателя.

⚠️ Формат ≠ качество: гибкий разбор доставляет ответ, но не доказывает, что рассуждение хорошее. Метод чинит доставку, не ошибки модели. Часть пропущенных опасных запросов осталась и после починки — это были реальные промахи модели.

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

⚠️ Неполный текст: часть приложений и один из сравнений (восстановление ответа второй моделью) в доступном материале не видны полностью.

🔍

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

Идея была простой: взять один и тот же ответ модели и показать его разным «читателям» — строгому и гибкому разборщику. Сначала проверили четыре современные модели (GPT-4.1-mini, GPT-4o-mini, Claude Haiku 4.5, Claude Sonnet 4.5) на простой классификации новостей и тональности. Все 480 ответов были правильными по смыслу, но 93 не соответствовали формату «только метка». Почти все нарушения случились там, где в инструкции не было фразы про форму ответа: нарушили 75,8% против 0,6% с такой фразой. Это самый практичный вывод статьи.

Затем взяли 196 запросов из набора XSTest (безопасные и опасные) и сравнили два фильтра: Llama Guard 3 (отвечает одним словом) и GuardReasoner (сначала рассуждает). Рассуждающий оказался точнее (93,4% против 87,2%), но старый разборщик, ждавший метку в первой строке, отклонил все 588 его ответов. При режиме «пропускать при сбое» пропустились все опасные запросы. При «блокировать при сбое» блокировалось вообще всё, включая безопасное. Подключили разборщик, который читает блок ответа, и почти всё восстановилось. Если дополнительно требовать полную структурированную цепочку рассуждений, доля годных ответов падала (80,1%), а мягкая проверка этого же формата возвращала её (91,8%).

Отдельно проверили лимит длины на 254 новых запросах. Урезание ответа с 700 до 256 токенов уронило точность лишь на 1,2 пункта, зато доставку — на 25 пунктов. При 192 токенах ответы почти все обрывались до метки (доставка 3,1%). Вывод: если смотреть только на точность, потерю на выходе не заметишь.

💡

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

💡 Адаптация: проверка своей автоматизации за 15 минут. Возьмите 30 реальных входов, прогоните через свой промпт и посчитайте две доли: сколько ответов верны по смыслу (читаете глазами) и сколько из верных прошли ваш фильтр. Если вторая цифра сильно ниже первой, чинить надо формат или разбор, а не модель.

Вот 30 пар «ответ модели → что поймал мой фильтр». Для каждой пары скажи:
1) верен ли ответ по смыслу, 2) принял ли его фильтр.
Посчитай долю верных ответов и долю верных, которые фильтр принял.
Покажи примеры форм, которые фильтр отклоняет, и предложи правила нормализации.

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

🔗

Ресурсы

  • Работа: REA: From Correct LLM Judgments to Safe Decision Delivery
  • Авторы: Jingxiang Meng (University of Chicago), Aofan Liu (Peking University), Yaoshuai Ma (Southern University of Science and Technology), Fangxin Liu и Yongbiao Chen (Shanghai Jiao Tong University)
  • Упомянутые в тексте: Llama Guard, WildGuard, GuardReasoner, XSTest, IFEval

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

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

В одном тесте почти все правильно найденные опасные запросы были пропущены. Модель не ошиблась: она ответила «Этот запрос является опасным, потому что…», а фильтр ждал одно слово «Опасно». Метод REA позволяет найти, где верные ответы модели теряются по дороге к действию, и починить это без смены модели. Фишка: мерь не только точность, а долю верных ответов, которые дошли до программы. Сначала явно пропиши форму ответа в промпте, потом читай его гибким разборщиком. Без указания формата нарушали три ответа из четырёх, с чётким указанием почти никто.

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

Путь ответа делится на три остановки. Resolve: что модель на самом деле решила (читаешь глазами, формат не важен). Express: дошло ли решение до разборщика в нужном виде. Act: что сделала система, когда разбор не удался. Получаются две цифры: A — доля верных решений, κ — доля верных решений, которые дошли до программы. Их произведение A × κ — это доля ответов, которые и верны, и сработали. Это как письмо с правильным адресом: если почтальон не разобрал почерк, адресат ничего не получит. Модель может быть права на 95%, а в дело попадёт хорошо если половина. Это порядок проверки, а не один промпт. Делается вручную на 20–50 ответах.

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

Модель по привычке отвечает полным предложением. Строгий формат появляется, только если его потребовать. Потеряй в промпте одну фразу про формат (например, при переписывании) — и всё сломалось. Лимит токенов тоже ворует ответ: рассуждение есть, а метки в конце уже нет. Если форма заявлена явно, модель следует ей почти всегда, а рассуждение перед ответом точность не роняет. Нужен лишь предсказуемый якорь для извлечения: тег или последняя строка. Жесть в том, что чинится всё это не умом модели, а парой строк в промпте и мягким разбором. Есть и обратная сторона. Жёсткая JSON-схема с рассуждением принималась почти всегда, но точность решений упала сильно. Строгая форма не бесплатна, проверяй оба показателя.

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

Автоматизация (n8n, Make, таблицы, скрипты) → ответ модели попадает в узел сравнения, фильтр или ветку → особенно когда при сбое разбора система молча делает запасное действие и никто не видит потерь. Типичные задачи: сортировка сообщений покупателей, модерация, проверка запросов на опасность, разметка текстов. НЕ подходит, если ответ читает человек: там форма не критична. Метод также не чинит ошибки самой модели. Часть пропущенных опасных запросов осталась и после починки, это были реальные промахи. Цифры про безопасность получены на двух маленьких моделях-охранниках, а часть тестов шла на очень малых выборках. Для ChatGPT, Claude и Gemini направление, скорее всего, то же, но масштаб другой.

Мини-рецепт

1. Возьми 20–50 реальных ответов своей модели из автоматизации.
2. Прочитай глазами: что модель решила на самом деле? Посчитай долю верных (A).
3. Проверь доставку: сколько из верных разборщик реально прочитал? Это κ. Если κ сильно меньше 100%, дело в форме, а не в модели.
4. Пропиши формат в промпте: закрытый список меток, одно-два предложения рассуждения, последней строкой метка, после тега ничего.
5. Дай место на рассуждение: подними лимит токенов, чтобы ответ не обрывался до метки.
6. Разбирай терпимо: вытаскивай текст между тегами, приводи к нижнему регистру, обрезай пробелы. Не ищи слово по всему тексту: поймаешь случайные упоминания из объяснения.
7. Реши заранее, что делать при сбое: для рискованных решений блокировать или отдавать человеку, для безобидных пропускать.
8. Замерь снова оба числа: A и κ. Если A просела, формат слишком жёсткий.

Примеры

[ПЛОХО]: `Определи тип сообщения покупателя: жалоба, вопрос или спам.` Модель пишет «Это сообщение является жалобой, так как…». Узел n8n ждёт ровно «жалоба», не находит и отправляет сообщение в мусор. [ХОРОШО]: `Ты сортируешь сообщения покупателей интернет-магазина. Допустимые метки (ровно одна из): жалоба | вопрос | спам. Сообщение: «Заказ 3 недели назад, курьер не приехал, деньги не вернули». Формат ответа: 1) одно-два предложения рассуждения; 2) последней строкой метка. После закрывающего тега не пиши ничего.` В n8n узел вытаскивает текст между `` и ``, приводит к нижнему регистру и обрезает пробелы. «Жалоба » и «жалоба» теперь равны. Если тега нет, сообщение идёт менеджеру на ручную проверку, а не в мусор. [ПЛОХО]: `Отвечай коротко` (добавили для экономии токенов). Лимит обрывает ответ до метки: рассуждение есть, решения нет. [ХОРОШО]: `Сначала одно-два предложения рассуждения, затем метка`, плюс увеличенный лимит токенов.
Источник: REA: From Correct LLM Judgments to Safe Decision Delivery
ArXiv ID: 2610.17473 | Сгенерировано: 2026-10-14 23:40

Методы

МетодСуть
Две цифры вместо одной: верность и доставкаНе меряй только «модель права». Меряй ещё, какая доля верных ответов дошла до действия. Возьми 20–50 ответов. Прочитай каждый глазами, игнорируя форму. Отметь, что модель решила на самом деле. Потом отметь, прочитал ли это решение твой разборщик. Получишь A — доля верных решений. И κ — доля верных, которые дошли до программы. Итог A × κ — доля ответов, которые верны и сработали. Почему работает: потеря на выходе выглядит как ошибка модели. Но чинится она форматом, а не заменой модели. Две цифры показывают, где именно ломается цепочка. Заранее реши, что делать при сбое разбора. Для рискованных решений (безопасность, жалобы, деньги) — «на проверку человеку». Для безобидных — «пропустить». Иначе запасное «пропустить» тихо убивает верные находки. Когда применять: любая автоматизация, где код читает ответ модели. Когда не нужно: ответ читает человек
📖 Простыми словами

REA: From CorrectLLMJudgments to Safe Decision Delivery

arXiv: 2610.17473

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

Это как курьер, который привез правильную пиццу, но вместо того чтобы набрать код домофона, начал душевно объяснять железной двери, почему он приехал. Формально парень молодец, заказ на месте, но дверь закрыта, а ты сидишь голодным. Коду плевать на богатый внутренний мир нейросети: скрипту нужен четкий триггер, а не философские рассуждения на тему клиентской боли.

Вся цепочка REA делится на три шага: внутренний вердикт, парсинг ответа программой и само действие. Главный облом случается ровно посередине. Без жестких рамок модель скатывается в болтовню: вместо сухого ярлыка «жалоба» выдает пассаж «Данный текст является жалобой, потому что…». Второй частый косяк — срезанные токены: ты решил сэкономить бюджет, лимит обрубил ответ на середине мысли, рассуждение есть, а итоговая метка стерта.

Проблему наглядно видно на авто-разборе сообщений с Wildberries и Ozon через n8n, но грабли везде одинаковые. Любой агент техподдержки, сортировщик резюме или финансовый скрипт уязвим к этой ерунде. Можно вылизать промпт до идеала, но если парсер споткнулся о лишнюю запятую, половина критических алертов просто улетит в трубу мимо живого менеджера.

Короче: хватит оценивать модель только по тому, насколько она «умная». Оценивай то, насколько безопасно ее вердикт падает в базу. Внедряй структурированный вывод JSON, держи под контролем длину ответа и строй валидацию доставки. Иначе твой дорогой ИИ-пайплайн продолжит генерировать чистый цифровой мусор.

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

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

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