Добрый день, это моя первая статья на Хабре, прошу не судить строго.
Я хочу рассказать вам немного о моём исследовании и то как стоит честно относиться к LLM моделям, так как вы скорее всего знаете, что такое LLM модель не будем терять времени на её определение давайте перейдём к сути моей работы: LLM не дают гарантии правильности ответа особенно операций с большим количеством шагов и формальным рассуждением, даже когда ответ правдоподобный или оказывается верный. (Вы же все видели дисклеймер ChatGPT can make mistakes.Check important info)
Начнём с самого начала 4 сентября 2025 года прошло исследование о галлюцинациях в моделях (в котором участвовали инженеры OpenAI), и одно из утверждений было, что даже при наличии безошибочных обучающих данных статистическая целевая функция, минимизируемая в процессе предварительного обучения, приведет к языковой модели, генерирующей ошибки, почему же это так потому, что сама природа LLM моделей вероятностная.
Но так как мы живём в мире где мы внедряем системы LLM повсюду появляется закономерный вопрос как же верифицировать LLM и тут у инженеров есть готовый по их мнению инструментарий, который массово внедряется:
RAG (Создание баз знаний)
fine-tuning (до-обучение моделей)
Человеческий контроль (Human control)
Более мощные LLM с большим количеством параметров (на 120b, на 200b и так далее)
Но эти инструменты созданы не для верификации LLM, а для снижении ошибок, но сами по себе не создают гарантии правильности ответа и тут мы приходим к нашей основной части, а как же тогда верифицировать эти LLM модели?
Моя идея состоит, что у нас есть математическая теория доказательств, а также можно сделать сертификацию входящего сообщения, то есть давайте создадим
Сообщение, которое должно быть в установленном формате
Создадим минимальное ядро для верификации данных в моём случае послужило ядро верификации на основе Hilbert system из теории доказательств.
Пример моего сообщения из certificate.schema :
В чём же сам модуля верификации:
JSON декодируется с DisallowUnknownFields(), то есть лишние поля мы сразу запрещаем (только в том виде, котором мы собираемся общаться)
-
Затем проводим верификацию сообщения (проверяем структуру сообщения)
есть у него поля заявленные в сертификате (proof_id, goal, context, steps)
версия сертификата соответствует(certificate_version == «1.0.0»)
и другие параметры, которые вы можете посмотреть в функции
-
После верификации если она пройдена:
соединяем с нашей базой правил
проверяем синтаксис
парсим goal, assumptions и каждую формулу шага
проходим шаги по порядку и валидируем их как assupmtion(предпосылка), axio(аксиома) или modus_ponens(правило вывода)
в конце проверяем, что последняя выведенная формула равна параметру goal во входящем сообщении
Какие ограничения я наложил на систему:
Мы пользуемся очень маленьким языком:
переменные
отрицания !
импликация → (если..., то...)
скобки
Для бизнес-правил нам на самом деле не требуется так много операций большинство решаются именно вышеуказанным списком создав композицию из нескольких утверждений.(если ..., то ...) (если ..., то не ...).
Я понимаю, что это не универсальный язык для всего, а намеренно узкий проверяемый слой.
Мы написали этот инструмент верификации, но что же дальше.
Дальше мы учим модель LLM prompt условиями (конфигурация промптов) создать кандидата на верификацию, то есть мы не разрешаем LLM модели сразу нам говорить ответ какой она захочет, а он проходит в наш модуль верификации и должен быть там проверен:
Вот полная архитектура моей модели верификации LLM:
задача → prompt → LLM → candidate certificate → Hilbert verifier → accept/reject
Генерацией кандидатов у меня занимались модели (через ollama (пришлось взять plus пакета сообщений оказалось не очень много да и даже gpt-oss:20b нагружает не слабо видеокарту и медленно достаточно работает)):
deepseek-v3.1:cloud:
glm-5:cloud
gpt-oss:120b-cloud
gpt-oss:20b-cloud
Основные результаты исследования:
Pack |
Cases |
Observations |
Pass |
Pass Rate |
False Refusal |
False Accept |
Schema |
Parse |
Kernel |
Contract |
Format |
cases/phase1-expanded-100.csv |
100 |
4000 |
2649 |
66.22% |
98 |
0 |
273 |
0 |
162 |
0 |
14 |
Давайте явно рассмотрим пример успешного и не успешного ответа:
cases‑V2E01
Нам нужно доказать «R → S», имея в предпосылка «R → S» для нас это достаточно просто это тождественно равные понятия от модели LLM мы ждём, что она не придумает новую математику, а корректно оформит её в виде сертификата.
Задача V2E01: «R→S»
Вот пример успешного созданного кандидат:
{ // Начало объекта сертификата доказательства. "certificate_version": "1.0.0", // Версия формата сертификата. // Должна совпадать с поддерживаемой схемой сертификатов. "proof_id": "V2E01", // Идентификатор доказательства/кейса. // Должен совпадать с ID тестового примера или benchmark-case. "goal": "R -> S", // Целевая формула, которую сертификат должен вывести. // Финальный проверенный результат должен совпасть именно с этой формулой. "context": { // Метаданные о том, в каком формализме и для какого benchmark-а выдан сертификат. "domain": "hilbert-benchmark-v1", // Идентификатор домена/набора задач. // Используется для проверки, что сертификат относится к ожидаемому benchmark-контексту. "rule_pack": "classical-hilbert-v1", // Набор правил вывода. // Здесь: классическая гильбертовская система. "syntax": "hilbert-prop-ascii-v1", // Идентификатор синтаксиса формул. // Здесь ожидается ASCII-нотация пропозициональной логики. "generator": "llm-benchmark-v1" // Источник/тип генератора сертификата. // Это метка происхождения, а не сам шаг вывода. }, // Конец блока context. "assumptions": [ "R -> S" ], // Верхнеуровневый список допущений. // На них потом ссылаются шаги вида "assumption". // Здесь допущение одно: "R -> S". "steps": [ // Список шагов доказательства. // Шаги проверяются по порядку; первый шаг имеет номер 1. { "kind": "assumption", // Тип шага. // "assumption" означает: этот шаг не выводит новую формулу, // а берет одну из формул из массива assumptions. "assumption_ref": 1, // Ссылка на элемент в массиве assumptions. // ВАЖНО: индекс здесь 1-based, не 0-based. // То есть 1 означает assumptions[0]. "formula": "R -> S" // Формула, заявленная на этом шаге. // Для шага kind="assumption" она обязательна // и должна совпадать с формулой из assumptions по указанному assumption_ref. } // Единственный шаг доказательства: // "берем первое допущение, а это и есть R -> S". ] // Конец списка шагов. }
вот пример не успешно созданного кандидат:
{ "certificate_version": "1.0.0", "proof_id": "cases-V2E01", "goal": "R -> S", "context": { "domain": "hilbert-benchmark-v1", "rule_pack": "classical-hilbert-v1", "syntax": "hilbert-prop-ascii-v1", "generator": "llm-benchmark-v1" }, "assumptions": [ "R -> S" ], "steps": [ { "kind": "assumption", "assumption_ref": 1 } ] }
В не успешно созданном сертификате у нас отсутствует согласованное по верификации поле «formula», почему же нам так важно это поле, нам нужно как происходила логическая последовательность рассуждений, так бы мы просто проверяли входное и выходные ответы, а не логическую последовательность внутри нашего сертификата.
V2E01 — entailed / assumption_import / easy
— Goal: R -> S
— Assumptions: R -> S
— Comment: Import a single assumption directly
Model |
Prompt |
Surface |
Runs |
Pass |
False Refusal |
False Accept |
Request Failure |
Schema Failure |
Parse Failure |
Kernel Failure |
Format Failure |
Latest Run |
compatible:deepseek-r1:14b |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
0 |
0 |
0 |
0 |
10 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-deepseek-r1-14b-r10 |
compatible:deepseek-v3.1:671b-cloud |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
0 |
0 |
0 |
0 |
10 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-deepseek-v3-1-671b-cloud-r10 |
compatible:glm-4.7-flash:latest |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
0 |
0 |
0 |
10 |
0 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-glm-4-7-flash-latest-r10 |
compatible:glm-5:cloud |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
3 |
0 |
0 |
0 |
7 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-glm-5-cloud-r10 |
compatible:gpt-oss:120b-cloud |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
5 |
0 |
0 |
0 |
5 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-gpt-oss-120b-cloud-r10 |
compatible:gpt-oss:20b |
hilbert-ai-verification-benchmark-v1.3 |
direct |
10 |
0 |
0 |
0 |
0 |
10 |
0 |
0 |
0 |
mixed-20260401_phase1-matrix-gpt-oss-20b-r10 |
Почему же так: всего не хватает «formula»: «R -> S», значит надо поменять promt, отчасти вы будете правы, но этот пример сам по себе не доказывает, что модель не способна решить такие задачи при другом promt или другой оболочке. Он показывает, что даже в простом случае модель может не превратить уже данное истинное утверждение в правильный формальный сертификат внутри нашего протокола.
Код я писал на Go, так как только изучаю мне помогал с этим Codex, мною проверена сама логика верификации + также выборочно проверены raw/result в artifacts, также буду очень благодарен если вы тоже посмотрите данный репозиторий и указали мне на ошибки или поможете в развитии кодовой базы для создания такого ядра верификации и исследовании других моделей и их пороги знаний.
Что доказано, а что нет:
Исследование показывает:
LLM может выдать корректный сертификат, но делает это не стабильно
Ядро верификации не даёт пройти некорректным кандидатам
В узких классах задач это даёт рабочую границу доверия
Что исследование не показывает:
Что LLM «Вообще не умеют рассуждать»
Что ядро верификации уже готово для любого вида бизнес процессов
Что RAG/fine-tuning бесполезны
Что мои логические кейсы покрывают все реальные кейсы.
Большие языковые модели умеют выдавать убедительные ответы даже там, где у них нет формальной гарантии правильности. На практике это особенно опасно в задачах, где нужен не просто «похожий на правду» текст, а строго проверяемый результат: правило, решение, вывод, доказательство, разрешение бизнес-операции.
Идея проста: не доверять свободному тексту модели, если его нельзя проверить. Если LLM действительно смогла построить правильный вывод, это должно проявиться в виде сертификата, который проходит строгую верификацию. Если не смогла, система должна сказать не «похоже верно», а «сертификат отклонён».
LLM модели я правда считаю одним из прорывов человеческих технологий, но задумайтесь насколько вы или ваша компания готовы ответственно принимать такие ошибки и сколько стоят вам исправлять эти ошибки.
В дальнейших статьях я хочу рассказать о более подробных выводах и продолжу развивать свое исследование особенно мне интересно перенести это на бизнес-правила, которые можно будет использовать для безопасной интеграции LLM.
Также хочу отметить научную статью Neural Theorem Proving for Verification Conditions: A Real-World Benchmark научное сообщество стремится к верификации логического рассуждения LLM моделей используя автоматические системы математических доказательств(Lean, Rocq, Isabelle) для того, чтобы верифицировать логические последовательности.
Я пришёл к тем же выводам о проблемах LLM моделей, которые получены в результате их исследования прошу посмотреть разделы данного исследования: "5.1 Results" и "5.2 Error Analysis of NTP models". (вот бы я ещё раньше бы нашёл, а не после первых промежуточных исследований, которые заняли 5 дней)
Дисклеймер: У меня не было предпосылок делать такое же исследования узнал я о нём позже, но моя попытка изучить данную проблему в упрощённом её варианте без использования сложных программ автоматического доказательства, которые использовались в исследовании, привела меня к данной статье, которую я считаю показателем, что внедрение LLM моделей требуют комплексного анализа, проработок и принятия рисков, которые они несут без внедрения систем верификаций и создания границ доверия.
Открытый Github для более подробного изучения и результатов моего исследования
Открытый Github исследования, также полезно посмотреть вам
Нужно ещё многое сделать:
полноценно внедрить Lean для исследовательских задач, кстати кто не видел посмотрите это правда интересная программа особенно для математиков.
Добавить, чтобы провайдером была не только ollama, но и можно было подключать через llm.c модель, так как не все модели есть в ollama.
Провести исследования на других моделях.
Расширить языковую модель ядра верификации.
Добавить новые гипотезы для исследования, тогда можно будет точнее определять границу доверия к моделям.
Ссылки на литературные источники:
Neural Theorem Proving for Verification Conditions: A Real-World Benchmark
Why Language Models Hallucinate
AA-Omniscience: Evaluating Cross-Domain Knowledge Reliability in Large Language Models
Emerging Risks of AI-to-AI Interactions in Health Care: Lessons From Moltbook
Комментарии (10)

Real_Egor
10.04.2026 04:58Как по мне, то ты пошел +- правильным путем (в плане экстракции нужных переменных и верификации метода)... но вышел не туда. Ты хочешь все решать "вовне" (инструментами). Таким образом ты может быть выловишь часть галлюцинаций, Но никак не уменьшаешь их количество и не контролируешь их.
---
https://github.com/RealEgor/re-think_protocol
посмотри на мой протокол, я все эти же проблемы решаю внутри ЛЛМ, внутри контекстного окна.
Сейчас заканчиваю следующую версию, готовлю Haiku, чтобы она "побила" Sonnet и Opus на топовом бенчмарке HLE. Так вот, для того, чтобы Хайку начала догонять топовые модели мне, по сути, пришлось убрать галлюцинации на 99%, так как даже "маленькое допущение" в логике рассуждения - это фиаско на задачах уровня доктора наук.
(залью вторую часть в репозиторий, думаю, через неделю. Сначала нужно пройти тесты и подготовить переводы на разные языки + описание ридми)
мое личное мнение. Модель можно почти полностью отучить от галлюцинаций, хоть это сделать и не просто. Но! делать это нужно только ВНУТРИ контекстного окна. Со стороны можно фиксировать глюки, не больше.
Real_Egor
10.04.2026 04:58Общая рекомендация
Если хочешь победить врага - сначала пойми его.
Если хочешь победить галлюцинации - категоризируй их и разбери причины их возникновения.

WinPooh32
10.04.2026 04:58Модель можно почти полностью отучить от галлюцинаций
Это как? Модель не знает все ответы, ей приходится их интерполировать на основе знаний, которые в неё заложены (в которых точно есть ошибки).
По-моему это тоже самое, как по двум точкам попытаться найти всю функцию (в простейшем случае будет работать :)).
Со стороны можно фиксировать глюки, не больше.
Чтобы их фиксировать нужно знать правильны ответ, а мы же его как раз на практике и не знаем.
Возможно, вы просто смогли подогнать результаты под конкретные бенчмарки.

