Dify 中级实验(03):模板转换实战——如何用零 Token 完成文本加工?
2026/8/8 7:24:24 网站建设 项目流程

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):迭代进阶——如何批量处理数据并守住性能边界?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询