Потоковый 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: как не стереть данные.
