Разработчик, создающий приложение для превращения клинических рекомендаций в структурированное представление заболевания, столкнулся с проблемой галлюцинаций LLM. Вместо одного большого запроса к модели он построил pipeline из нескольких этапов, каждый из которых решает узкую задачу. Такой подход позволил снизить количество ошибок, включая семантические галлюцинации, когда модель строит биологически логичную, но не подтвержденную документом связь.
Проект находится на финальной стадии перед релизом. Приложение преобразует клинические рекомендации Минздрава России, например по ожирению, в интерактивную модель: граф патогенеза, knowledge graph медицинских сущностей, временную ленту и обучающие материалы. Каждое утверждение в графе связано с исходным текстом документа. Первая версия использовала один вызов модели с одним prompt и одним JSON, что работало на небольших документах, но ломалось на реальных рекомендациях объемом в сотни страниц.
Проблемы были четырех типов: слишком большой размер результата, обрыв JSON на середине, рассинхронизация сущностей и связей, а также семантические галлюцинации. Например, модель могла создать связь E2 → E7, где E7 не была определена, или построить связь, которая выглядит логично с точки зрения биологии, но не подтверждается конкретным документом. Для медицинского приложения это критично.
Решение — разделить генерацию на три этапа. На первом этапе модель строит макроструктуру патогенеза: стадии заболевания, последовательность процессов, переходы. Для ожирения получается цепочка из 13 стадий, от наследственной предрасположенности до удержания массы и диспансерного наблюдения. На втором этапе модель извлекает сущности — гены, белки, гормоны, клетки, органы, биомаркеры, лекарственные вещества — и присваивает каждой стабильный код, например {“code”: “E17”, “type”: “protein”, “name”: “…”}. Это создает закрытый набор допустимых сущностей.
На третьем этапе модель строит связи, но не может создавать новые узлы: допустимы только связи между уже известными кодами. Если модель предлагает связь с несуществующим кодом, система ее отклоняет. Это решает проблему рассинхронизации. Каждый этап — отдельный вызов модели с проверенным результатом предыдущего, что также уменьшает размер ответов и предотвращает обрывы JSON.
Такой подход не устраняет галлюцинации полностью, но значительно снижает их количество. Остается риск, что модель построит связь, которая подтверждается документом, но неверна с медицинской точки зрения. Однако разделение генерации на этапы — практичный способ повысить надежность структурированной генерации медицинских знаний.

