3,583 papers
arXiv:2610.12529 78 8 окт. 2026 г. FREE

OPT-Kraken: ремонт ошибок в расчётах LLM по принципу «чини сломанное, не трогай целое»

КЛЮЧЕВАЯ СУТЬ
Парадокс: чем умнее цепочка «диагноз, ремонт, аудит», тем чаще модель портит то, что уже работало. Доля испорченных верных ответов растёт с 0,3% до 8,4%. Метод OPT-Kraken позволяет исправлять ошибки в формулах и коде от большой языковой модели (LLM), не переписывая то, что уже верно. Фишка: модели, которой велели искать ошибки, нужно запретить править, пока нет цитаты-доказательства из условия. Проверка идёт по пяти направлениям, правка зажата в контракт (что можно менять, а что трогать нельзя), в конце независимый аудит. Итог: точность 44,8% → 64,9%, порча верного около 0,6%.
Адаптировать под запрос
⚡

TL;DR

OPT-Kraken — многоэтапная проверка и правка готовых результатов LLM (математическая модель плюс код). Сначала из условия отдельно извлекаются требования и данные. Потом идут пять направленных проверок, и каждая ищет свой тип ошибок. Правка делается по «контракту»: что можно менять, что должно получиться и что трогать нельзя. В конце независимый аудит. Если он не пройден, правка откатывается.

Главная находка: обычная просьба «проверь, исправь, сохрани правильное» ловит только половину ошибок. Более навороченные цепочки (рассуждение по шагам, диагноз, ремонт и аудит) находят больше, но начинают портить правильное: доля испорченных верных ответов вырастает с 0,3% до 8,4%. Причина в том, что модель, которой велели искать ошибки, их находит, даже когда их нет. Есть и второй неприятный факт. Код запускается и число сходится, а модель по условию верна лишь у единиц процентов результатов. «Ответ правильный» не значит «расчёт построен правильно».

Метод решает это жёсткими рамками. Проверка идёт по направлениям, а не «просто посмотри ещё раз». Правка ограничена контрактом. Аудитор судит вердикт независимо. Итог: точность выросла с 44,8% до 64,9%, а порча правильных результатов осталась около 0,6%.

🔬

Схема метода

ШАГ 1: Извлечь из условия ТРЕБОВАНИЯ (с цитатами) и ДАННЫЕ (значения, индексы, единицы) → два списка
ШАГ 2: Пять направленных проверок → находки с цитатой-доказательством
        условие → модель     (всё ли учтено? не перевёрнуты ли знаки?)
        модель → условие     (нет ли выдуманных переменных и ограничений?)
        модель ↔ код         (код реализует именно эту модель?)
        данные → модель      (значения, индексы, единицы на месте?)
        данные → код         (ключи, массивы, подстановка верны?)
ШАГ 3: Вердикт: CLEAN / ERROR / UNRESOLVED
        CLEAN или UNRESOLVED без доказательств → ничего не трогаем
ШАГ 4: Выбор минимального масштаба правки
        только код → локальная правка модели + кода → пересборка с нуля (только при доказательстве)
ШАГ 5: Контракт: что можно менять / что читать, но не править / что должно получиться / что защищено
ШАГ 6: Правка строго в рамках контракта
ШАГ 7: Независимый аудит правки → PASS: принять / FAIL: откат к исходнику

В оригинале это несколько отдельных вызовов LLM плюс программные проверки. В чате шаги 1–3 идут одним запросом, а шаги 4–6 вторым. Аудит (шаг 7) лучше делать в отдельном чате.

🚀

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

Задача: Селлер на Ozon попросил ChatGPT собрать калькулятор юнит-экономики: формулы плюс Python-скрипт. Условие: комиссия 12% от цены, логистика 85 ₽ за единицу, возвраты 7% (возвращённый товар не продаётся, логистика не возвращается), закупка 420 ₽. Модель сгенерировала расчёт, скрипт запускается и выдаёт число. Но селлер не уверен, что в формуле возвраты учтены в нужную сторону. Нужно исправить только ошибку и не переписать то, что уже верно.

Промпт (запрос 1, диагностика):


