Проверка программ: новый взгляд с помощью интеллектуальных агентов

Автор: Денис Аветисян


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

🚀 Квантовые новости

Подключайся к потоку квантовых мемов, теорий и откровений из параллельной вселенной.
Только сингулярные инсайты — никакой скуки.

Присоединиться к каналу
Автоматизированная система доказательства AutoRocq успешно верифицировала целевое свойство $wp\_goal$ из эталонного набора задач SV-COMP (svcomp) для полиномиальных выражений, построив дерево доказательств, в котором леммы, необходимые для верификации, были автономно извлечены системой из глобального контекста.
Автоматизированная система доказательства AutoRocq успешно верифицировала целевое свойство $wp\_goal$ из эталонного набора задач SV-COMP (svcomp) для полиномиальных выражений, построив дерево доказательств, в котором леммы, необходимые для верификации, были автономно извлечены системой из глобального контекста.

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

Несмотря на растущую популярность автоматической генерации кода, обеспечение его надежности и корректности остается сложной задачей. В работе, озаглавленной ‘Agentic Program Verification’, представлен новый подход к автоматической верификации программ, основанный на использовании агента AutoRocq. Этот агент, использующий большие языковые модели и взаимодействующий с системой Rocq, способен самостоятельно строить и уточнять доказательства корректности кода в итеративном режиме. Может ли подобный подход к автоматизированной верификации программ стать ключевым элементом в создании надежных и доверенных систем автоматического программирования?


Вызов формальной верификации

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

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

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

Использование LLM для автоматического синтеза инвариантов

Большие языковые модели (БЯМ), в частности GPT-4, демонстрируют значительный потенциал в генерации кандидатов на инварианты циклов, что может стать решением проблемы автоматизации в области формальной верификации программного обеспечения. Эксперименты показывают, что БЯМ способны предлагать инварианты, которые успешно проходят проверку на корректность для широкого спектра простых и умеренно сложных циклов. Способность модели генерировать такие утверждения базируется на анализе контекста цикла, включая условия входа, тела цикла и условия выхода, и последующем построении логического выражения, которое остается истинным на каждой итерации. Хотя сгенерированные инварианты не всегда корректны с первого раза, их использование в качестве отправной точки для автоматических инструментов верификации значительно сокращает время, необходимое для поиска валидных инвариантов, по сравнению с ручным подходом или полным перебором.

Непосредственное применение больших языковых моделей (LLM) к сложным задачам верификации программного обеспечения требует тщательной интеграции с существующими инструментами и методиками для обеспечения эффективной работы. LLM, такие как GPT-4, демонстрируют потенциал в генерации кандидатов на инварианты циклов, однако их производительность и надежность в реальных сценариях зависят от способности эффективно использовать существующие статические анализаторы, решатели ограничений и системы доказательства теорем. Простое предоставление LLM задачи верификации без предварительной обработки входных данных или последующей проверки результатов может привести к ложным срабатываниям, неполным доказательствам или чрезмерным затратам вычислительных ресурсов. Для достижения оптимальной производительности необходимо разработать стратегии, позволяющие LLM фокусироваться на наиболее сложных аспектах задачи, делегируя рутинные операции специализированным инструментам.

Ключевым нововведением в автоматическом синтезе инвариантов является интеграция инвариантов, сгенерированных большими языковыми моделями (LLM), с платформами статического анализа, такими как Frama-C. Этот подход позволяет формально верифицировать корректность предложенных LLM инвариантов, используя проверенные алгоритмы и инструменты. Frama-C предоставляет возможности для доказательства корректности инвариантов в контексте конкретного кода, что существенно повышает надежность автоматизированного процесса верификации. Взаимодействие LLM и Frama-C осуществляется путем предоставления LLM сгенерированного инварианта в качестве гипотезы для Frama-C, которая затем пытается доказать его истинность с использованием логических правил и анализа кода.

AutoRocq представляет собой систему, в которой компоненты, принимающие решения на основе больших языковых моделей, выделены для наглядности.
AutoRocq представляет собой систему, в которой компоненты, принимающие решения на основе больших языковых моделей, выделены для наглядности.

AutoRocq: LLM-агент для автоматического построения доказательств

AutoRocq представляет собой LLM-агент, функционирующий на основе трех ключевых компонентов: генерации тактик с учетом контекста, управления деревом доказательств и обработки критических обратных связей. Генерация тактик адаптируется к текущему состоянию задачи доказательства, что повышает эффективность поиска. Управление деревом доказательств обеспечивает структурированное исследование пространства доказательств, предотвращая повторные попытки и оптимизируя процесс. Механизм обработки обратных связей использует информацию, полученную от интерактивного решателя теорем Rocq, для корректировки стратегии и повышения вероятности успешного построения доказательства. Данная архитектура позволяет агенту эффективно исследовать сложное пространство задач и находить решения.

AutoRocq взаимодействует с интерактивным решателем теорем Rocq, используя его как среду для исследования пространства доказательств. Агент генерирует тактики доказательства и применяет их в Rocq, после чего получает обратную связь о применимости и корректности этих тактик. На основе полученной информации AutoRocq корректирует свою стратегию, выбирая наиболее перспективные направления для дальнейшего построения доказательства. Этот итеративный процесс, включающий генерацию тактик, проверку в Rocq и адаптацию стратегии, позволяет агенту эффективно преодолевать сложности, возникающие при автоматическом доказательстве теорем и лемм.

