TL;DR
CONSISTRE — метод, который заставляет LLM не просто извлекать факты из большого текста, а сверять их между собой по трём конкретным логическим правилам: если A связано с B, а B с C — должна быть связь A с C (транзитивность), если A владеет B — B должен быть "во владении" A (симметрия), у одного объекта не может быть двух разных значений одного и того же признака (уникальность). Модель сначала выдаёт список фактов, потом проверяет его по этим трём правилам, находит конкретные нарушения и переписывает список — и так несколько раз, пока противоречий не останется.
Проблема, которую решает метод, знакома всем, кто просил LLM извлечь много связанных фактов из длинного документа: модель обрабатывает каждый факт изолированно и не помнит, что сказала абзацем выше. В итоге в одном месте она пишет "компания А владеет компанией Б", а через десять фактов — что Б владеет чем-то, что противоречит первому утверждению. Просьба "проверь на ошибки" работает плохо, потому что для модели это слишком общая задача — она не знает, какие именно противоречия искать.
CONSISTRE решает это не общей просьбой проверить себя, а тремя конкретными, проверяемыми правилами. Модель получает не "найди ошибки", а точный алгоритм сравнения: пройди по цепочкам А→Б→В и проверь, есть ли А→В; пройди по парным отношениям и проверь обратную связь; пройди по уникальным признакам и проверь, нет ли дублей. Если находит нарушение — говорит модели конкретно, какое, и просит исправить именно его.
Схема метода
ШАГ 1 (промпт 1): Документ + список сущностей + явные формулировки трёх правил консистентности
→ LLM выдаёт первый набор фактов-триплетов (структурированный, машиночитаемый формат)
ШАГ 2 (можно в том же или отдельном промпте): Проверка набора фактов по трём правилам
→ список конкретных нарушений с указанием, какое правило и какие факты нарушены
ШАГ 3 (если нарушения есть — отдельный запрос):
Модель получает точную формулировку нарушения ("цепочка A→B, B→C подразумевает A→C, но её нет")
→ пересмотренный набор фактов
ПОВТОР шагов 2-3, пока нарушений не останется или не достигнут лимит итераций
Все шаги можно делать в одном длинном диалоге с LLM — без API и кода.
Пример применения
Задача: Вы разбираете годовой отчёт крупного холдинга (например, агропромышленной группы с десятком "дочек") и хотите свести структуру владения — кто чем владеет, чтобы не запутаться в противоречивых формулировках отчёта.
Промпт:
Вот текст отчёта холдинга: {текст отчёта}
Извлеки из текста все факты о владении компаниями в формате:
[Компания-владелец] — владеет — [Компания]
После того как составишь список, проверь его по трём правилам:
1. ТРАНЗИТИВНОСТЬ: если А владеет Б, и Б владеет В —
должно быть указано, что А (через Б) связано с В.
Проверь все такие цепочки.
2. СИММЕТРИЯ: если сказано "А владеет Б",
должно логически следовать "Б принадлежит А" —
найди случаи, где одно из утверждений противоречит другому.
3. УНИКАЛЬНОСТЬ: у одной компании не может быть двух разных
контролирующих владельцев одновременно (если явно не указано
совместное владение) — найди дубликаты и противоречия.
Выведи: список найденных нарушений (если есть) → исправленный итоговый список фактов.
Результат: Модель выдаст первичный список фактов о владении, затем отдельным блоком — найденные нарушения с указанием, какое правило сработало и на каких именно фактах, и в конце — исправленную версию списка, где противоречия устранены или явно помечены как неоднозначные.
Почему это работает
LLM плохо держит в голове десятки фактов одновременно и генерирует каждый следующий факт, не глядя назад на все предыдущие — поэтому противоречия копятся незаметно. Просьба "проверь на ошибки" не помогает: это слишком расплывчатая задача, модель не знает, что именно искать.
Зато LLM хорошо справляется с точечной, конкретной проверкой, если дать ей ясное правило и конкретную пару фактов для сравнения. Сравнить два факта на соответствие правилу — это простая, локальная задача, с которой модель справляется намного увереннее, чем с абстрактным "найди ошибку где-то в тексте".
Метод превращает нечёткую задачу самопроверки в три чёткие, механические проверки. Это и убирает двусмысленность — модель не гадает, что от неё хотят, а проходит по конкретному чек-листу.
Рычаги управления: - Число правил — можно добавить свои (например, "если событие произошло раньше даты рождения — ошибка") или убрать неприменимые. - Число итераций рефлексии — для короткого документа хватит одного круга проверки, для длинного может понадобиться 2-3. - Формат вывода — можно попросить показывать промежуточные шаги проверки (для контроля) или только финальный список (для скорости).
Шаблон промпта
Вот текст: {документ}
Извлеки из текста факты о {тип отношений} в формате:
[Объект 1] — {тип связи} — [Объект 2]
После составления списка проверь его по правилам:
1. ЦЕПОЧКИ: если {A связано с B} и {B связано с C} —
должно логически следовать {A связано с C}. Найди пропущенные связи.
2. ОБРАТНАЯ СВЯЗЬ: если {A связано с B каким-то образом} —
должно быть верно и обратное утверждение {B связано с A}.
Найди противоречия.
3. ЕДИНСТВЕННОСТЬ: у {объекта} не может быть двух разных значений
{признака} одновременно. Найди дубликаты.
Выведи:
1) Найденные нарушения (с указанием правила и конкретных фактов)
2) Исправленный итоговый список
🚀 Быстрый старт — вставь в чат:
Вот шаблон CONSISTRE для проверки логической согласованности извлечённых фактов.
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какой тип связей вы извлекаете и какие из трёх правил (цепочки, обратная связь, единственность) применимы к вашей задаче — потому что не каждое правило подходит для любого типа фактов. Она возьмёт паттерн и подстроит формулировки правил под ваш конкретный случай.
Ограничения
⚠️ Работает только для логически связанных фактов: если факты, которые вы извлекаете, никак не связаны друг с другом (например, случайные заметки без внутренней структуры) — правила транзитивности и симметрии просто не к чему применить, метод не даст эффекта.
⚠️ Правила нужно сформулировать самому: метод не ищет противоречия "вообще" — он проверяет только то, что вы явно описали. Если забыли важное правило для своей задачи — соответствующие ошибки не найдутся.
⚠️ Несколько итераций = больше запросов: для простого документа с десятком фактов один круг проверки достаточен, добавление лишних итераций просто тратит время и токены без пользы.
Как исследовали
Исследователи проверяли метод на DocRED — стандартном бенчмарке для извлечения отношений из документов, где нужно найти связи между десятками сущностей в длинном тексте. Сравнивали обычный промптинг (модель просто выдаёт список фактов без проверки) с версией, где добавлены явные правила консистентности и цикл "проверка → исправление". Дополнительно авторы обучали отдельные маленькие модели через fine-tuning и подкрепление (это уже не для чата — там нужен код и датасеты), но нас интересует именно первая часть.
Логика результата понятна: когда модели явно называют типы противоречий, которые нужно искать, она находит и исправляет больше реальных ошибок, чем когда её просят "проверить всё на всякий случай". Инсайт для практики — абстрактная просьба "проверь себя" работает хуже, чем конкретный чек-лист из 2-3 проверяемых правил, даже если правила формулируются простыми словами прямо в промпте.
Ресурсы
CONSISTRE: A Unified Consistency-Aware Framework for Document-Level Relation Extraction with Large Language Models. Mingxuan Sun, Université de Sherbrooke, Canada. IEEE/ACM Transactions on Audio, Speech, and Language Processing.
