
当AI应用开发从"写代码"变成"搭积木",效率提升的临界点就来了。
在过去的半年里,我使用Dify搭建了十几个AI应用,从简单的客服机器人到复杂的多Agent协作系统。我发现一个反直觉的事实:越复杂的业务逻辑,需要的代码反而越少。
Dify工作流的核心优势在于可视化编排,但这不意味着零代码。作为一个程序员,我深知完全依赖拖拽会导致"黑盒恐惧"。真正的秘诀是:用工作流处理逻辑流(Flow),用极少量代码处理数据粘合(Glue)。
本文将带你构建一个"智能周报生成器"工作流,并揭秘那仅有的3处必须写代码的地方。
传统开发中,调用LLM需要写requests库、处理JSON解析、错误重试、Prompt模板拼接...这些重复性工作占据了我们70%的开发时间。
Dify工作流通过节点化解决了这个问题:
if/else逻辑。for循环。我们需要做的,只是定义数据的流向(Inputs -> Process -> Outputs)。
假设我们需要一个工作流:输入本周的零散工作记录(乱序文本),输出一份结构完整、语言得体的周报。
工作流节点路径:
开始 -> 代码清洗节点 -> LLM生成大纲 -> 代码解析节点 -> LLM扩写 -> 结束
用户输入的文本可能包含"昨天、今天"等相对时间,或者包含无意义的语气词。我们不需要在Prompt里让LLM处理这些(浪费Token),用代码节点解决。
在代码清洗节点中,写入Python代码(Dify内置支持Python/JS):
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。
当第一个LLM生成大纲后,我们需要提取其中的标题列表用于后续扩写。LLM经常抽风输出带Markdown标记的字符串,直接用json.loads会报错。此时在代码解析节点用防御性解析:
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", [])
}这是最容易被忽视但极其好用的地方。在Dify的LLM节点的Prompt编写框中,虽然支持{{变量}},但如果涉及循环或条件判断,必须使用Jinja2模板(这也是代码)。
在最后一个"LLM扩写"节点中,我们需要针对每个标题生成详细内容,同时传入用户原始记录。在Prompt输入框中这样写:
你是一个专业的项目助理。请根据以下零散记录:
{{ clean_text }}
现在请针对大纲标题:**{{ current_title }}** 进行扩写。
要求(遵循以下Jinja逻辑):
{% if loop.index == 1 %}
重点描述数据增长百分比。
{% elif loop.index == 2 %}
重点描述风险应对措施,如果没有风险则写"暂无显著风险"。
{% else %}
重点描述下季度的资源需求。
{% endif %}
请直接输出正文,不要带任何Markdown标记。(注:在Dify的迭代节点中,loop.index是内置变量,这属于模板语法代码,是编排中必不可少的轻量级编码。)
通过上述案例,你应该发现了:Dify工作流中的代码,是用来弥补"图形化节点"逻辑缝隙的。
这套组合拳的效率有多高? 这个"周报生成器"完整工作流搭建耗时仅12分钟。如果纯用Python + FastAPI + LangChain,至少需要半天调试Prompt解析逻辑。
很多程序员对"低代码"嗤之以鼻,认为那是产品经理的玩具。但Dify工作流是个例外——它把编排权还给了开发者,同时把脏活累活留给了代码节点。
记住这个公式: 可靠的工作流 = 90%的图形化节点(稳定) + 10%的胶水代码(灵活)
下一步,你可以尝试在Dify中接入第三方APIs(比如飞书、钉钉),这时候只需要在"HTTP请求节点"配置参数,连requests.get的那行import都不用写了——因为Dify连这个都帮你封装好了。
赶紧去试试吧,把时间留给真正的业务逻辑,而不是API调试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。