Ты аудитор расчётов. Ты НЕ переписываешь расчёт. Ты ищешь расхождения с условием и доказываешь каждое цитатой.



Селлер Ozon продаёт товар. Закупка 420 ₽/шт. Комиссия 12% от цены продажи. Логистика 85 ₽ за единицу. Доля возвратов 7%: возвращённый товар не приносит выручки, логистика за него не возвращается. Нужно найти цену, при которой маржа с проданной единицы ≥ 20%.



{формулы_модели}



{код_скрипта}



1. Извлеки ТРЕБОВАНИЯ из : каждое с id и дословной цитатой. Ничего не добавляй от себя.
2. Извлеки ДАННЫЕ: числа, единицы, к чему каждое относится.
3. Проведи пять проверок. Для каждой напиши найденные расхождения или "расхождений нет":
   - A. Условие → Модель: все ли требования учтены, не перевёрнуты ли знаки и отношения?
   - B. Модель → Условие: есть ли в модели что-то, чего нет в условии?
   - C. Модель ↔ Код: код реализует именно эту модель?
   - D. Данные → Модель: значения и единицы на своих местах?
   - E. Данные → Код: подстановка в код верна?
4. Каждая находка: цитата из условия | как сейчас | как должно быть | где находится.
5. Вердикт: CLEAN (ошибок нет) / ERROR (ошибка подтверждена цитатой) / UNRESOLVED (не уверен).
   Неуверенность — это UNRESOLVED, а не повод править.

Промпт (запрос 2, правка по контракту):

По найденной ошибке составь КОНТРАКТ и выполни правку.


Можно менять: {только_строки_с_ошибкой}
Читать, но не править: {зависимости_для_проверки}
Ожидаемый эффект: {что_должно_измениться}
Защищено (не трогать): всё остальное — переменные, константы, остальные формулы, структуру кода


Выбери минимальный масштаб: (1) только код, (2) локальная правка формулы и кода, (3) пересборка с нуля — только если локально исправить доказуемо нельзя.
Выдай: исправленные формулы и код + дифф «было → стало». Если дифф выходит за рамки "Можно менять" — остановись и скажи об этом.

Промпт (запрос 3, аудит, в новом чате): Передай условие, исходную версию и исправленную. Попроси проверить соответствие условию, объём правки и сохранность защищённого. Ответ должен быть PASS или FAIL.

Результат: После первого запроса придёт список требований и данных с цитатами, затем разбор по пяти направлениям и вердикт. После второго — контракт и точечная правка с диффом: изменена одна формула, остальное нетронуто. После третьего — PASS, и правку принимаешь, либо FAIL, и остаёшься на исходной версии.

🧠

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

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

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

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

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

📋

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


Ты аудитор. Ты не переписываешь работу целиком. Ты находишь расхождения с исходным заданием и доказываешь каждое цитатой.



{условие_задачи}



{формулы_логика_или_описание_решения}



{код_или_расчёт}



1. Извлеки ТРЕБОВАНИЯ из : id, дословная цитата. Ничего не добавляй.
2. Извлеки ДАННЫЕ: значения, единицы, к чему относятся.
3. Проверки (для каждой — находки или "расхождений нет"):
   - A. Условие → Модель: всё ли учтено, не перевёрнуты ли знаки и отношения?
   - B. Модель → Условие: нет ли выдуманного?
   - C. Модель ↔ Код: код реализует именно эту модель?
   - D. Данные → Модель: значения, единицы, привязки верны?
   - E. Данные → Код: подстановка верна?
4. Формат находки: цитата | как сейчас | как должно быть | где.
5. Вердикт: CLEAN / ERROR / UNRESOLVED. Неуверенность = UNRESOLVED, правок не делай.

Если вердикт ERROR, во втором запросе:


Можно менять: {места_ошибки}
Читать, но не править: {зависимости}
Ожидаемый эффект: {эффект}
Защищено: {всё_остальное}

Выбери минимальный масштаб: (1) только код → (2) локальная правка модели и кода → (3) пересборка с нуля (только с доказательством, что локально нельзя).
Выдай исправленную версию и дифф «было → стало». Если правка выходит за рамки «Можно менять» — остановись.

