Отсутствующее поле и null в ответе LLM: как не стереть данные

Если LLM извлекает изменения профиля, пропущенное поле и явный null могут означать разные действия. Отсутствие телефона часто означает «не менять», а null — «очистить», только если вы именно так определили контракт. Нельзя автоматически заменять все отсутствующие поля пустыми значениями.

Как возникает потеря данных

В профиле уже хранится номер телефона. Пользователь просит: «Поменяйте город на Казань». Извлечение возвращает город и не упоминает телефон. Если обработчик сначала заполняет весь объект значениями по умолчанию, а затем перезаписывает профиль целиком, телефон исчезнет без запроса человека.

ОтветЗначение в выбранном контракте
Поля phone нетСохранить прежний телефон
phone: nullЗапросить подтверждение очистки
phone: ""Ошибка либо отдельное правило
phone: новое значениеПроверить формат и право изменения

Это пример одного контракта, а не универсальное значение null. Некоторые API используют null как неизвестное значение и не поддерживают очистку таким способом. Согласуйте семантику с сервисом, который получает обновление.

Передавайте намерение явно

Для чувствительных изменений удобно разделить значения и операции: «установить город», «удалить телефон», «оставить поле». Тогда схема отражает действие, а не пытается угадать его из пустоты. Модель предлагает изменение, приложение проверяет его допустимость.

Если пользователь не просил очистку, не считайте null достаточным разрешением. Сохраните исходную фразу и список реально подтверждённых изменений. Перед записью можно показать человеку короткий перечень: «Город: Москва → Казань; телефон без изменений».

Минимальный набор проверок

Подготовьте профиль с несколькими заполненными полями и примените ответ, где меняется ровно одно. Все остальные значения должны остаться прежними. Затем проверьте явное удаление, пустую строку, неверный тип и неизвестное поле. Последнее не должно произвольно расширять набор редактируемых свойств.

Сама поддержка structured output в LangChain помогает получить предсказуемую форму. Смысл отсутствия, правила слияния и подтверждение очистки остаются частью вашего приложения. Документируйте их рядом со схемой и используйте одинаковые правила в тестах и обработчике записи.

Этот разбор подготовлен Latorn. Если вы уже знаете основы Python и API и хотите практиковать такие решения системно, сравните программу платного курса LangChain 1.0.x со своей задачей. Открытый пример выше можно проверить самостоятельно; он не заменяет полный проект.

Технические источники: LangChain structured output. Учебные ситуации и числа в статье придуманы для объяснения механизма.

Следующий шаг: LangChain: практические разборы формата, памяти и потоков. По смежным вопросам: Результат инструмента и ответ агента: как не перепутать статусы, Как тестировать LLM-цепочку без вызовов модели.

Продолжить на практике

  • LangChain 1.0.x: c нуля до продакшн LLM-приложений ↗

    Практический курс по LangChain. Соберёте продакшн LLM-бота: RAG по PDF с цитатами, веб-поиск и трекинг заказов, многошаговый агент для анализа CSV и финальное веб-приложение (UI + API). Плюс профессиональные блоки: PromptOps и версионирование промптов, метрики качества RAG, гибридный поиск с реранком, observability/стоимость, надёжность (ретраи, таймауты), guardrails и отдельный модуль по LangGraph для устойчивых workflow. P.S. Полностью обновили материалы на актуальную версию LangChain