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

«Почему DocuChat ссылается на закон, которого нет?»
Такой вопрос неприятен в любом AI-сервисе. В юридическом контексте — особенно. Если модель уверенно пишет, что формулировка противоречит нормативному акту, а самого акта в базе нет, доверие к проверке заканчивается сразу.
DocuChat проверяет юридические формулировки в документах. На вход может прилететь короткий фрагмент договора, а может документ на 100+ страниц. LLM хорошо разбирает язык, находит спорные места, предлагает правки. Но у неё есть обычная проблема: если попросить обосновать вывод, она может сгенерировать ссылку на «подходящий» закон, которого не существует.
Самое неприятное в этом баге — ответ выглядел аккуратно. Не было кривого форматирования или явной бессмыслицы. Ссылка стояла на месте, формулировка была похожа на юридическую, тон уверенный. Проверять глазами каждый такой вывод — значит переносить риск обратно на пользователя.
Сначала смотрели на промпт и нарезку документа
Первый маршрут был ожидаемый: ужесточить инструкцию модели. Попросить ссылаться только на известные нормативные акты, не придумывать номера, явно писать «нет данных», если подтверждения нет.
Это снижает шум, но не решает ошибку как класс. LLM всё равно остаётся генератором текста. Она может не «знать», что конкретной ссылки нет в источниках, особенно если рядом в контексте есть похожие формулировки.
Параллельно смотрели на chunking. Для длинных документов нельзя просто отправить весь файл в модель: контекст ограничен, а стоимость и задержка растут. Поэтому документ режется на чанки, дальше retrieval вытаскивает релевантные фрагменты для проверки.
И тут появилась вторая проблема. Чем меньше чанк, тем проще найти точное место, но тем выше шанс потерять связку с определениями, приложениями или оговорками из других разделов. Чем больше чанк, тем лучше сохраняется контекст, но retrieval начинает приносить более тяжёлые куски, где полезная строка может утонуть в соседнем тексте.
Мы спорили не о том, «какой размер чанка правильный», а о том, где проходит граница между точностью поиска и юридической связностью. Для документов на 100+ страниц это не академический вопрос: одна оговорка в начале может менять смысл пункта в середине.
Причина была не только в контексте
Потеря «большой картины» объясняла часть странных ответов, но не выдуманные нормативные ссылки. Если модель не нашла акт в контексте, она не должна подставлять похожий. Значит, одного retrieval недостаточно.
Мы разделили две задачи:
- анализ текста документа и поиск проблемных формулировок;
- подтверждение каждой ссылки на нормативный акт по авторитетной базе.
LLM может предложить, что именно проверить и как сформулировать замечание. Но ссылка на закон проходит отдельный слой ground truth верификации. Если в ответе появляется нормативный акт, он проверяется по базе. Нет совпадения — ссылка не считается подтверждённой.
Это важное отличие. Модель больше не является единственным источником истины по правовым основаниям. Она участвует в анализе, но финальное подтверждение ссылки делает детерминированная проверка по базе нормативных актов.
Что поменяли в пайплайне
После генерации ответа мы стали вытаскивать из него упоминания нормативных актов и прогонять через проверку. Ответ с неподтверждённой ссылкой не проходит как валидный результат.
Для длинных документов оставили схему chunking + retrieval, но стали внимательнее балансировать размер чанков. Маленькие чанки помогают точнее найти конкретную формулировку. Более крупные сохраняют контекст вокруг пункта. Настройка зависит от типа документа: универсального размера, который одинаково хорошо работает на коротком соглашении и документе на 100+ страниц, не получилось.
В результате у DocuChat появились два разных контура качества. Первый отвечает за то, чтобы модель увидела релевантные части документа и не потеряла смысл. Второй отвечает за то, чтобы юридические ссылки не жили только в тексте ответа.
Теперь самый опасный класс ошибки ловится не просьбой «будь внимательнее», а проверкой по базе. Если нормативный акт не находится, система должна обработать это как неподтверждённую ссылку, а не как красивое обоснование.