В новом чате на третьем шаге: «Вот условие, исходная и исправленная версии. Проверь соответствие условию, объём правки и сохранность защищённого. Ответ: PASS или FAIL с причиной».

Что подставлять: {условие_задачи} — исходный текст задачи без пересказа. {формулы_...} и {код_...} — то, что выдала модель. В блок подставляй только то, что вывела диагностика.

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

Вот шаблон OPT-Kraken (диагностика + правка по контракту + аудит). Адаптируй под мою задачу: [твоя задача]. 
Задавай вопросы, чтобы заполнить поля.

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

LLM спросит, что считать «условием» и «результатом», какие пять направлений проверок подходят именно тебе, что нельзя трогать при правке. Эти вопросы нужны потому, что метод работает только с чёткими рамками: без границ «защищённого» правка превращается в переписывание.

⚠️

Ограничения

⚠️ Узкая область: метод проверен только на задачах оптимизации (математическая модель плюс решатель). В других областях принцип переносится, но этого авторы не проверяли.

⚠️ Часть защит в чате не воспроизвести: в оригинале проверка рамок правки, сборка контракта и проверка «изменено только разрешённое» делаются программно. В чате всё это делает сама LLM, а это слабее.

⚠️ Обычный многошаговый разбор без защит вредит: диагноз + ремонт + аудит без контрактов и запрета на правку по неуверенности портил до 8% изначально верных ответов.

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

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

⚠️ Эффект зависит от слабости генератора: на слабых «нулевых» результатах прирост огромный, у дообученных моделей скромнее (4–9 п.п.).

⚠️ Неполный текст: промпты из приложений не приведены, воспроизведён принцип, а не дословные формулировки авторов.

🔍

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

Команда из Пекинского университета взяла шесть наборов задач оптимизации: от простых до промышленных. Результаты работы генераторов моделей заморозили и пропустили через пост-обработку. Сравнивали «до» и «после» на одних и тех же парах «условие — модель — код». Генераторов было восемь: четыре конвейера (включая ORMind, OptiMUS, SAC-Opt) и четыре дообученные модели. Чинили тремя разными LLM.

Главная идея дизайна: измерять не только точность, но и вред. Метрик три: сколько неверного спасли, сколько верного испортили, сколько ошибок вообще заметили. Основной результат: точность «нулевых» результатов выросла с 44,8% до 64,9%, спасено 36,9% ошибочных, испорчено лишь 0,6% верных. Конвейеры улучшились на 6–9 п.п., дообученные модели — на 4–9 п.п.

Затем сравнили с базовыми подходами. Простой промпт: спасено 21,3%, но замечено лишь около половины ошибок. Рассуждение по шагам: 25,6% и порча 2,8%. Многоэтапный без защит: 26,7%, но порча 8,4%. На GPT-5.6 Sol простой промпт испортил 6,6% верных, OPT-Kraken — 0%. Неожиданно: больше «умной» проверки без защит даёт больше вреда. Ручная слепая проверка 339 результатов показала, что верность условию выросла с 2,7% до 51,8%.

💡

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

🔧 Техника: убрать пересборку → меньше риска. Если не хочешь, чтобы модель переписывала решение, замени пункт (3) в запросе правки на: «Пересборка запрещена. Если локально исправить нельзя, остановись и опиши, чего не хватает». Эффект: порча верного ещё меньше, правки только точечные.

Экстраполяция: принцип контракта в файле инструкций агента. Перенос на Claude Code или Cursor (в статье такого нет):

## Правила правки кода
Перед правкой выпиши: что МОЖНО менять (файлы, функции), что НЕЛЬЗЯ, что должно измениться.
Правь минимально. Если нашёл подозрение без доказательства — сообщи, но не правь.
После правки покажи дифф. Любое изменение вне разрешённого — откати и спроси.
🔗

