上篇回顾 :在上篇文章中,我提出了 Harness Engineering(驾驭工程) 的概念,认为企业级 AI 落地的关键在于给模型套上"缰绳"。今天这篇,我想聊聊最近面试 JD 里高频出现的工具------DIFY。
坦白说,我对 DIFY 的感情是复杂的。一方面,它确实降低了 AI 应用的门槛;另一方面,作为一个习惯了手写代码(Skill)的开发者,我在使用它时常常感到一种"被束缚"的焦虑。
很多人把 DIFY 奉为"神器",认为它就是 AI 时代的 WordPress。但在我看来,DIFY 既不是银弹,也不是玩具,它只是一个"业务视角的编排器" 。
1. DIFY 的本质:可视化的 DAG 管道
剥开华丽的外衣,DIFY 的核心其实很简单:一个可视化的工作流(Workflow)编排引擎 + 一套 RAG(检索增强生成)处理管道。
当你在画布上拖拽节点时,你实际上在做一件很传统的事情------画 DAG(有向无环图) 。
- LLM 节点:调用模型。
- HTTP 节点:调用 API。
- 条件分支:If-else 逻辑。
- 变量池:在节点间传递数据。
这本质上就是一个低代码平台 。它最大的价值在于 "可见性" 。产品经理和运营人员可以清晰地看到数据是如何流动的,Prompt 是可以随时修改的,知识库是可以随时更新的。这对于需要频繁调整业务逻辑的非技术人员来说,确实是巨大的效率提升。
但是,如果你把它当作一个技术护城河,那就错了。
2. 我的质疑:手写 Skill 不比这香吗?
在准备面试的过程中,我一直在思考一个问题:为什么我不能直接用 Python 写一个 Skill,而非要在 DIFY 里画流程图?
假设我要实现一个"订单核查"的功能:
- DIFY 的做法:拖拽一个"开始"节点 -> LLM 节点(提取订单号) -> HTTP 节点(查物流) -> HTTP 节点(查发票) -> LLM 节点(分析) -> 结束。
- 我的做法 :写一个 Python 函数
check_order(order_id),里面封装好查物流、查发票的逻辑,加上参数校验、异常处理和重试机制。然后让 LLM 决定何时调用这个函数。
对比之下,我发现 DIFY 有几个明显的痛点:
- 逻辑僵化:DIFY 的 DAG 是静态的。一旦你画好了流程,运行时就很难改变。而我的 Python Skill 可以利用循环、递归,甚至让 LLM 在运行时动态决定下一步(ReAct 模式),灵活性高出几个量级。
- 调试困难:在代码里,我有断点调试、单元测试、详细的 Stack Trace。在 DIFY 里,如果某个节点报错,我往往只能在日志里看到一串模糊的错误信息,排查问题的成本很高。
- 代码即债务:DIFY 把逻辑锁死在了它的数据库里。我想做版本管理(Git)、想做 Code Review、想做复杂的重构,都非常困难。而代码则天然具备这些工程化特性。
所以,如果你的核心逻辑很复杂,手写 Skill 绝对比 DIFY 的可视化编排更优雅、更可控 。这也正是 Harness Engineering 的体现------我把控制权牢牢握在自己手里。
3. DIFY vs LangGraph:工厂与机床的区别
为了更好地理解 DIFY 的定位,我们需要把它和它常被提及的"亲戚" LangGraph 做个对比。很多人误以为它们是竞品,其实不然。
- LangGraph 是"精密机床的源代码" :它是代码优先的,允许你定义复杂的状态图(State Graph),支持循环、回溯、人机交互(Human-in-the-loop)。它极其灵活,但学习曲线陡峭,只有资深工程师能玩转。
- DIFY 是"工厂的管理后台" :它不关心底层的状态机如何实现,它关心的是如何把已有的能力(无论是 LangGraph 写的,还是普通 API)组装成一条生产线。
结论很明确:DIFY 底层并不依赖 LangGraph,它们是不同维度的产物。
在企业架构中,它们的关系是互补的:
LangGraph 负责"重脑力" (复杂的多步推理、循环处理),DIFY 负责"接客" (提供 Web 界面、管理知识库、做简单的编排)。
更高级的用法是:DIFY 作为一个 HTTP 客户端,去调用由 LangGraph 封装好的复杂 Agent 服务。
4. 什么时候用 DIFY?什么时候不用?
经过这番梳理,我对 DIFY 的态度从"怀疑"变成了"理性看待"。
适合用 DIFY 的场景:
- 内部工具/原型验证:需要快速出一个 Demo 给老板看,或者给运营团队做一个内部问答机器人。
- RAG 为主的应用:如果你的应用 80% 的工作是检索知识库,20% 是简单对话,DIFY 内置的 RAG 管道非常好用。
- 非技术主导的项目:当业务人员需要频繁修改 Prompt 或调整流程,而不想打扰开发时。
不适合用 DIFY 的场景:
- 核心交易系统:涉及钱、订单、敏感数据的核心链路,必须用代码保证严谨性。
- 复杂 Agent 逻辑:需要动态规划、自我修正、复杂循环的场景。
- 超高并发/性能敏感:DIFY 的多一层抽象会带来额外的延迟和资源消耗。
5. 总结:DIFY 是 Harness 的"低配版"
回到 Harness Engineering 的视角。DIFY 其实提供了一个低配版的 Harness:
- 它有变量校验(弱)。
- 它有工具权限控制(弱)。
- 它有日志观测(中)。
它试图用可视化的方式解决工程化的问题,这在简单场景 下是成功的,但在复杂场景下就显得力不从心。
因此,对于高级 AI 开发工程师来说,正确的姿势不是"拒绝 DIFY",而是"掌控 DIFY "。我们要能理解它的原理,知道它的边界,在合适的场景用它提效,同时在核心环节坚持用代码(Skill)构建真正的 Harness。
下篇预告:
聊完了应用编排,我们不得不面对 AI 系统的地基------数据。JD 里特意强调了 ETL 和调度,为什么 AI 工程师也要懂数据工程?DIFY 的知识库又是如何依赖这些数据的?我们下篇《数据基石》见。