Потоковый JSON от LLM: почему нельзя исполнять незавершённый ответ

При потоковой генерации объект JSON появляется частями. Промежуточный фрагмент подходит для предварительного отображения, но ещё не является готовой командой. Запускайте действие после завершения, проверки структуры и бизнес-правил.

Почему раннее исполнение меняет смысл

Учебный поток сначала содержит {"amount":10, затем дополняется до {"amount":1000,"currency":"RUB"}. Интерфейс может кратко показать 10, но приложение не должно начинать платёж по такому префиксу. Более того, финальный ответ может завершиться ошибкой и вовсе не содержать допустимого объекта.

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

Разделите состояния интерфейса

СостояниеРазрешённое поведение
Получаем фрагментыПоказывать помеченный предварительный текст
Поток завершёнСобрать объект и проверить его
Объект прошёл проверкиПредложить точное подтверждение действия
Обрыв или отменаНе выдавать черновик за завершённый результат

Номер версии результата помогает не перепутать подтверждённый объект с новой попыткой. Когда пользователь одобряет действие, фиксируйте именно проверенные параметры. Последующие фрагменты не должны незаметно их изменить.

Протокол проверки

Разрежьте известный тестовый JSON в нескольких местах: внутри числа, строки и перед закрывающей скобкой. На каждом префиксе проверьте отсутствие побочного эффекта. Затем передайте полный объект и убедитесь, что валидация запускается один раз.

Отдельно оборвите поток перед концом, пришлите неверный тип и отмените запрос после отображения черновика. В журнале должны различаться «получен фрагмент», «сформирован результат» и «выполнена операция». Это разные события.

LangChain поддерживает потоковые обновления, но форма событий зависит от выбранного интерфейса и версии. Подбирайте обработчик по текущей документации и не переносите настройки новой версии в старую без проверки. Архитектурная граница между показом и исполнением остаётся полезной при любом поставщике модели.

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

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

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