Ресурсы

  • «Fix What's Wrong, Keep What's Right: Hallucination Repair for LLM-Based Optimization Modeling»
  • Авторы: Jiageng Wu, Chao Shen, Zihan Guo, Junyan Shao, Zongyan Zhang, Jie Song, Zhong Li, Mingyang Sun
  • Университеты: Peking University, Zhejiang University, Great Bay University
  • Упомянутые работы: OptiMUS, ORMind, SAC-Opt, Chain-of-Experts, SelfCheckGPT, RARR, CRITIC

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

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

Парадокс: чем умнее цепочка «диагноз, ремонт, аудит», тем чаще модель портит то, что уже работало. Доля испорченных верных ответов растёт с 0,3% до 8,4%. Метод OPT-Kraken позволяет исправлять ошибки в формулах и коде от большой языковой модели (LLM), не переписывая то, что уже верно. Фишка: модели, которой велели искать ошибки, нужно запретить править, пока нет цитаты-доказательства из условия. Проверка идёт по пяти направлениям, правка зажата в контракт (что можно менять, а что трогать нельзя), в конце независимый аудит. Итог: точность 44,8% → 64,9%, порча верного около 0,6%.

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

Принцип простой: не «посмотри ещё раз», а пять узких проверок, у каждой своя работа. - условие → модель: всё ли учтено, не перевёрнуты ли знаки - модель → условие: нет ли выдуманных переменных - модель ↔ код: код считает именно эту модель? - данные → модель: числа и единицы на месте? - данные → код: подстановка верна? Каждая находка идёт с цитатой из условия. Нет цитаты, нет и находки. Вердикт один из трёх: «чисто», «ошибка» или «не уверен». «Не уверен» не даёт права на правку. Дальше правка идёт по контракту: список разрешённого, список защищённого, ожидаемый эффект. Это как работа хирурга по протоколу: режет только там, где отмечено маркером. В конце другой «врач» (отдельный чат) смотрит результат. Прошло, значит принимаем. Не прошло, возвращаем исходник.

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

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

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

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

Мини-рецепт

1. Собери три вещи: исходное условие дословно (не пересказ), формулы модели и код.
2. Запрос 1, диагностика: модель выписывает требования с цитатами и данные с единицами. Потом идут пять проверок и вердикт: чисто, ошибка или не уверен. Роль: <роль>аудитор, который ничего не переписывает, а доказывает цитатой.
3. Смотри на вердикт: «чисто» или «не уверен» без доказательства означает, что ничего не трогаешь. Остановись здесь.
4. Запрос 2, правка по контракту: впиши, что можно менять (только строки с ошибкой), что читать без правок, что должно измениться и что защищено (всё остальное).
5. Ограничь масштаб: сначала только код, потом локальная правка формулы и кода. Пересборка с нуля только если локально исправить доказуемо нельзя.
6. Требуй дифф «было → стало»: если правка вышла за рамки «можно менять», пусть модель остановится и скажет об этом.
7. Запрос 3, аудит в новом чате: дай условие, исходную и исправленную версии. Ответ только PASS или FAIL с причиной. PASS: принимаешь правку. FAIL: остаёшься на исходнике.

Примеры

[ПЛОХО] : Проверь расчёт юнит-экономики, исправь ошибки, но сохрани то, что верно
[ХОРОШО] : Ты аудитор, ничего не переписывай. Условие: закупка 420 ₽, комиссия 12% от цены, логистика 85 ₽, возвраты 7% (возвращённый товар не продаётся, логистика не возвращается). Извлеки требования с дословными цитатами. Проверь по пяти направлениям: условие → формулы, формулы → условие, формулы ↔ код, данные → формулы, данные → код. Каждая находка: цитата | как сейчас | как должно быть | где. Вердикт: чисто / ошибка / не уверен. При неуверенности правки не делай. [ХОРОШО, запрос 2]: Контракт. Можно менять: только строку с долей возвратов в формуле выручки. Защищено: комиссия, логистика, закупка, структура скрипта. Выдай дифф «было → стало». Выйдешь за рамки, остановись.
Источник: Fix What's Wrong, Keep What's Right: Hallucination Repair for LLM-Based Optimization Modeling
ArXiv ID: 2610.12529 | Сгенерировано: 2026-10-12 05:20

