Chatflow: reasoning content not displayed when reasoning_format=separated (follow-up to #37184)

此问题出现在用户使用 Dify 构建的 Chatflow 中,当添加一个 LLM 节点(使用支持推理的模型,如 DeepSeek R1)并连接至 Answer 节点时,在 LLM 节点设置中开启 Reasoning Tag Separation (设置 reasoning_format = sepa

Chatflow: reasoning content not displayed when reasoning_format=separated (follow-up to #37184)

Chatflow: reasoning content not displayed when reasoning_format=separated (follow-up to #37184)

快速结论:在使用 Dify Chatflow 构建推理模型(如 DeepSeek R1 等)并开启“分离推理标签”模式(reasoning_format = separated)时,流式对话的“深度思考”面板不显示推理内容。根本原因是 Dify 缺少专用的流式事件通道来传输推理内容,导致 separated 模式下推理内容被丢弃。目前尚无官方修复,需要等待 Dify 新增 SSE 事件类型。

问题场景

此问题出现在用户使用 Dify 构建的 Chatflow 中,当添加一个 LLM 节点(使用支持推理的模型,如 DeepSeek R1)并连接至 Answer 节点时,在 LLM 节点设置中开启 Reasoning Tag Separation(设置 reasoning_format = separated),然后以流式模式与应用对话。

报错原文

Dify has no out-of-band channel for reasoning; the panel relied entirely on inline  in the answer stream, so separated mode now has no consumer for reasoning_content.

Dify's Chatflow streaming has no dedicated SSE event type for reasoning content.
The existing StreamEvent enum includes TEXT_CHUNK, AGENT_THOUGHT, NODE_STARTED/NODE_FINISHED, etc., but nothing like REASONING_CHUNK or REASONING_CONTENT.

NodeFinishStreamResponse.to_ignore_detail_dict() nullifies all outputs (including reasoning_content) for non-debugger invocations.

原因分析

Dify 在之前的修复(PR #37168)中正确地通过 ThinkStreamFilter 流式过滤掉了 <think> 标签,解决了推理内容泄漏到最终回答中的问题(tagged 模式)。但是,该修复没有同时建立独立的推理内容传输通道。具体原因分为两层:

  • 流式通道缺失: Dify 的流式事件(StreamEvent)枚举中没有 REASONING_CHUNKREASONING_CONTENT 这类专用于传输推理内容的事件类型。此前“深度思考”面板完全依赖从 answer 流中解析内联的 <think> 标签内容来显示推理过程,当设置 reasoning_format = separated 后,推理内容被单独剥离,而前端没有新的消费者来接收这些剥离后的数据。
  • 输出过滤: 在简单模式/终端用户模式下,NodeFinishStreamResponse.to_ignore_detail_dict() 会清除所有输出中的 reasoning_content 字段。这意味着即使 LLM 节点返回了非流式的推理内容,在非调试器中也会被过滤掉。

环境排查

  • Dify 版本: main 分支(在 #37184 修复之后)。该问题存在于当前最新开发版本中。
  • 部署方式: Self Hosted (Source) — 自行通过源码部署。
  • 模型类型: 任何支持推理输出的模型(如 DeepSeek R1、Qwen 等),在 LLM 节点中启用 reasoning_format = separated
  • 模式: Chatflow 的流式输出模式。

解决步骤

由于这是一个 Dify 架构层面的缺失,需要等待 Dify 官方实现新的基础设施。以下是 Issue 中开发者确认所需的关键修复步骤,以便社区贡献者或关心该问题的用户参考:

  1. 新增 SSE 事件类型: 在 Dify 后端的流式事件枚举(StreamEvent)中增加一个新的事件类型,例如 REASONING_CHUNKREASONING_CONTENT,用于在流式过程中专门传输推理令牌(reasoning tokens)。
  2. 更新输出过滤逻辑: 修改 NodeFinishStreamResponse.to_ignore_detail_dict() 方法,将 reasoning_content 字段添加至白名单,使其即使在简单模式/终端用户模式下也能通过。
  3. 前端开发支持: Dify 前端需要增加对新增 SSE 事件类型的监听和渲染逻辑,以在“深度思考”面板中实时显示接收到的推理内容。

当前解决方案: 在官方修复前,可使用 reasoning_format = tagged 模式替代,该模式下推理内容仍会以内联 <think> 标签形式嵌入在回答流中,从而继续使用现有的“深度思考”面板显示逻辑。

验证方法

  1. 查看网络请求: 在浏览器开发者工具中检查 Chatflow 的流式 SSE 连接,查看是否存在 REASONING_CHUNK 类型的事件传输。
  2. 检查前端面板: 在流式对话进行时,观察“深度思考”面板是否实时显示推理文本。
  3. 切换标签模式验证: 将 LLM 节点的 reasoning_format 设置回 tagged,确认“深度思考”面板可以正常显示推理内容,以排除其他问题。

参考来源

langgenius/dify #37439

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 9588

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注