在 Dify 工作流中,使用“代码节点”是精简 Prompt 最直接、有效的手段。其核心思路是:将原本需要大模型在 Prompt 中处理的“数据清洗”和“逻辑判断”工作,转移到代码节点中预先完成,只将最终结果传递给大模型。
💡 核心思路:从“描述”转向“结果”
与其在 Prompt 中详细描述复杂的规则,不如在代码节点中计算出最终结果,再让大模型基于结果进行决策。
传统方式 (高 Token 消耗):
Prompt: "请根据以下规则判断用户意图:1. 包含‘退款’、‘退货’为售后;2. 包含‘多少钱’、‘价格’为价格咨询…… 用户问题是:{{query}}"
优化方式 (低 Token 消耗):
代码节点: 预先运行规则判断,输出
intent = "售后"。Prompt: "用户意图是 {{intent}},请据此回答:{{query}}"
通过这种方式,可以将成百上千的 Token 消耗降至个位数。
🛠️ 实战案例
1. 意图分类:用代码替代冗长规则
将复杂的 if-else 逻辑在代码节点中实现,Prompt 只负责传递结果。
代码节点 (Python):
def main(query: str) -> dict: q = query.lower() if "多少钱" in q or "价格" in q or "费用" in q: intent = "价格咨询" elif "退款" in q or "退货" in q or "换货" in q: intent = "售后" elif "你好" in q or "在吗" in q: intent = "问候" else: intent = "其他" return {"intent": intent}LLM 节点 Prompt:
你是一个客服助手。用户意图是 {{intent}},请据此回答:{{query}}
2. 数据压缩:聚合信息后再输入
当处理日志、表格等长文本时,先在代码节点进行聚合和摘要,避免将原始数据全部塞入 Prompt。
代码节点 (Python):
def main(logs: list) -> dict: # logs 为 HTTP 请求返回的日志列表 summary = {} for log in logs: level = log.get("level", "unknown") summary[level] = summary.get(level, 0) + 1 # 构造简洁的文本描述 text = "日志统计结果:" + ",".join([f"{k}级日志 {v} 条" for k, v in summary.items()]) return {"summary": text}LLM 节点 Prompt:
请根据以下摘要生成一份运维报告:{{summary}}
3. 文本清洗:移除无关内容
在文本进入大模型前,使用代码节点清洗掉 HTML 标签、多余空格等噪声。
代码节点 (Python):
import re def main(html_text: str) -> dict: # 移除 HTML 标签 text = re.sub(r'<[^>]+>', '', html_text) # 压缩多余空白符 text = re.sub(r'\s+', ' ', text).strip() return {"clean_text": text}LLM 节点 Prompt:
请对以下内容进行摘要:{{clean_text}}
4. 历史摘要:压缩对话上下文
对于多轮对话,将冗长的历史记录压缩成一条摘要,而非全部传入。
代码节点 (Python):
def main(history: list) -> dict: # history 为对话历史列表,每项包含 role 和 content user_queries = [item["content"] for item in history if item["role"] == "user"] summary = "用户主要关心:" + ";".join(user_queries[-3:]) # 仅保留最近3条 return {"history_summary": summary}LLM 节点 Prompt:
对话历史摘要:{{history_summary}}\n\n请回答当前问题:{{query}}
5. 条件路由:用代码替代复杂 Prompt 判断
将“是否调用知识库”、“是否触发特定工具”等逻辑用代码实现,简化 LLM 节点的 Prompt。
代码节点 (Python):
def main(query: str) -> dict: q = query.lower() use_kb = any(kw in q for kw in ["政策", "规定", "流程", "制度"]) return {"use_kb": use_kb}后续流程: 根据use_kb的值,使用“条件分支”节点决定是走“知识检索+LLM”路径,还是直接走“LLM”路径。
✨ 最佳实践总结
数据预处理:在代码节点完成清洗、格式转换、聚合统计等工作。
规则前置:将明确的 if-else 规则在代码中实现,输出结果供 LLM 使用。
信息压缩:将长文本、列表、历史记录等压缩为短文本或结构化摘要。
逻辑分流:用代码节点进行条件判断,简化 LLM 节点的 Prompt 和后续流程分支。
通过以上方法,你可以显著减少 Prompt 的长度,从而有效控制 Token 消耗,提升响应速度并降低成本。