首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >告别"屎山"代码:用Dify工作流编排,我只写了3行代码

告别"屎山"代码:用Dify工作流编排,我只写了3行代码

原创
作者头像
闪学it点com
发布于 2026-09-06 14:24:11
发布于 2026-09-06 14:24:11
1940
举报

当AI应用开发从"写代码"变成"搭积木",效率提升的临界点就来了。

在过去的半年里,我使用Dify搭建了十几个AI应用,从简单的客服机器人到复杂的多Agent协作系统。我发现一个反直觉的事实:越复杂的业务逻辑,需要的代码反而越少。

Dify工作流的核心优势在于可视化编排,但这不意味着零代码。作为一个程序员,我深知完全依赖拖拽会导致"黑盒恐惧"。真正的秘诀是:用工作流处理逻辑流(Flow),用极少量代码处理数据粘合(Glue)。

本文将带你构建一个"智能周报生成器"工作流,并揭秘那仅有的3处必须写代码的地方。


一、为什么工作流能替代后端代码?

传统开发中,调用LLM需要写requests库、处理JSON解析、错误重试、Prompt模板拼接...这些重复性工作占据了我们70%的开发时间。

Dify工作流通过节点化解决了这个问题:

  • LLM节点:封装了API调用与参数管理。
  • 知识库检索节点:封装了RAG向量检索。
  • 条件分支节点:替代了if/else逻辑。
  • 迭代节点:替代了for循环。

我们需要做的,只是定义数据的流向(Inputs -> Process -> Outputs)。


二、实战案例:智能周报生成器

假设我们需要一个工作流:输入本周的零散工作记录(乱序文本),输出一份结构完整、语言得体的周报。

工作流节点路径: 开始 -> 代码清洗节点 -> LLM生成大纲 -> 代码解析节点 -> LLM扩写 -> 结束

第一处代码:数据预处理(清洗脏数据)

用户输入的文本可能包含"昨天、今天"等相对时间,或者包含无意义的语气词。我们不需要在Prompt里让LLM处理这些(浪费Token),用代码节点解决。

在代码清洗节点中,写入Python代码(Dify内置支持Python/JS):

代码语言:javascript
复制
import re

def main(text: str) -> dict:
    # 1. 移除多余空行和特殊符号(仅保留中文、英文、数字、逗号句号)
    cleaned = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9,。、\n]', '', text)
    # 2. 将"昨天"替换为具体日期(略过复杂逻辑,简单标记)
    cleaned = cleaned.replace("昨天", "【前日】")
    return {
        "clean_text": cleaned[:500]  # 截断防止超长
    }

为什么用代码? 正则清洗比让LLM做快100倍,成本为0。


第二处代码:JSON结构化输出(强制格式)

当第一个LLM生成大纲后,我们需要提取其中的标题列表用于后续扩写。LLM经常抽风输出带Markdown标记的字符串,直接用json.loads会报错。此时在代码解析节点用防御性解析:

代码语言:javascript
复制
import json
import re

def main(llm_output: str) -> dict:
    # 尝试提取JSON块(Dify的LLM节点常返回带```json标记的内容)
    match = re.search(r'```json\s*(\{.*?\})\s*```', llm_output, re.DOTALL)
    if match:
        json_str = match.group(1)
    else:
        json_str = llm_output
    
    try:
        data = json.loads(json_str)
    except:
        # 降级方案:强行构造默认结构
        data = {"titles": ["项目进展", "问题与风险", "下周计划"]}
    
    # 确保返回的是纯列表,用于后续迭代节点
    return {
        "title_list": data.get("titles", [])
    }

第三处代码:Jinja2模板注入(动态上下文)

这是最容易被忽视但极其好用的地方。在Dify的LLM节点的Prompt编写框中,虽然支持{{变量}},但如果涉及循环或条件判断,必须使用Jinja2模板(这也是代码)。

在最后一个"LLM扩写"节点中,我们需要针对每个标题生成详细内容,同时传入用户原始记录。在Prompt输入框中这样写:

代码语言:javascript
复制
你是一个专业的项目助理。请根据以下零散记录:
{{ clean_text }}

现在请针对大纲标题:**{{ current_title }}** 进行扩写。

要求(遵循以下Jinja逻辑):
{% if loop.index == 1 %}
重点描述数据增长百分比。
{% elif loop.index == 2 %}
重点描述风险应对措施,如果没有风险则写"暂无显著风险"。
{% else %}
重点描述下季度的资源需求。
{% endif %}

请直接输出正文,不要带任何Markdown标记。

(注:在Dify的迭代节点中,loop.index是内置变量,这属于模板语法代码,是编排中必不可少的轻量级编码。)


三、低代码的核心心法

通过上述案例,你应该发现了:Dify工作流中的代码,是用来弥补"图形化节点"逻辑缝隙的。

  • 什么时候写代码? 当涉及复杂正则、日期计算、JSON容错处理、或者需要调用外部非标准API签名时。
  • 什么时候不写代码? 凡是涉及"理解意图、生成文本、分类总结"统统丢给LLM节点。

这套组合拳的效率有多高? 这个"周报生成器"完整工作流搭建耗时仅12分钟。如果纯用Python + FastAPI + LangChain,至少需要半天调试Prompt解析逻辑。


四、写在最后

很多程序员对"低代码"嗤之以鼻,认为那是产品经理的玩具。但Dify工作流是个例外——它把编排权还给了开发者,同时把脏活累活留给了代码节点。

记住这个公式: 可靠的工作流 = 90%的图形化节点(稳定) + 10%的胶水代码(灵活)

下一步,你可以尝试在Dify中接入第三方APIs(比如飞书、钉钉),这时候只需要在"HTTP请求节点"配置参数,连requests.get的那行import都不用写了——因为Dify连这个都帮你封装好了。

赶紧去试试吧,把时间留给真正的业务逻辑,而不是API调试。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、为什么工作流能替代后端代码?
  • 二、实战案例:智能周报生成器
    • 第一处代码:数据预处理(清洗脏数据)
    • 第二处代码:JSON结构化输出(强制格式)
    • 第三处代码:Jinja2模板注入(动态上下文)
  • 三、低代码的核心心法
  • 四、写在最后
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档