3,583 papers
arXiv:2607.18519 74 20 июля 2026 г. FREE

VeriRefine: превращает написание кода в explicit-чеклист сигналов перед генерацией

КЛЮЧЕВАЯ СУТЬ
Обнаружено: LLM смешивает понимание задачи и запись решения в один шаг. Ошибка понимания прячется внутри правильно выглядящего кода и всплывает только когда всё уже сломалось. VeriRefine позволяет ловить ошибку понимания ДО того как она попадёт в результат — на отдельном проверяемом шаге. Модель сначала заполняет карточку по каждой переменной с обязательной цитатой-доказательством из текста, и только после проверки на противоречия пишет код — вместо додумывания получаешь честное "требует уточнения".
Адаптировать под запрос

TL;DR

VeriRefine — это метод, который заставляет модель сначала описать поведение каждого сигнала в отдельной строгой таблице, и только потом писать код. Вместо того чтобы сразу переводить спецификацию на Verilog (язык описания железа), модель для каждого сигнала фиксирует: тип логики, привязку к тактовому сигналу, поведение сброса, и список условий-действий — каждое из которых обязано ссылаться на буквальную цитату из исходного текста.

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

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


🔬

Схема метода

ШАГ 1: Классификация типа задачи → определяет какой шаблон карточки использовать (отдельный шаг/промпт)
ШАГ 2: Заполнение карточки по каждому сигналу → JSON-документ: тип логики + условия-действия + цитата-доказательство (один промпт)
ШАГ 3: Проверка карточки по 5 критериям (полнота, непротиворечивость, соответствие тексту и др.) → если есть нарушения — возврат на Шаг 2 с конкретной правкой
ШАГ 4: Генерация кода на основе проверенной карточки → готовый код
ШАГ 5: Тест кода → если не работает, определяем: ошибка в понимании (→ Шаг 2) или в самом коде (→ Шаг 4)

Все шаги выполняются в рамках одного диалога с моделью — это цепочка отдельных запросов, где вывод одного шага становится входом следующего.


🚀

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

Задача: Вы описываете дизайнеру или разработчику ТЗ на сложный сценарий — например, логику начисления кэшбэка в банковском приложении с кучей условий (разные категории трат, лимиты, периоды акций) — и хотите, чтобы перед написанием кода все правила были явно разложены и сверены с текстом ТЗ, а не додуманы.

Промпт:

Вот моё техническое описание логики начисления кэшбэка:

{текст ТЗ}

Прежде чем писать код, сделай следующее:

1. Найди в тексте все переменные/параметры, от которых зависит начисление кэшбэка 
(категория, сумма, лимит, период и т.д.)

2. Для каждой переменной составь карточку:
   - Тип: постоянная величина / зависит от условия / накопительная (меняется со временем)
   - Условия и правила в порядке приоритета: если выполняется условие А — действие А, 
     иначе если условие Б — действие Б, и так далее
   - Для каждого правила процитируй ТОЧНУЮ фразу из ТЗ, которая его подтверждает

3. Если для какого-то правила в тексте нет прямой цитаты — не выдумывай его, 
   а пометь как "требует уточнения"

4. Проверь карточки на противоречия между собой (например, два правила 
   не должны конфликтовать в одном случае)

5. Только после того как карточки готовы и проверены — переходи к написанию кода

Начни с шага 1.

Результат: Модель выдаст таблицу или список переменных с их карточками, где видно, откуда взято каждое правило. Вы сразу увидите, где модель что-то "додумала" без опоры на текст (это будет помечено), и сможете исправить ТЗ или подтвердить правило до того, как появится код. Затем модель пишет код на основе уже проверенной логики.


🧠

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

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

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

Метод использует это: разделяет "понять" и "написать" на два отдельных шага с проверкой между ними. Ошибку понимания ловят на шаге проверки карточки — до того как она "зашита" в код, где её сложно найти.