Проблемы LLM

ПроблемаСутьКак обойти
Просьба «найди ошибки» заставляет модель находить их, даже когда их нетПросишь проверить и исправить готовый результат. Модель считает, что должна что-то найти. Правит верные места. Чем глубже и сложнее проверка, тем больше лишних правок. Простая просьба «проверь, исправь, сохрани верное» при этом пропускает много настоящих ошибок. Это касается кода, текстов, расчётов, таблицДай три вердикта: ЧИСТО / ОШИБКА / НЕ УВЕРЕН. Ошибка засчитывается только с дословной цитатой из исходного задания. Пиши прямо: «Сомнение — это НЕ УВЕРЕН. При нём ничего не правь»
Результат выглядит правильно, но построен неверноКод запускается. Число правдоподобное. Проверка по итоговому числу проходит. Но логика не соответствует условию: перевёрнут знак, выдуманное ограничение, неверная привязка данных. Ошибка скрыта за «рабочим» ответомНе проверяй только ответ. Сверяй каждый кусок решения с условием по цитатам. Для каждой находки требуй формат: «цитата из условия / как сейчас / как должно быть / где»

Методы

МетодСуть
Проверка по узким направлениям с цитатой-доказательствомНе пиши «проверь всё ещё раз». Разбей проверку на отдельные сверки, у каждой своя обязанность. Пример для расчёта: условие → решение (всё ли учтено, знаки), решение → условие (нет ли выдуманного), решение ↔ код (код делает именно это), данные → решение, данные → код. Сначала извлеки из условия два списка: требования (с дословными цитатами) и данные (значения, единицы, к чему относятся). Потом проверяй по этим спискам. Почему работает: модель хорошо решает узкие задачи с чёткой рамкой («сверь этот фрагмент с этой цитатой»). Размытое «посмотри ещё раз» её не направляет. Цитата не даёт придумать ошибку. Как менять под задачу: для текста — «факты → источник», «тон → бриф», «цифры → таблица». Не работает: когда нет чёткого исходного задания, с которым можно сверять
Правка по контракту с независимым аудитором и откатомПеред правкой попроси составить контракт из четырёх строк. Можно менять: только места ошибки. Читать, но не править: зависимости. Ожидаемый эффект: что должно измениться. Защищено: всё остальное. Затем выбирай минимальный масштаб правки: сначала одна строка или кусок, потом локальная правка, пересборка с нуля только при доказательстве, что иначе нельзя. Попроси выдать дифф «было → стало» и остановиться, если он выходит за рамки контракта. Потом отдай условие, старую и новую версии другому судье — в новом чате или другой модели. Он отвечает PASS или FAIL. При FAIL остаёшься на исходной версии. Почему работает: явные границы не дают модели переписывать целое. Автор правки плохо судит свою же правку, а независимый судья видит её свежим взглядом. Откат гарантирует, что верное не потеряется. Когда применять: результат в основном верный, ошибка точечная. Не нужно: когда исходник плох целиком — тогда проще сделать заново. Ограничение: в чате контракт и проверку рамок выполняет сама модель. Это слабее, чем программная проверка
📖 Простыми словами

Fix What's Wrong, Keep What's Right: Hallucination Repair forLLM-Based OptimizationModeling

arXiv: 2610.12529

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

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

Чтобы прекратить этот цирк, исследователи выкатили фреймворк OPT-Kraken. Метод работает жестко: сначала выдирает из условия требования и сырые данные, а затем прогоняет логику через пять узких проверок, где каждая ищет строго свой тип бага. Правка делается по «контракту» — модели буквально связывают руки, запрещая трогать верные куски, а результат оценивает независимый аудит с мгновенным откатом изменений, если проверка провалена.

Тестировали механику на сложных оптимизационных моделях, но принцип универсален. Это прямое руководство к действию для любых вычислений: от скриптов юнит-экономики под Ozon до логистических цепочек и финтеха. Везде, где код визуально работает, но цена одной скрытой ошибки в знаке процента сливает бюджет в трубу, полагаться на голое нажатие кнопки Run — чистое безумие.

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

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

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

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