Real_Egor
10.04.2026 04:58Дано: Хайку и Опус и Соннет обучены на одинаковых датасетах - это факт. Они обучены на одной и той же выборке "всего интернета", который отфильтровал Атропик (я не беру в расчет RLHF - это уже тонкая настройка. я про именно научные дата-сеты и материалы)
Об остальном пока не скажу, дай закончить эксперимент и выложить результаты прохождения бенчмарка. Но я совсем не подгоняю результат. Я "обучаю модель правильно и логично размышлять", "сомневаться в своих выводах", "копаться и разбираться в своей уверенности", "внимательно составлять план и аккуратно ему следовать". Это в целом универсальные механики, которые человеку свойственны, и которые противоречат "регрессивной природе ЛЛМ".
re!solve протокол у меня вышел большой, около 600 строк и 8500 токенов, однако с ним младшие модели уже ощущают себя вполне увереннее. На случайной выборке в 5 задач gemini flash смогла найти все нужные для решения формулы и факты внутри своих весов, хотя при первичном анализе задачи она помнила это все очень смутно и хотела генерировать галлюцинацию.
Следи за репо -) там будет обновление. Ну и статью я выложу на хабр и на хаккер-ньюс

Nikolay_Nam Автор
10.04.2026 04:58Я специально не вношу это внутрь LLM потому, что внешняя детерминированная система не должна смешиваться с вероятностной LLM, она говорит ей “да/нет/не знаю” вот только от этого можно прямо сказать корректный вывод или нет.
А когда вы смешиваете определенный ответ с вероятностным у вас получится всё равно вероятностный ответ, таким образом вы маскируете проблему, а не явно её отслеживаете.