Рычаги управления: - Число проверочных критериев (в оригинале — 5: полнота, непротиворечивость, соответствие тексту, целостность состояний, базовые правила) → можно сократить до 2-3 для простых задач, если не нужна такая строгость - Требование "цитируй точную фразу" → можно ослабить до "укажи откуда это взято" для нетехнических задач, где буквальное цитирование избыточно - Порядок приоритета условий → критично сохранять, если правила могут конфликтовать; для простых линейных сценариев можно убрать - Разделение ошибок на "ошибка понимания vs ошибка исполнения" при отладке → это ключевой принцип, применимый в любой задаче с проверкой результата: не чинить код наугад, а сначала спросить "это модель не поняла задачу или правильно поняла, но неправильно написала?"


📋

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

Вот моя задача с множеством условий и правил:

{описание задачи}

Прежде чем выполнять задачу, сделай так:

1. Выдели все ключевые переменные/сущности, от которых зависит результат.

2. Для каждой переменной составь карточку:
   - Тип поведения: {постоянная / зависит от условия / накопительная}
   - Список правил в порядке приоритета: если условие 1 — то действие 1, 
     иначе если условие 2 — то действие 2, и так далее
   - Точная цитата из исходного текста, подтверждающая каждое правило

3. Если цитаты нет — не выдумывай правило, помечай как "требует уточнения".

4. Проверь все карточки на противоречия друг с другом.

5. Покажи мне карточки. Я подтвержу или поправлю их.

6. Только после моего подтверждения — выполняй задачу целиком.

Начни с шага 1 по тексту: {текст задачи}

Плейсхолдеры: {описание задачи} — краткое описание того, что нужно сделать; {текст задачи} — полный текст исходного документа (ТЗ, регламент, договор, сценарий).

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

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

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

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


⚠️

Ограничения

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

⚠️ Избыточен для простых задач: если правил мало и они не конфликтуют, дробление на карточки и проверки — трата времени и токенов. Метод раскрывается на задачах с множеством взаимосвязанных условий.

⚠️ Специфичен для технической области: оригинальный метод создан для генерации кода на Verilog (язык описания микросхем), где важна предельная точность привязки к тактам и сбросам. В саммари адаптация — под задачи с чёткими правилами, но не факт, что перенос сохранит всю силу метода для творческих или неоднозначных задач.


🔗

Ресурсы

VeriRefine: A Progressive Approach to Synthesizable RTL Design Generation Using LLMs. Xiangfei Kong, Tasnim Tabassum, Marwan Abdelwahab, Hao Zheng — University of South Florida. Тестировали на Claude Sonnet 4.6, бенчмарки RTLLM v2.0 и VerilogEval-Human v2.


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

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

Обнаружено: LLM смешивает понимание задачи и запись решения в один шаг. Ошибка понимания прячется внутри правильно выглядящего кода и всплывает только когда всё уже сломалось. VeriRefine позволяет ловить ошибку понимания ДО того как она попадёт в результат — на отдельном проверяемом шаге. Модель сначала заполняет карточку по каждой переменной с обязательной цитатой-доказательством из текста, и только после проверки на противоречия пишет код — вместо додумывания получаешь честное "требует уточнения".

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

Правило простое: понимание и исполнение — два разных навыка. Мешать их в одном проходе — прямой путь к скрытым багам. Сначала карточка (что должно происходить + цитата), потом проверка на пять критериев, только потом сам код. Если результат не работает — не чинишь код наугад, а спрашиваешь: модель не поняла задачу или поняла верно, но написала неправильно? Ремонт идёт туда, где реально возник разрыв, а не куда попало.

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

Требование "процитируй точную фразу" работает как детектор лжи. Модели проще выдумать правдоподобное правило, чем искать его в тексте — но цитата не даёт этого сделать. Модель либо находит реальное подтверждение, либо честно пишет "требует уточнения" — вместо тихой выдумки, зашитой в готовый код. Пять отдельных проверок (полнота, противоречия, соответствие тексту и другие) ловят ошибку понимания на бумаге, где её легко поправить, а не в коде, где она прячется до первого запуска.

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

Работа со сложными документами → конкретно для ТЗ, регламентов, договоров с множеством пересекающихся условий, особенно когда правила могут конфликтовать друг с другом. НЕ подходит для простых задач без взаимосвязанных условий и для творческих задач без опорного текста для цитирования.

Мини-рецепт

