Dify 中级实验(03):模板转换实战——如何用零 Token 完成文本加工?
Dify 实验系列 · 中级 03/20 | 实验编号:DIFY-102-04
上篇:中级实验(02):问题分类器——智能路由引擎如何四路分发?
1. 实验目的
掌握Template Transform(模板转换)节点——基于 Jinja2 模板引擎的文本加工,不消耗 LLM Token。理解它比 LLM 节点更适合哪些场景:格式确定、规则明确的文本组装(报告、邮件、摘要模板),用模板零成本秒出;只有需要「理解语义」的加工才用 LLM。
2. 场景设计
电商评论汇总:数据库/API 返回原始评价 JSON,需要按三种格式输出——摘要(summary)、分析报告(report)、邮件正文(email)。
输入:
product_name: 智能手表 reviews: [{"user": "张三", "rating": 5, "content": "很好用", "date": "2026-07-16"}, ...] format_type: summary / report / email(下拉选择)输出:按格式类型走对应模板,纯 Jinja2 渲染,零 Token。
3. 节点拓扑
开始(product_name / reviews / format_type) ↓ 解析评价 JSON(Code:校验 + 结构化) ↓ 生成采集时间(Code:当前时间,模板不能用 now()) ↓ 格式类型分支(IF-ELSE,3 分支) ├── summary → 摘要模板 → 结束 ├── report → 报告模板 → 结束 └── email → 邮件模板 → 结束4. 关键配置
4.1 输入解析(Code)
reviews 是 JSON 字符串,先解析成结构化数据(同时做空值兜底):
defmain(reviews:str)->dict:importjsontry:data=json.loads(reviewsor"[]")exceptException:data=[]ifisinstance(data,dict):data=data.get("data",[])return{"reviews":data,"count":len(data)}4.2 模板转换节点(核心)
摘要模板——空值保护 + 平均分计算 + 评分分布:
{% set rr = reviews if reviews else [] %} 【{{ product_name }}】用户评价摘要(共 {{ rr | length }} 条) {% set total_rating = rr | map(attribute='rating') | sum %} {% set avg_rating = (total_rating / rr | length) | round(1) if rr | length > 0 else 0 %} 平均评分:{{ avg_rating }} / 5 {% for r in rr %} - {{ r.user }}({{ r.rating }}星):{{ r.content }} {% endfor %}报告模板——评分分布统计 + 按评分排序:
{% set rr = reviews if reviews else [] %} # {{ product_name }} 用户评价分析报告 ## 概览 - 评价总数:{{ rr | length }} - 数据采集时间:{{ report_time }} ## 评分分布 {% set ratings = [5,4,3,2,1] %} {% for r in ratings %} {% set count = rr | selectattr('rating', 'equalto', r) | list | length %} {{ r }} 星:{{ count }} 条 {% endfor %}4.3 采集时间(Code)
⚠️Jinja2 模板里没有 now() 函数——Dify 模板环境不提供时间函数。要输出时间,用上游代码节点生成再传参:
defmain()->dict:importdatetimereturn{"report_time":datetime.datetime.now().strftime("%Y-%m-%d %H:%M")}5. 运行验证
实测三种格式输出:
summary→ 摘要文本(评价数/均分/逐条)report→ 结构化报告(概览/评分分布/明细)email→ 邮件正文(主题 + 关键数据 + 收尾)
验证要点:输出内容完全由模板渲染,节点执行耗时毫秒级、Token 消耗为 0——对比 LLM 生成同格式文本的耗时与成本。
6. 采坑点
| 坑 | 现象 | 修复 |
|---|---|---|
| 模板用 now() | 运行报错(模板环境无时间函数) | 上游 Code 节点生成时间传参 |
| 空 reviews 直接遍历 | 无数据时模板报错/输出异常 | {% set rr = reviews if reviews else [] %}空值保护 |
| 平均分除零 | reviews 为空时1/0报错 | if rr | length > 0 else 0保护 |
| 模板转换节点被 LLM 替代 | 每次请求烧 Token、耗时长 | 格式确定场景一律用模板(零成本) |
💡 选型心法:规则明确的文本组装 → 模板转换(零 Token);需要理解语义的加工 → LLM。同一个工作流里两者配合:模板负责结构,LLM 负责内容。
7. 实验文档及源码获取
- 实验文档(完整操作步骤):DIFY-04:模板转换——高级文本加工厂.md
- 源码(可直接导入):dify102_04_模板转换工厂.yml
文章聚焦核心配置与采坑点;实验的完整分步操作(节点搭建/参数表/调试指引)见实验文档原文。
下一篇:Dify 中级实验(04):迭代进阶——如何批量处理数据并守住性能边界?