Dify模板节点输出异常的根源在于Jinja2变量未绑定、空值未处理及换行控制缺失;需依次检查Inputs绑定、用default/defined/or过滤器处理空值、用~和减号控制空白,并严格遵循JSON语法规范。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中,模板节点输出为原始大括号、空值或格式错乱,往往不是提示词写得不够好,而是Jinja2变量未绑定、空值未处理、换行控制缺失导致的——这些问题必须在模板节点内部逐层定位,不能靠反复调试模型输出来解决。
确认变量是否真正接入
打开工作流画布,点击Template节点,看「Inputs」区域是否为空。如果为空,说明上游数据根本没连进来,此时模板里写再多{{ name }}也只会原样输出双大括号。
在Inputs区域点击「+ Add input」,输入一个别名(如borrower),然后点击右侧「Select variable」图标,在弹出面板中从上游节点(比如Start节点)选择对应字段。注意:这里选的是字段值,不是画布上节点的显示名称。
【别名必须和模板内引用名完全一致,大小写敏感】
这一步做完后,模板正文里写“借用人:{{ borrower }}”,运行时填“张三”,输出就应是“借用人:张三”。如果还是空,说明绑定失败,返回上一步检查字段路径是否选错。
处理空值与缺失字段
方法一:用default过滤器兜底
{{ note | default('无备注') }} ——当note字段为空字符串或null时,显示“无备注”;但如果字段压根没传(上游未定义该输出),这个写法仍会报错或留空。
方法二:加strict判断防崩溃
{% if note is defined and note %}备注:{{ note }}{% else %}备注:未提供{% endif %} ——这句同时覆盖了字段未定义、字段为空字符串两种情况,比单纯default更鲁棒。
方法三:统一转空字符串再处理
{{ (note or '') | trim | default('未填写') }} ——先用or转空串,再trim去首尾空格,最后default兜底。适合对用户输入清洗要求高的场景。
精准控制换行与空白
第一步:识别问题来源。模板里写两行文字,但输出挤成一行,大概率是Jinja2默认保留所有空白符,包括回车和缩进。
第二步:在变量前后加波浪号~抑制空白。例如:{{ "设备:" ~ device ~ ";状态:" ~ status ~ "。" }},这样无论device前后有没有空格、换行,拼出来都是紧凑的一句。
第三步:对整段结构化文本批量去空。把模板开头加上{%- macro strip() -%},结尾加{%- endmacro -%}没用——Dify不支持宏定义。正确做法是:在每行起始/结尾加减号,比如{%- for item in list -%}{{ item }}{%- endfor -%},这样循环块内外的换行都会被吃掉。
注意:减号只影响紧邻的空白符,多敲几个空格或换行仍会残留。最稳的方式是把整个模板写成单行,靠~连接,再用|replace('\n', '\n\n')补必要换行。
生成结构化JSON输出
在模板正文直接写JSON语法,但必须确保所有字符串用双引号、布尔值小写、数字不加引号。例如:
{ "user": "{{ user_name | tojson }}", "score": {{ score | int }}, "passed": {{ is_passed | lower }} }
【tojson过滤器必须用于任意可能含特殊字符的字符串,否则JSON会因引号嵌套而解析失败】
如果score来自上游是字符串"95.6",不加|int会输出"95.6"(带引号),导致JSON类型错误;is_passed若为Python布尔值True,不加|lower会输出True(首字母大写),JSON不认。
运行前务必用Output节点接住模板输出,并在调试面板点开「Raw output」看是否为合法JSON——不能只看预览框里的渲染效果。
嵌套循环与索引控制
当上游传入的是列表(如rag_results),需用for遍历。基础写法:{% for doc in rag_results %}{{ doc.title }}{% endfor %}。
要加序号且避免末尾多逗号,用loop.last判断:{% for doc in rag_results %}{{ loop.index }}. {{ doc.title }}{% if not loop.last %}、{% endif %}{% endfor %}。
如果列表为空,整个区块不显示,可加一层包裹:{% if rag_results %}检索结果:{% for doc in rag_results %}…{% endfor %}{% else %}未找到相关内容{% endif %}。


