1. Найди переменные: выпиши все сущности, от которых зависит результат.
2. Составь карточку: тип поведения (постоянная / зависит от условия / накопительная), правила по приоритету, цитата на каждое правило.
3. Помечай пробелы: если цитаты нет — не выдумывай, пиши "требует уточнения".
4. Проверь на противоречия: правила в разных карточках не должны спорить друг с другом.
5. Только потом выполняй: код или текст пишется на основе уже проверенной карточки.

Примеры

[ПЛОХО] : Напиши код логики начисления кэшбэка по этому ТЗ
[ХОРОШО] : Сначала составь карточку для каждой переменной (категория, лимит, период) с цитатой из ТЗ на каждое правило. Если цитаты нет — пометь "требует уточнения". Проверь карточки на противоречия. Покажи мне. Потом пишем код.
Источник: VeriRefine: A Progressive Approach to Synthesizable RTL Design Generation Using LLMs
ArXiv ID: 2607.18519 | Сгенерировано: 2026-07-22 04:23

Проблемы LLM

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

Методы

МетодСуть
Карточки-доказательства перед выполнением задачиПеред тем как модель выполнит сложную задачу с множеством условий, попроси её выписать каждую переменную/правило в отдельную карточку: тип поведения (постоянное / условное / накопительное), список условий-действий по приоритету, и точную цитату из исходного текста, подтверждающую каждое правило. Если цитаты нет — модель обязана написать "требует уточнения", а не выдумывать. Для каждой переменной укажи: тип; правила если-то по приоритету; точная цитата-подтверждение. Затем попроси проверить карточки на противоречия друг с другом. Только после этого — выполнение задачи. Работает потому что заставляет модель явно показать основания решения, до того как они растворятся в финальном тексте или коде. Работает: тексты с множеством взаимосвязанных условий (регламенты, ТЗ, договоры), где есть письменный источник для цитат. Не работает: задачи "придумай с нуля" без опорного текста, простые задачи без конфликтующих правил
Диагностика ошибки перед починкой: понимание или исполнениеКогда результат не работает, не чини его наугад. Сначала спроси модель (или сам определи): модель неправильно поняла задачу, или поняла верно, но неправильно выполнила? Если ошибка в понимании — правь карточку/условия. Если в исполнении — правь сам результат, оставляя логику как есть. Работает потому что смешивание правок в один шаг заставляет модель гадать, что менять, и часто ломает то, что уже было верно. Работает: любая задача с проверяемым результатом и промежуточным шагом понимания. Не работает: если промежуточного шага понимания не было — тогда нечего разделять
📖 Простыми словами

A Progressive Approach to Synthesizable RTL Design GenerationUsingLLMs

arXiv: 2607.18519

Суть проблемы в том, что нейронки, когда их просят написать код для железа на Verilog, ведут себя как самоуверенные джуны: они вроде бы поняли задачу, но в процессе написания кода начинают «галлюцинировать» логику сигналов. Проблема сидит в самой архитектуре LLM — модели дико сложно одновременно удерживать в голове и смысл сложного ТЗ, и строгий синтаксис языка. В итоге получается код, который выглядит правильно, но на уровне транзисторов и логических вентилей это полная херня, которая просто не заведется или сгорит.

Это как если бы ты попросил строителя собрать сложный электрощит по устной инструкции, а он начал бы крутить провода, попутно пытаясь вспомнить, что ты там говорил про заземление. Формально провода прикручены, но стоит включить рубильник — и всё летит к чертям. Метод VeriRefine вводит промежуточный этап: прежде чем брать в руки отвертку, строитель обязан составить строгую таблицу всех соединений, где каждый чих обоснован конкретной строчкой из твоего ТЗ.

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

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

Короче: хватит просить нейронку «просто написать код» по сложному ТЗ — она обязательно где-то лажанет. Используй VeriRefine как фильтр, который вычищает ошибки понимания еще до того, как они превратятся в нерабочие строки кода. Сначала жесткая структура и цитаты, потом реализация. Кто не введет такой промежуточный контроль, тот так и будет тратить недели на отладку кода, который просто выглядел рабочим.

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

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

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