必须启用Dify 1.13+的JSON Mode原生能力:在模型供应商高级参数中配置response_format.type为json_object、temperature=0、top_p=1,并配合结构化输出中的合法JSON Schema,再通过测试日志验证裸JSON响应及X-Structured-Output-Valid:true。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在 Dify 中实现对 LLM 输出的 100% JSON 格式控制,必须绕过模型自由生成文本的不可控性,直接启用 OpenAI 官方在 2024 年底推出的 JSON Mode 原生能力——它不是靠提示词约束,而是由模型底层强制结构化输出,不满足 schema 就报错重试。Dify 1.13+ 版本已原生支持该模式,但需手动开启且配置项藏得深。
确认你的模型和 API 端点支持 JSON Mode
OpenAI 的 gpt-4-turbo、gpt-4o、gpt-4o-mini 及所有 2024 年后发布的模型均支持 JSON Mode,但前提是调用时使用 /v1/chat/completions 接口,并在请求体中显式传入 {"response_format": {"type": "json_object"}}。如果你用的是自建 vLLM/Ollama 或第三方网关(如 TaoToken、硅基流动),必须确认其后端已透传该字段——很多兼容层默认丢弃未知字段,导致 JSON Mode 实际未生效。
用 curl 快速验证:将你的 BaseURL 替换为实际地址,Key 换成有效值,执行以下命令:
curl -X POST https://your-base-url/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-xxx" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"返回一个包含 name 和 age 的 JSON"}],"response_format":{"type":"json_object"}}'
若返回是纯 JSON(无包裹文本、无解释、无 markdown 代码块),说明后端支持;若返回仍含“当然可以,这是你要的 JSON:```{...}```”,则后端未透传或未升级,【此时在 Dify 里配再细也无效】。
在 Dify 中启用 JSON Mode 的三处关键配置
第一步:进入「设置 → 模型供应商」,找到你正在使用的 OpenAI 或 OpenAI-API-compatible 供应商,点击右侧「编辑」。
第二步:在模型配置表单中,找到「高级参数(Advanced Parameters)」折叠区域,点击展开。此处有三个必填字段,缺一不可:
• response_format.type:输入 json_object(注意不是字符串引号包裹,Dify 会自动转义)
• temperature:必须设为 0(非 0 时模型可能忽略 JSON 约束)
• top_p:必须设为 1(与 temperature=0 配合,关闭随机采样)
第三步:保存供应商配置后,回到工作流编辑器,在任意 LLM 节点中,将「提示词模板」清空或仅保留结构化指令(例如:“你是一个严格遵循 JSON Schema 的数据提取器。只输出合法 JSON,不要任何额外字符。”)。【切勿在提示词里写“请用 JSON 格式回复”——这会干扰原生 JSON Mode,导致格式污染】
搭配 JSON Schema 实现字段级精准控制
仅开启 JSON Mode 只能保证输出是 JSON 对象,但无法约束字段名、类型、必填项。必须配合 JSON Schema 使用:
方法一:在 LLM 节点的「高级设置」中,勾选「启用结构化输出(Structured Output)」→ 点击「编辑 Schema」→ 粘贴标准 JSON Schema(如:{"type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer","minimum":0}},"required":["name","age"]})。
方法二:若工作流需复用同一 Schema 多次,可在「设置 → 知识库 → 结构化 Schema」中新建一个命名 Schema,后续节点直接下拉选择,避免重复粘贴出错。
注意:Dify 会对 Schema 进行预校验,如果语法错误(比如少逗号、引号不匹配),保存时会直接报红,不会等到运行时报错。
测试与排障:如何确认 JSON Mode 已真正生效
① 在工作流中添加一个 LLM 节点,配置好上述三项(response_format、temperature=0、Schema),连接「开始」节点;
② 点击右上角「测试」按钮,输入任意自然语言请求(如:“张三,28岁,北京”);
③ 查看节点输出日志(点击节点右上角「…」→「查看日志」),定位到原始响应体(raw response)部分;
④ 若看到 "response_format":{"type":"json_object"} 出现在请求头或请求体中,且响应体是裸 JSON(无 ```json 包裹、无前导文字),说明已生效;
⑤ 若响应中出现 "error": "invalid_request_error" 且提示 response_format is not supported,说明后端不兼容,需切换模型或更换网关。











