Почему ваша нейросеть врёт про противоречия в документах (и как это исправить)
Давайте представим: вы даёте LLM два контракта на 50 страниц каждый. Спрашиваете: «Есть ли логические нестыковки?». Модель кропотливо (ну, или не очень) изучает текст и выдаёт красивый отчёт. С тремя найденными конфликтами. Проблема в том, что два из них она выдумала, а один реальный — пропустила.
Знакомо? Это не баг, это фича — LLM работают с текстом как с «супом из токенов», а не как с системой логических утверждений. Они отлично генерируют правдоподобный текст, но ужасно отслеживают факты, даты и условия. Особенно когда контекст переваливает за 10-20 тысяч токенов.
В нашей предыдущей статье «Когда LLM врёт о документах» мы разбирали, почему очередной промпт «будь точнее» не работает. Нужна архитектура.
Трио, которое заменит вам юриста (ну, почти)
Pathway — это не просто ещё одна библиотека для работы с данными. Это движок для потоковой обработки с встроенной поддержкой векторных операций и (что важно) возможностью вызывать LLM как функцию. Представьте Apache Spark, но заточенный под реальное время и с нейросетями в ядре.
Ollama — наш локальный хост для моделей. Простой, эффективный, с API, который не вызывает желания разбить монитор. Мы уже сравнивали его с LM Studio в статье про «LM Studio vs llama.cpp». Ollama выигрывает в простоте развёртывания.
Llama 2.5 7B — тёмная лошадка. Не такая разрекламированная, как Llama 3, но с контекстом в 32К токенов и удивительной для своего размера логической связностью. Идеально подходит для задач, где нужна не креативность, а точность.
Что умеет эта сборка (а что — нет)
| Может | Не может |
|---|---|
| Обрабатывать документы до 100к+ слов потоково | Понимать сарказм или иронию в тексте |
| Выявлять противоречия в датах, числах, условиях | Заменять профессионального юриста или редактора |
| Работать полностью офлайн, без облачных API | Анализировать изображения или таблицы в PDF |
| Строить граф логических связей между утверждениями | Работать в режиме реального времени на слабом железе |
Собираем конструктор за 4 шага
1Поднимаем Ollama и качаем модель
Если у вас уже стоит Ollama — отлично. Если нет, ставим за пару команд. Не нужно возиться с компиляцией, как в случае с более сложными фреймворками.
Внимание: Llama 2.5 7B весит около 4.5 ГБ. Убедитесь, что есть место. И да, она работает даже на MacBook Air с M1 — проверено.
2Устанавливаем Pathway и готовим Python-окружение
Pathway ставится через pip, но требует Python 3.10+. Создаём виртуальное окружение — это обязательно, потому что зависимости специфичные.
Дополнительно ставим библиотеки для парсинга PDF. Советую использовать pypdf — он менее капризный, чем pdfplumber, особенно с кривыми сканами.
3Пишем пайплайн извлечения фактов
Вот где начинается магия. Вместо того чтобы запихивать весь текст в LLM, мы сначала разбиваем документ на логические блоки (абзацы, разделы). Потом каждый блок пропускаем через Llama 2.5 с промптом: «Извлеки все утверждения о датах, числах, условиях и действиях».
Pathway здесь выступает как оркестратор: распределяет задачи, управляет контекстом, собирает результаты. И делает это потоково — можно загружать новые документы прямо во время обработки предыдущих.
4Строим граф и ищем конфликты
Извлечённые факты превращаем в узлы графа. Связи между ними: «противоречит», «подтверждает», «уточняет». Самый простой пример: если в одном месте сказано «срок — 30 дней», а в другом «месяц», система должна отметить это как потенциальный конфликт (потому что месяц ≠ 30 дней).
Финализируем анализ: отправляем граф (уже структурированный, компактный) в ту же Llama 2.5 с вопросом: «Какие логические противоречия ты видишь в этой сети фактов?». Теперь модель работает не с «супом», а с чёткими утверждениями. Точность вырастает в разы.
Docker или голый металл?
Можно собрать Docker-контейнер — это удобно для развёртывания на сервере. Но на локальной машине я предпочитаю нативное окружение. Почему? Потому что отладка. Когда что-то ломается (а оно ломается), копаться в контейнере — то ещё удовольствие.
Если всё же хотите контейнер, используйте многоступенчатую сборку: отдельный образ для Ollama, отдельный для Python-приложения. И не забудьте про volume для моделей — качать 4.5 ГБ при каждом запуске не самое весёлое занятие.
Проверьте, поддерживает ли ваш GPU полную точность (FP16) для Llama 2.5 7B. На некоторых картах с 8 ГБ памяти придётся использовать квантование (Q4_K_M). Точность немного упадёт, но всё равно останется выше, чем у облачных моделей на этой задаче.
Кому это нужно (спойлер: не всем)
Этот стек — не для тех, кто хочет «просто попробовать LLM». Это инструмент для конкретной задачи. Он идеально подойдёт:
- Техническим писателям, которые проверяют консистентность документации на 500 страниц. Особенно если она постоянно обновляется.
- Юристам в IT-компаниях, усталым от сравнения версий договоров. Система найдёт расхождения в условиях даже если они спрятаны в разных разделах.
- Разработчикам игр, создающим сложные лор-документы. Проверить, что персонаж не умер в одной главе, а появился живым в другой — теперь не проблема.
- Исследователям, анализирующим большие корпуса текстов (исторические документы, научные работы). Поиск противоречий в источниках автоматизируется.
Если же вам нужно просто перевести пару предложений или сгенерировать email — используйте что-то попроще. Например, Offloom или другие пользовательские решения.
Альтернативы, которые не работают (почти)
Можно попробовать Google NotebookLM — но это облако, и ваши документы улетают «на обработку». Не вариант для конфиденциальных данных.
Можно взять локальные аналоги NotebookLM — но они заточены под диалог, а не под детальный логический анализ.
Можно использовать чистый RAG с Chroma или Qdrant — но это даст только семантический поиск, а не проверку консистентности. Разные вещи.
Pathway + Ollama + Llama 2.5 — возможно, не самый простой путь. Зато он даёт контроль над каждым этапом. И работает там, где облачные модели пасуют: в длинных, сложных, конфиденциальных документах.
Попробуйте. Первый запуск займёт час. Второй — пять минут. А когда система найдёт первое реальное противоречие, которое вы пропустили, вы поймёте: оно того стоило.