Отсутствующее поле и 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
