概念对比
| PocketFlow | Dify | 相同点 |
|---|---|---|
| Node (节点) | Block (块) | 都是工作流的基本处理单元 |
| prep → exec → post | 输入 → 处理 → 输出 | 三段式生命周期 |
>> 连接节点 |
拖拽连线连接块 | 形成有向图 |
| Action 路由 | 条件分支块 | 根据结果决定下一步 |
| Shared | 变量引用 | 数据在块之间传递 |
可视化对比
Dify 的界面(可视化)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 开始块 │───▶│ LLM块 │───▶│ 结束块 │
│ (Start) │ │ (Chat Model) │ │ (End) │
└─────────────┘ └─────────────┘ └─────────────┘
PocketFlow 的代码(等价)
# Dify 的 "开始块" → PocketFlow 的 StartNode
# Dify 的 "LLM块" → PocketFlow 的 LLMNode
# Dify 的 "结束块" → PocketFlow 的 EndNode
start >> llm >> end
具体例子:条件判断
Dify 的条件分支块
┌─────────────┐
│ LLM块 │
└──────┬──────┘
│
▼
┌─────────────────────┐
│ 条件分支块 │
│ if score > 0.8 │
└──────┬────────┬────┘
│ │
true│ false│
▼ ▼
┌──────────┐ ┌──────────┐
│ 通过块 │ │ 拒绝块 │
└──────────┘ └──────────┘
PocketFlow 的等价实现
class ScoreNode(Node):
def post(self, shared, prep_res, exec_res):
score = exec_res
if score > 0.8:
return "pass" # 对应 Dify 的 true 分支
else:
return "reject" # 对应 Dify 的 false 分支
score >> pass_node # true 分支
score - "reject" >> reject_node # false 分支
关键区别
| 方面 | Dify | PocketFlow |
|---|---|---|
| 形式 | 可视化拖拽 | 纯代码 |
| 内置块 | LLM、HTTP、数据库等预构建块 | 完全自定义,需要自己写 |
| 连接方式 | UI 画线 |
>> 操作符 |
| 部署 | 一键部署到云端 | 需要自己部署 |
| 灵活性 | 受限于预构建块 | 无限灵活,想写啥写啥 |
| 上手难度 | 低(无代码) | 中(需要编程) |
为什么 PocketFlow 不提供预构建块?
# Dify 的方式:拖一个 LLM 块
# 填写 API Key、提示词...(通过 UI 配置)
# PocketFlow 的方式:自己写
class MyLLMNode(Node):
def exec(self, prompt):
return openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
PocketFlow 的哲学:不绑定任何供应商,你想用 OpenAI、Claude、还是本地模型,完全由你自己决定。
总结
- Dify = 工作流 LEGO 套装(预制的积木块)
- PocketFlow = 工作流 3D 打印机(你设计任何形状)
两者本质上是同一概念的不同实现方式:
- Dify 是低代码平台,适合快速原型和非程序员
- PocketFlow 是代码框架,适合开发者需要完全控制的场景