Real_Egor
10.04.2026 04:58тут все сложнее...
Во-первых, когда вы выносите оценку во внешнюю среду, как я и говорил, вы работаете с фактом случившейся галлюцинации. Но не предупреждаете ее. Как вы сможете оценить, сгаллюцинировала ли модель?
Во-вторых, я не заставляю ее "просто оценить уверенность" (для того же Опуса... это как спросить Эншейна, уверен ли он в себе? да Опус знает про нашу науку больше, чем кто бы то ни было в этом мире... конечно он скажет "уверен")... Я ставлю модель в такие условия, когда ей "сгаллюцинировать" будет дороже, чем дать выверенный ответ. Это может звучать сложно, но это и есть ключик к ответу... Модель ищет всегда самый легкий и дешевый путь - самый "вероятный токен". Так сделай так, чтобы "самым вероятным" стал "самый корректный", а ложь и халтура для модели стали "когнитивно затратными".
WinPooh32
В llama.cpp есть возможность заставить следовать модель заданной грамматике на этапе сэмплирования. Только это не гарантирует, что результат будет осмысленный, если в промте не рассказать нейронке про правила языка. Если все сделать правильно, то можно даже слабые модели, которые плохо следуют инструкциям по формату ответа, заставить давать осмысленный результат.
Nikolay_Nam Автор
Цель данного исследования была для того, чтобы модель не шла по заданной грамматике, а то чтобы модель должна следовать логической последовательности
В моём примере cases‑V2E01 явно указан, что модели сложно перенести логическое утверждение, как раз таки гарантия проверяется внутри детерминированного ядра(hilbert system), который проверяет не семантику, а формулы выведения и проверяет ответ, в вашем предложении вы только исправляете текст нейронной сети, но то как она последовательно логически придёт к выводу вы не решите, за вас это должна сделать детерминированная строгая математическая модель, а внутри github исследования есть данные, что чем больше вы загружаете логических цепочек тем сильнее ваша LLM модель будет путаться в логических переходах.
Ваш аргумент "заставить давать осмысленный результат" вашим способом вы получите, только формальность, ответ который будет устраивать вас визуально и семантически в этом и заключается это иллюзия правдоподобности, а не создание логически верного ответа, таким образом можно замаскировать проблему, а не её решать (а решают её только детерминированные строгие системы).
P.S. Вы сколько угодно можете чинить своими сложными промтами, внешними инструментами, добавлять туда RAG, делать LLM-as-judge и т.д. на эти LLM модели, но вы не почините их логику работы, повторюсь из исследования природа LLM моделей вероятностная, в начале статьи прямо написано даже при безошибочных обучающих данных данных приведет к языковой модели, генерирующей ошибки.
WinPooh32
Так в этом и их сила, что они позволяют решать задачи, где входные данные недетерминированы. В остальных вопросах классические алгоритмические системы будут лучше, быстрее и точнее. Принудительное следование грамматике лишь позволяет более корректно преобразовать входные данные в что-то более определенное для последующей формальной обработки. При данном преобразовании всегда будет какой-то процент ошибок, т.к. ни обучающие, ни входные данные на 100% не будут корректны. Во многих задачах решение “на глаз” вполне ок, с чем LLM идеально справляются. Просто потому что нельзя добиться детерминизма там, где его просто нет. А построение формальной логики в данной среде создаст иллюзию. Максимум можно построить огород из конкретных условий, где на этой модели уже можно решить задачу уже формально, но не всегда это будет работать в реальном мире, где условия будут меняться на ходу.
Nikolay_Nam Автор
Вы снова спорите не с тем, что написано у меня, а с более удобной для вас версией тезиса.
Я нигде не утверждаю, что можно “формализовать весь реальный мир”; в статье прямо сказано обратное: я беру маленький логический язык и строю намеренно узкий проверяемый слой.
Мой тезис не в том, что LLM надо запретить быть LLM(тавтология здесь уместна :) ), а в том, что её ответ нельзя принимать на доверии там, где нужна корректность.
Поэтому система у меня не говорит “наверное правильно”, а говорит: “прошло проверку / не прошло / недостаточно данных”. Меняющийся бизнес-контекст — это проблема обновления входных данных и правил, а не аргумент против самой верификации.
Вы, переносите инженерные проблемы на математическую логику и объявляете это её недостатком.
Перечитайте статью: вы сейчас возражаете не моей статье, а своему пересказу статьи.