LangChain Perde Reasoning Content em Modelos CoT: Como Corrigir o Bug dos Provedores LLM
Desenvolvedores descobriram um bug crítico no LangChain: ChatOpenAI, ChatDeepSeek e outras classes de chat não transmitem o bloco de reasoning content ao integr

Разработчики, работающие с CoT-моделями через LangChain, столкнулись с неприятным сюрпризом: чат-классы фреймворка — ChatOpenAI, ChatDeepSeek и аналогичные — не сохраняют блок reasoning content в финальном ответе. Это означает, что пользователи просто ждут, пока модель «думает», не получая никакой обратной связи, а сами рассуждения бесследно исчезают. Проблема затрагивает интеграцию с большинством популярных провайдеров и агрегаторов LLM.
Когда модель с функцией рассуждения — например, из семейства DeepSeek-R1 или step-3.5-flash от Stepfun — генерирует ответ, внутренний процесс рассуждения фиксируется в отдельном блоке reasoning_content. Именно этот блок и пропадает: ни ChatOpenAI, ни другие чат-классы LangChain не передают его дальше в цепочку обработки.
Почему это важно? CoT-модели (Chain of Thought — цепочка рассуждений) специально обучены формировать явные шаги мышления перед финальным ответом. Разработчики выбирают их именно ради этой прозрачности: возможности показать пользователю, как модель пришла к решению, или использовать промежуточные шаги для последующей обработки в пайплайне.
Когда блок рассуждений теряется — ценность CoT-подхода обесценивается. Отсутствие стриминга reasoning content напрямую бьёт по UX. Пользователь видит пустой экран, пока модель проводит цепочку рассуждений длиной в несколько сотен токенов.
Субъективно ощущаемое время ответа резко возрастает, хотя модель фактически уже работает. Для продуктов, где скорость восприятия критична, это ощутимый недостаток. Автор обнаружил проблему на практике при работе с моделью stepfun/step-3.
5-flash через российского провайдера polza.ai. Провайдер передаёт reasoning content в потоке, однако LangChain его не подхватывает и не пробрасывает дальше.
Ни один из протестированных агрегаторов не решал проблему на своей стороне. Решение оказалось в плоскости расширения стандартных чат-классов LangChain. Суть подхода: переопределить метод обработки потоковых чанков так, чтобы он явно извлекал поле reasoning_content из ответа провайдера и добавлял его в выходную структуру AIMessage.
Таким образом, блок рассуждений становится доступен как в режиме стриминга, так и при обычном вызове модели. На практике это означает создание кастомного чат-класса, наследующего от ChatOpenAI, с переопределением метода _stream и логики сборки финального сообщения. При стриминге reasoning_content начинает отображаться сразу, параллельно с тем, как модель генерирует рассуждения — что принципиально улучшает отзывчивость интерфейса.
Кейс важен не только как техническое решение, но и как симптом более широкой проблемы: фреймворки общего назначения вроде LangChain медленно адаптируются к специфике новых классов моделей. Стандарты API для передачи reasoning content разнятся у разных провайдеров, единого подхода нет — и пока его не появится, разработчикам придётся самостоятельно закрывать пробелы через кастомизацию. Для команд, строящих продукты на CoT-моделях и LangChain, описанный подход даёт готовый шаблон расширения.
Он воспроизводим для любого провайдера, возвращающего reasoning_content в формате, совместимом с OpenAI API.