在 Dify 的工作流构建中,模板转换节点凭借其对 Jinja2 模板语言的强大支持,早已成为数据处理和格式化的得力助手。我们或许已经熟练运用它来生成 HTML 表格、格式化 JSON,或者拼接提示词。但实际上,这块小小的画布蕴藏着远超基础操作的潜力。只要我们敢于想象,并结合 Jinja2 的灵活性,就能解锁一系列既实用又“好玩”的动态文本生成功能。
本文将带你跳出常规思维,探索 Dify 模板转换节点的更多可能性,看看它如何在你构建的 AI 应用中扮演更富创造力的角色。我们将通过具体的代码示例和输入参数,展示这些功能的实际应用。
一、 个性化体验的魔法师:动态内容定制
想象一下,你的 AI 应用不再是千篇一律的冰冷机器,而是能根据用户或情境展现出个性化关怀的贴心伙伴。模板转换节点正是实现这一点的关键。
1.1 智能问候与互动
功能描述:
根据用户名称和当前时间生成个性化问候。
输入参数 (user 对象和假设的 current\_time 对象或可调用函数):
{
"user": {
"name": "李明"
},
"current\_time": { // 实际可能通过 Dify 内置变量或代码节点获取
"hour": 14 // 假设当前是下午2点
}
}
Jinja2 模板代码:
你好,{{ user.name }}!
{% if current\_time.hour < 6 %}夜深了,早点休息。
{% elif current\_time.hour < 12 %}早上好!
{% elif current\_time.hour < 14 %}中午好!
{% elif current\_time.hour < 18 %}下午好!
{% else %}晚上好!
{% endif %}
今天有什么可以帮您的吗?
预期输出:
你好,李明!
下午好!
今天有什么可以帮您的吗?
示例场景: 一个 AI 客服在对话开始时,能根据时间向用户致以“李先生,早上好!”或“王女士,下午茶时间愉快!”的问候。
1.2 定制化产品推荐语
功能描述:
根据用户偏好和推荐产品信息生成推荐语。
输入参数 (user\_preference 字符串和 recommended\_product 对象):
{
"user\_preference": "户外运动",
"recommended\_product": {
"name": "超轻防水冲锋衣",
"features": ["Gore-Tex面料", "轻量化设计", "多口袋"],
"category": "户外服装"
}
}
Jinja2 模板代码:
考虑到您对【{{ user\_preference }}】的兴趣,我们特别向您推荐这款【{{ recommended\_product.name }}】。
它属于{{ recommended\_product.category }}类别,主要特点包括:{{ recommended\_product.features | join('、') }}。
相信它能满足您的需求!
预期输出:
考虑到您对【户外运动】的兴趣,我们特别向您推荐这款【超轻防水冲锋衣】。
它属于户外服装类别,主要特点包括:Gore-Tex面料、轻量化设计、多口袋。
相信它能满足您的需求!
示例场景: 电商应用的 AI 助手,在用户浏览某类商品后,能结合其偏好说:“根据您对简约风格的喜爱,这款新到的【纯色亚麻衬衫】或许正是您在寻找的。”
二、 信息梳理与呈现:动态报告与摘要
面对复杂的数据和信息,如何清晰、高效地呈现给用户或后续处理步骤?模板转换节点同样能大显身身手。
2.1 知识库检索结果美化 (Markdown格式)
功能描述:
将知识库检索的多个片段整理成带小标题的 Markdown 报告。
输入参数 (retrieved\_chunks 列表):
{
"retrieved\_chunks": [
{
"title": "Jinja2 循环",
"content": "Jinja2 使用 {% for item in list %} ... {% endfor %} 进行循环。",
"score": 0.92
},
{
"title": "Jinja2 条件判断",
"content": "条件语句使用 {% if condition %} ... {% else %} ... {% endif %}。",
"score": 0.88
}
]
}
Jinja2 模板代码:
## 知识检索报告
{% if retrieved\_chunks and retrieved\_chunks | length > 0 %}
{% for chunk in retrieved\_chunks %}
### {{ loop.index }}. {{ chunk.title }} (相似度: {{ "%.2f" | format(chunk.score) }})
{{ chunk.content | replace('\n', '\n\n') }}
---
{% endfor %}
{% else %}
未检索到相关信息。
{% endif %}
预期输出 (Markdown):
## 知识检索报告
### 1. Jinja2 循环 (相似度: 0.92)
Jinja2 使用 {% for item in list %} ... {% endfor %} 进行循环。
---
### 2. Jinja2 条件判断 (相似度: 0.88)
条件语句使用 {% if condition %} ... {% else %} ... {% endif %}。
---
2.2 数据分析结果展示
功能描述:
将数据分析得到的关键指标格式化成文本摘要。
输入参数 (metrics 对象):
{
"metrics": {
"new\_users": 125,
"active\_user\_percentage": 0.675,
"revenue": 15800.50,
"top\_feature": "数据导出"
}
}
Jinja2 模板代码:
本周关键业务指标摘要:
- 新增用户数:{{ metrics.new\_users }} 人
- 活跃用户占比:{{ "%.1f%%" | format(metrics.active\_user\_percentage * 100) }}
- 总营收:¥{{ "%.2f" | format(metrics.revenue) }}
- 最受欢迎功能:{{ metrics.top\_feature | default('暂无数据') }}
预期输出:
本周关键业务指标摘要:
- 新增用户数:125 人
- 活跃用户占比:67.5%
- 总营收:¥15800.50
- 最受欢迎功能:数据导出
示例场景: 一个数据分析应用,每日自动生成一份包含“新增用户数:XXX”、“核心功能使用率:YYY%”等关键数据的文本摘要。
三、 复杂数据结构的构造师:API 请求体与配置文件
在与其他系统或服务集成时,我们常常需要构造特定格式的请求体(如 JSON、XML)或配置文件。
3.1 动态构建 API 请求 (JSON)
功能描述:
根据输入动态生成 JSON 格式的 API 请求体。
输入参数 (user\_query 字符串, filter\_type 字符串 (可选), user\_id 字符串 (可选), start\_date\_iso 字符串, page\_size 数字 (可选)):
{
"user\_query": "查找最近的订单",
"filter\_type": "completed",
"user\_id": "user\_123",
"start\_date\_iso": "2023-10-01T00:00:00Z",
"page\_size": 20
}
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):
{
"query": "查找最近的订单",
"filters": {
"status": "completed",
"customer\_id": "user\_123",
"created\_after": "2023-10-01T00:00:00Z"
},
"pagination": {
"limit": 20,
"offset": 0
}
}
3.2 生成动态 SQL 查询语句
功能描述:
根据参数动态生成 SQL 查询语句。
输入参数 (table\_name 字符串, columns 列表, conditions 列表 (每个元素是字符串条件), limit 数字 (可选)):
{
"table\_name": "orders",
"columns": ["order\_id", "customer\_name", "total\_amount"],
"conditions": ["status = 'paid'", "order\_date >= '2023-10-01'"],
"limit": 5
}
Jinja2 模板代码:
SELECT {{ columns | join(', ') }}
FROM {{ table\_name }}
{% if conditions and conditions | length > 0 %}
WHERE {{ conditions | join(' AND ') }}
{% endif %}
{% if limit %}
LIMIT {{ limit }}
{% endif %};
预期输出 (SQL):
SELECT order\_id, customer\_name, total\_amount
FROM orders
WHERE status = 'paid' AND order\_date >= '2023-10-01'
LIMIT 5;
示例场景: 根据用户选择的数据库表名和筛选条件,动态生成一条 SQL 查询语句。
四、 创意无限:互动娱乐与文本游戏
谁说工作流只能处理严肃的任务?模板转换节点也能为你的应用注入趣味元素。
4.1 “文字冒险游戏”场景生成
功能描述:
根据当前场景和可用选项生成游戏文本。
输入参数 (current\_scene 对象, available\_options 列表):
{
"current\_scene": {
"description": "你站在一个古老城堡的沉重木门前,门上刻着奇异的符文。",
"environment\_details": ["空气中弥漫着尘土和一丝硫磺味。"]
},
"available\_options": [
{"id": "opt1", "text": "尝试推开大门"},
{"id": "opt2", "text": "仔细研究门上的符文"},
{"id": "opt3", "text": "大声呼喊,看是否有人回应"}
]
}
Jinja2 模板代码:
{{ current\_scene.description }}
{% for detail in current\_scene.environment\_details %}
{{ detail }}
{% endfor %}
你现在可以:
{% for option in available\_options %}
{{ loop.index }}. {{ option.text }} (选择ID: {{ option.id }})
{% endfor %}
请输入你的选择对应的ID:
预期输出:
你站在一个古老城堡的沉重木门前,门上刻着奇异的符文。
空气中弥漫着尘土和一丝硫磺味。
你现在可以:
1. 尝试推开大门 (选择ID: opt1)
2. 仔细研究门上的符文 (选择ID: opt2)
3. 大声呼喊,看是否有人回应 (选择ID: opt3)
请输入你的选择对应的ID:
4.2 疯狂填词游戏
功能描述:
将用户提供的词语填充到故事模板中。
输入参数 (words 对象):
{
"words": {
"adjective1": "滑稽的",
"noun1": "香蕉",
"place": "月球表面",
"verb\_present\_tense": "跳舞",
"adjective2": "愤怒的",
"noun2": "机器人",
"verb\_past\_tense": "歌唱"
}
}
Jinja2 模板代码:
很久很久以前,有一只非常 {{ words.adjective1 }} 的 {{ words.noun1 }}。
它最喜欢在 {{ words.place }} 上 {{ words.verb\_present\_tense }}。
有一天,它在 {{ words.place }} 遇到了一个 {{ words.adjective2 }} 的 {{ words.noun2 }},
于是它们一起愉快地 {{ words.verb\_past\_tense }} 了一整天!这是一个多么 {{ words.adjective1 }} 的故事啊!
预期输出:
很久很久以前,有一只非常滑稽的香蕉。
它最喜欢在月球表面上跳舞。
有一天,它在月球表面遇到了一个愤怒的机器人,
于是它们一起愉快地歌唱了一整天!这是一个多么滑稽的故事啊!
五、 实用工具:格式转换与文本处理
5.1 JSON 转 CSV
功能描述:
将产品列表的 JSON 数据转换为 CSV 格式。
输入参数 (products 列表):
{
"products": [
{"id":"P001","name":"智能降噪耳机","category":"数码配件","price":599,"stock":150},
{"id":"P002","name":"有机棉T恤, 白色","category":"服装","price":129.5,"stock":300},
{"id":"P003","name":"《\"科幻\"概论》","category":"图书","price":78.99,"stock":80}
]
}
(注意:products 输入与之前表格示例相同,这里为了简洁省略重复展示)
Jinja2 模板代码 (注意CSV中对特殊字符的处理):
id,name,category,price,stock
{%- for item in products -%}
{{ item.id }},"{{ item.name | replace('"', '""') }}","{{ item.category | replace('"', '""') }}",{{ item.price }},{{ item.stock }}
{% endfor %}
注意: {%- ... -%} 中的 - 用于移除前导或尾随的空白/换行,使输出更紧凑。replace('"', '""') 是 CSV 中处理包含双引号的字段的标准方法。
预期输出 (CSV 文本):
id,name,category,price,stock
P001,"智能降噪耳机","数码配件",599,150
P002,"有机棉T恤, 白色","服装",129.5,300
P003,"《""科幻""概论》","图书",78.99,80
5.2 自定义日志格式化
功能描述:
根据传入的日志事件数据,生成符合预设格式的日志条目。
输入参数 (log\_event 对象):
{
"log\_event": {
"timestamp\_iso": "2023-10-27T10:30:15Z",
"level": "INFO",
"workflow\_id": "wf\_abc123",
"node\_id": "node\_xyz789",
"message": "User query processed successfully.",
"user\_id": "usr\_001"
}
}
Jinja2 模板代码:
[{{ log\_event.timestamp\_iso }}] [{{ log\_event.level | upper }}] [Workflow: {{ log\_event.workflow\_id }}] [Node: {{ log\_event.node\_id }}] {% if log\_event.user\_id %}[User: {{ log\_event.user\_id }}] {% endif %}- {{ log\_event.message }}
预期输出:
[2023-10-27T10:30:15Z] [INFO] [Workflow: wf\_abc123] [Node: node\_xyz789] [User: usr\_001] - User query processed successfully.
如何释放模板转换节点的潜力?
- 深入理解输入数据:
你的模板设计强依赖于上游节点提供的变量名称、数据类型和结构。 2. 熟练掌握 Jinja2 语法:
变量输出
{{ ... }}
、控制结构
{% ... %}
(如
if/else/endif
,
for/endfor
)、过滤器(如
| length
,
| join
,
| format
,
| default
)是实现动态逻辑的基础。
- 明确目标输出格式:
清晰定义你想要生成的文本是纯文本、Markdown、HTML、JSON、XML 还是其他特定格式。 4. 从小处着手,逐步迭代:
对于复杂的功能,可以先实现核心部分,然后逐步添加更多细节和逻辑,并不断测试。
重要提示: 本文中的输入参数示例是为了演示 Jinja2 模板的用法。在实际的 Dify 工作流中,这些输入变量通常来自上游节点(如 API 请求节点、代码节点、知识库检索节点等)的输出,或者通过 Dify 的全局变量机制传入。请根据您的具体工作流设计来获取和使用这些变量。
Dify 的模板转换节点不仅仅是一个简单的数据转换工具,它更像是一把多功能的瑞士军刀,等待着富有创造力的你去发掘和运用。通过巧妙地结合 Jinja2 的强大功能,你可以在 Dify 工作流中实现远超预期的动态文本生成效果,为你的 AI 应用增添更多智能、个性和趣味。
觉得好,请帮忙点赞、转发。
