Журнал · Rit.work

LLM оставили только контракт — и нашли ошибку в PETSc из 1997 года

LLM составляет короткий контракт для функции PETSc, эксперт проверяет его, а детерминированный инструмент строит программу для формальной проверки.

Rit.work
Студия разработки
30 сентября 2026 г.3 мин чтения

Материал подготовлен автоматически по первоисточникам: ссылки на них — в конце статьи.

Формальную проверку функций PETSc удалось частично автоматизировать, не поручая LLM писать проверяющую программу. Работа Argonne National Laboratory и University of Delaware нашла в MatAYPX ошибку, которая жила в коде с 1997 года; это нерецензированный препринт, и приведённые числа получены самими авторами. Для команд результат предлагает безопасную границу: модель формулирует проверяемое требование, а исполняемую часть строят обычные инструменты.

LLM пишет только то, что можно быстро проверить вручную

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

Предложенный конвейер оставляет модели более узкую задачу. Она читает документацию и прототип функции, а затем составляет короткий контракт на ограниченном подмножестве ACSL — языка для описания требований к программам на C. Контракт задаёт допустимые входы, ожидаемый результат и части объекта, которые функция может изменить.

Модель не получает доступ к репозиторию PETSc. Это снижает риск, что контракт повторит ошибочное поведение реализации вместо требований документации. В опыте использовали Claude Opus 4.8 с отключёнными инструментами и сохранением сессии.

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

После ручного подтверждения acsl2civl разбирает контракт и детерминированно создаёт проверяющую программу для CIVL. Неподдерживаемую конструкцию инструмент отклоняет, а не заменяет приближением. CIVL символически перебирает состояния и проверяет, что реализация выполняет контракт во всех вариантах внутри заданных границ.

Совпавшие аргументы превратили правильную формулу в ошибочную

Конвейер применили к MatAXPY, MatAYPX и режиму MatFilter без сжатия матрицы. Для MatAXPY уже существовала отдельно написанная эталонная модель, поэтому CIVL сравнивал реализацию и с ней, и с контрактом. Для двух других функций единственным описанием правильного результата служил подтверждённый человеком контракт.

Ошибка проявилась в MatAYPX, которая должна вычислять Y = aY + X. Контракт допускал, что X и Y указывают на одну матрицу: документация не вводит запрета, а реализация предусматривает такой вызов.

MatAYPX сначала умножает Y на a, а затем прибавляет X. Если оба аргумента совпадают, на втором шаге X уже тоже содержит масштабированную матрицу. Функция возвращает 2aY вместо документированного (1+a)Y. Именно сгенерированный отдельный случай для совпадающих аргументов вывел CIVL на нарушение контракта.

MatFilter показал другую сторону подхода: контракт может описывать условное изменение каждого элемента. Значение с модулем не больше заданного порога заменяется нулём, остальные значения сохраняются. Чтобы выразить это правило, разработчики расширили поддерживаемый язык вещественными параметрами, сравнением, модулем и условными выражениями.

Проверка охватывала до двух процессов MPI и матрицы со сторонами до трёх элементов. CIVL работал с плотным логическим представлением матриц; оно скрывает распределённое хранение и не подтверждает свойства разреженных структур. Перенос проверяемой функции в совместимый с CIVL код, модель PETSc, acsl2civl и сам CIVL остаются доверенными частями контура.

Планы меняет не генерация, а граница доверия

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

Практический шаблон можно применять шире PETSc. LLM стоит поручать небольшой декларативный артефакт, который специалист способен прочитать целиком: контракт API, инвариант состояния или набор постусловий. Всё, что создаёт входы, запускает систему и принимает решение о корректности, лучше генерировать детерминированно из уже проверенного описания.

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

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

Источники

Пауза в чтении

Похоже на вашу задачу?

Расскажите, что собираете. За полчаса разложим на этапы и назовём сроки — это бесплатно и ни к чему не обязывает.

Rit.work

Студия разработки

Собираем мобильные приложения и помогаем командам получать от AI реальную пользу. Основатель и команда, работаем удалённо — с клиентами в России и за рубежом.

← Ко всем материалам
Понравилось? Обсудим вашу задачу