Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析|6大应用场景实战
这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模板转换节点。
很多小伙伴希望想看Dify工作流的方式,毕竟这样才能在业务落地
但要想实现这个,前提是要掌握 Dify 的一个神器——模板转换。
以下内容是纯知识干货,适合转发收藏起来逐个跟着实践。看完能应对 80% 的「动态文本生成」高频场景。
Dify的模板转换节点,基于强大的Jinja2模板引擎,为AI应用开发者提供了在工作流中进行灵活数据转换与动态文本生成的核心能力。
它允许开发者通过简洁的模板语法,轻松实现文本拼接、格式转换、数据结构重组等多种操作,从而优化数据流转效率,增强应用输出的个性化与智能化。
本文将深入解析模板转换节点的核心引擎Jinja2,并结合Dify平台特性,展示其在多源文本合成、知识检索结构化、动态API构建及个性化内容生成等关键场景的应用技巧,助您驾驭这一强大工具。
Jinja2是一款成熟、功能丰富且高效的Python模板引擎,其核心目标在于将应用程序的业务逻辑与展示逻辑(如HTML、XML、配置文件或任意文本格式)清晰分离。
它通过优雅的语法、模板继承、宏、过滤器及可扩展性,实现了动态内容嵌入静态模板的需求。
Jinja2的语法直观,主要包括:
其强大的特性如模板继承允许定义基础布局,子模板可覆写特定区块;宏则类似函数,封装可重用逻辑;丰富的内置过滤器(如trim, join, length, default, tojson)及自定义过滤器能力,极大地增强了数据处理的灵活性。
Jinja2支持完整的控制结构,如{% if %}条件判断和{% for %}循环(包含loop变量以访问循环状态),以及变量赋值{% set %}。这些特性使得模板不仅能展示数据,还能执行轻量级逻辑判断与数据迭代处理。
在Dify中,模板转换节点正是利用Jinja2的这些能力,使得开发者无需编写复杂的代码节点,即可在工作流中高效处理和编排文本数据。
以上只是 Jinja2 的冰山一角,更多需要到中文文档学习:https://docs.jinkan.org/docs/jinja2/
为了帮助大家「干中学」我整理了模板转换的 6 大高频应用场景,理解它们,也就掌握得七七八八了。
Dify的模板转换节点凭借Jinja2引擎,在构建AI应用工作流时展现出极高的灵活性和实用性。以下将结合具体场景和代码示例,探讨其核心应用方式,重点突出数据整合、结构化输出及动态生成能力。
在AI应用中,常需要将来自不同节点或变量的文本片段、数据项组合成单一的、结构化的文本输出,作为后续LLM的提示词、用户回复或日志记录。模板转换节点为此提供了便捷的解决方案。例如,将分散的文章标题、开头和正文内容合并成一篇完整文档。
对于更复杂的场景,如处理迭代节点输出的多个内容项,可通过循环实现。假设迭代节点输出一个名为arg的数组,每个元素section需要被拼接并用分隔符隔开:
{% for section in arg %}
{{ section }}
———————————-
{% endfor %}
这种方式常用于汇总迭代处理的结果,形成一份完整的报告或长文本。
例如我做公众号的工作流,里面有个「迭代」负责把每篇内容分别发布到公众号里
迭代的下一个节点就做了一个「模板转换」逐个每个成功发送的记录都显示出来
从知识库检索到的信息往往包含多个内容片段及其元数据(如相似度得分、来源等)。模板转换节点能将这些原始数据优雅地格式化为易读的报告,例如Markdown格式,便于呈现或进一步处理。
实例:
定义从知识库中检索的数组结果,为变量retrieved_chunks
核心还是要设计好展示的模板:
## 知识检索报告
{% if retrieved_chunks and retrieved_chunks | length > 0 %} {% for chunk in retrieved_chunks %}### {{ loop.index }}. {{ chunk.title }} (相似度: {{ “%.2f” | format(chunk.score | default(0)) }}){{ chunk.content | replace(‘n’, ‘nn’) }}— {% endfor %}{% else %}未检索到相关信息。{% endif %}
该模板遍历retrieved_chunks列表,为每个知识片段创建包含序号、标题、相似度(使用format过滤器格式化并提供default值)的子标题,并处理内容中的换行符,使其在Markdown中正确分段。
能看到它把知识库检索的结果结构化整理出来了:
这段代码是Jinja2能力的一个综合展示,非常典型。我们来逐行分解:
在与外部服务集成时,经常需要根据动态输入参数构造特定格式(如JSON)的API请求体。模板转换节点利用Jinja2的条件判断和变量替换能力,可以灵活生成这类数据结构。
{
“query”: “{{ user_query }}”,
“filters”: {
“status”: “{{ filter_type | default(‘any’) }}”,
{% if user_id %}
“customer_id”: “{{ user_id }}”,
{% endif %}
“created_after”: “{{ start_date_iso }}”
},
“pagination”: {
“limit”: {{ page_size | default(10) }},
“offset”: 0
}
}
此代码的核心技巧在于在静态的JSON结构中嵌入动态逻辑,以生成符合API要求的请求体。
模板转换节点能够根据用户属性或上下文信息,生成个性化的文本内容,从而提升AI应用的交互体验。例如,根据用户名称和当前时间生成动态问候语。
你好,{{ user.name }}!
{% if current_time.hour < 6 %}夜深了,早点休息。
{% elif current_time.hour < 12 %}早上好!
{% elif current_time.hour < 14 %}中午好!
{% elif current_time.hour < 18 %}下午好!
{% else %}晚上好!
{% endif %}
今天有什么可以帮您的吗?
这里假设user.name和current_time.hour是上游传入的变量,通过Jinja2的条件逻辑判断当前时间段,输出相应的问候。这种方式同样适用于定制化产品推荐、动态邮件内容生成等场景。
这个模板的核心是利用多级条件判断来实现基于不同条件的文本分支。
Dify的模板转换节点也支持渲染HTML内容,可用于动态生成表单,为用户提供更丰富的交互界面。
<form data-format=”json”> // Default to text <label for=”username”>Username:</label> <input type=”text” name=”username” /> <label for=”password”>Password:</label> <input type=”password” name=”password” /> <label for=”content”>Content:</label> <textarea name=”content”></textarea> <label for=”date”>Date:</label> <input type=”date” name=”date” /> <label for=”time”>Time:</label> <input type=”time” name=”time” /> <label for=”datetime”>Datetime:</label> <input type=”datetime” name=”datetime” /> <label for=”select”>Select:</label> <input type=”select” name=”select” data-options='[“hello”,”world”]’/> <input type=”checkbox” name=”check” data-tip=”By checking this means you agreed”/> <button data-size=”small” data-variant=”primary”>Login</button></form>
效果是这样:
而且每个组件还是选择使用的,很方便:
这段代码本身并没有使用Jinja2的动态语法(如null或{% %}),它展示的是一个Dify平台特定的功能:即模板转换节点可以直接输出特定格式的HTML,Dify的前端会将其解析并渲染成一个可交互的表单。
这里的关键点在于理解HTML标签上的**data-属性*,它们是给Dify平台看的指令,而非标准的HTML行为。
<form data-format=”json”>:
也就是说,模板转换节点不仅能处理文本逻辑,还能作为动态UI生成器,在配合Jinja2语法来动态生成这些HTML。
# 销售报告 {{ date.today() | date_format(“%Y-%m-%d”) }}**总销售额**: ¥{{ total_sales | round(2) | thousands_separator }}## 区域表现{% for region in regions %}- {{ region.name }}: – 完成率: {{ (region.actual/region.target*100) | round(1) }}% – 同比增长: {{ region.growth_rate | percent }}{% endfor %}
这个模板是前面所有知识点的一个高级融合,用于生成一份数据驱动的动态报告,包含了函数调用、算术运算和多种专用过滤器。
本文由人人都是产品经理作者【饼干哥哥】,微信公众号:【饼干哥哥AGI】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。
题图来自Unsplash,基于 CC0 协议。