Результаты тестирования AutoRocq демонстрируют значительное превосходство над существующими подходами к автоматическому доказательству теорем. Система успешно доказала 51.1% математических лемм, входящих в тестовый набор, и 30.9% лемм, относящихся к формальной верификации программного обеспечения. Данные показатели свидетельствуют о повышении эффективности автоматического доказательства и расширении возможностей формальной верификации благодаря использованию AutoRocq.

Оценка и перспективы

Оценка AutoRocq на общепринятых эталонах продемонстрировала его способность решать сложные задачи верификации. Система достигла 51.1%-ного процента успешного доказательства математических лемм и 30.9% для лемм, связанных с программным обеспечением. Эти результаты значительно превосходят показатели базовых подходов: в математической области превосходство составляет от 20.8% до 343.0%, а в программной — от 42.4% до 204.6%. Такое существенное улучшение указывает на эффективность AutoRocq в автоматизированной проверке корректности как математических моделей, так и программного кода, что делает его перспективным инструментом для повышения надежности и безопасности разрабатываемых систем.

Исследование продемонстрировало, что AutoRocq успешно доказал 142 леммы, причем 98 из них относятся к математическим задачам, а 44 — к задачам, связанным с программным обеспечением. Этот результат подчеркивает существенный вклад системы в область формальной верификации и автоматизированного доказательства теорем. Уникальность AutoRocq заключается в способности решать задачи, которые ранее оставались недоступными для существующих подходов, что открывает новые возможности для повышения надежности и безопасности программного обеспечения, а также для развития математических исследований. Доказательство такого количества лемм свидетельствует о значительном прогрессе в сочетании возможностей больших языковых моделей и строгих методов формальной верификации.

Испытания AutoRocq на модулях ядра Linux продемонстрировали его значительное превосходство в верификации. Система успешно подтвердила 12 лемм, что существенно превышает показатели базовых подходов, которые смогли верифицировать лишь от 2 до 10 лемм. Данный результат подчеркивает не только теоретическую значимость AutoRocq, но и его практическую применимость в критически важных областях разработки программного обеспечения, где надежность и корректность кода имеют первостепенное значение. Способность системы эффективно справляться с верификацией реальных модулей ядра Linux указывает на её потенциал для автоматизации процессов обеспечения качества и снижения рисков, связанных с ошибками в коде.

Результаты работы AutoRocq демонстрируют перспективность объединения больших языковых моделей (LLM) и формальных методов для повышения надёжности программного обеспечения. Данная синергия позволяет преодолеть ограничения, присущие каждому подходу по отдельности: LLM обеспечивают способность к обобщению и пониманию сложных закономерностей, а формальные методы гарантируют математическую точность и верификацию. AutoRocq успешно применяет LLM для генерации гипотез и стратегий доказательства, которые затем проверяются с использованием формальных инструментов, что приводит к значительному увеличению количества успешно верифицированных лемм, как математических, так и относящихся к программному коду. Такой подход открывает новые возможности для автоматизированной проверки программного обеспечения, снижая риск ошибок и повышая уровень доверия к критически важным системам.

Анализ сложности лемм в программах SV-COMP и CoqGym показал, что леммы CoqGym значительно проще, не содержат более 100 термов или 7 гипотез.
Анализ сложности лемм в программах SV-COMP и CoqGym показал, что леммы CoqGym значительно проще, не содержат более 100 термов или 7 гипотез.

Исследование, представленное в статье, демонстрирует стремление к упрощению сложного процесса формальной верификации программного обеспечения. Автоматизация доказательства теорем, особенно в контексте крупных языковых моделей, направлена на устранение избыточности и достижение ясности. В этом стремлении можно увидеть отголоски философии Алана Тьюринга: «Самое важное — это не знать все ответы, а уметь задавать правильные вопросы.» Эта фраза подчеркивает суть подхода AutoRocq — не просто проверить программу, а правильно структурировать процесс проверки, чтобы выявить ключевые аспекты, требующие внимания. Умение задавать верные вопросы — это и есть путь к эффективной и понятной верификации, а значит, и к более надежному программному обеспечению.

Что Дальше?

Представленная работа, хотя и демонстрирует прогресс в автоматической верификации программ, лишь приоткрывает завесу над истинной сложностью задачи. Автоматизация доказательств, даже с применением больших языковых моделей, остается скорее искусством, чем точной наукой. Очевидно, что существующие подходы, включая предложенный AutoRocq, ограничены в способности справляться с программами, выходящими за рамки тщательно сконструированных примеров. Упор на древовидное представление доказательств — разумный компромисс, но он неизбежно накладывает ограничения на выразительность и гибкость системы.

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

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


Оригинал статьи: https://arxiv.org/pdf/2511.17330.pdf

Связаться с автором: https://www.linkedin.com/in/avetisyan/

Смотрите также:

2025-11-24 14:36