Skip to content
Calvin's Blog

PocketFlow 学习笔记:100 行代码的极简 LLM 框架

Mar 1, 2026 — AI, Agents, Tool, Tutorial

什么是 PocketFlow

PocketFlow 是一个仅有 100 行代码的极简 LLM(大语言模型)框架。与其他庞大的框架相比,它的设计理念是”少即是多”——只保留核心抽象,零依赖,零供应商锁定。

为什么选择 PocketFlow?

框架代码行数大小特点
LangChain405K+166MB功能丰富但臃肿,依赖众多
CrewAI18K+173MB多代理支持,但体积较大
SmolAgent8K+198MB轻量,但仍有依赖
AutoGen7K+26MB微软出品,功能较多
PocketFlow100+56KB极简,零依赖,零供应商锁定

PocketFlow 的核心优势

核心概念

PocketFlow 的核心抽象是 Graph(图),在此基础上实现了 Node(节点)和 Flow(流)两个核心概念。

1. Node(节点)

Node 是 PocketFlow 的最小构建块,每个节点遵循 prep -> exec -> post 三个步骤:

graph LR
A[prep<br/>准备数据] --> B[exec<br/>执行计算]
B --> C[post<br/>后处理]

prep 阶段

exec 阶段

post 阶段

2. Flow(流)

Flow 用于编排节点的图结构。根据每个 Node 的 post() 返回的 Action 来决定下一个节点。

Action-based Transitions

每个 Node 的 post() 返回一个 Action 字符串,Flow 根据这个 Action 决定下一步:

  1. 基本默认跳转node_a >> node_b

    • 如果 node_a.post() 返回 "default",则跳转到 node_b
  2. 命名 action 跳转node_a - "action_name" >> node_b

    • 如果 node_a.post() 返回 "action_name",则跳转到 node_b

创建 Flow 的示例

# 定义流连接
node_a >> node_b
# 创建流并指定起点
flow = Flow(start=node_a)
# 执行流
flow.run(shared)

分支和循环

# 支出审批流程的分支示例
review - "approved" >> payment # 批准后处理支付
review - "needs_revision" >> revise # 需要修改则返回修改
review - "rejected" >> finish # 拒绝则结束流程
revise >> review # 修改后回到审核
# 审批可以形成循环
payment >> finish # 支付后结束
flowchart TD
review[审核支出] -->|批准| payment[处理支付]
review -->|需要修改| revise[修改报告]
review -->|拒绝| finish[结束流程]
revise --> review
payment --> finish

嵌套 Flow

Flow 本身也是一个 Node,这允许强大的组合模式:

# 创建子流
node_a >> node_b
subflow = Flow(start=node_a)
# 将子流连接到另一个节点
subflow >> node_c
# 创建父流
parent_flow = Flow(start=subflow)

节点间通信

PocketFlow 提供两种通信方式:

1. Shared Store(推荐用于几乎所有场景)

示例:

shared = {
"user": {
"id": "user123",
"context": {
"weather": {"temp": 72, "condition": "sunny"},
"location": "San Francisco"
}
},
"results": {} # 空字典用于存储输出
}

2. Params(仅用于 Batch 模式)

只设置最上层的 Flow 参数,其他的会被父 Flow 覆盖。如果需要设置子节点参数,请参考 Batch 文档。

容错和重试机制

PocketFlow 内置了强大的故障容错和重试机制。

重试配置

你可以为 Node 启用重试:

示例:

my_node = SummarizeFile(max_retries=3, wait=10)

优雅降级

当所有重试都失败后,可以重写 exec_fallback 方法来提供降级结果:

class SummarizeFile(Node):
def exec(self, prep_res):
# 可能失败的操作
summary = call_llm(prompt)
return summary
def exec_fallback(self, prep_res, exc):
# 提供简单的降级结果而不是崩溃
return "处理您的请求时出现错误。"

Agentic Coding 实践

PocketFlow 强调Agentic Coding——人类设计,AI 编码的模式。这是一种协作方式:

Agentic Coding 步骤

步骤人类AI说明
1. 需求分析★★★ 高★☆☆ 低人类理解需求和上下文
2. 流程设计★★☆ 中★★☆ 中人类指定高层设计,AI 填充细节
3. 工具函数★★☆ 中★★☆ 中人类提供可用的外部 API,AI 帮助实现
4. 数据设计★☆☆ 低★★★ 高AI 设计数据模式,人类验证
5. 节点设计★☆☆ 低★★★ 高AI 帮助设计基于流程的节点
6. 实现★☆☆ 低★★★ 高AI 基于设计实现流程
7. 优化★★☆ 中★★☆ 中人类评估结果,AI 帮助优化
8. 可靠性★☆☆ 低★★★ 高AI 编写测试用例,处理边界情况

关键原则

1. 从小处着手

2. 人类设计在先

3. 分离关注点

设计模式

PocketFlow 支持多种常见设计模式:

1. Agent 模式

多个智能体协作完成复杂任务。每个 Agent 可以有不同的目标和能力。

2. Workflow 模式

将任务分解为多个步骤,按顺序或并行执行。适合写作、数据分析等场景。

3. RAG 模式

检索增强生成,将信息检索与文本生成结合,缓解模型”幻觉”问题。

4. Multi-Agent 模式

多个 Agent 异步通信,协作解决问题。

5. Map-Reduce 模式

批量处理大数据,通过映射和归约两个阶段提高效率。

快速开始

安装

Terminal window
pip install pocketflow

或直接复制 源代码 (opens in a new window)(只有 100 行)。

基础示例

from pocketflow import Node, Flow
class LoadData(Node):
def post(self, shared, prep_res, exec_res):
shared["data"] = "Some text content"
return None
class Summarize(Node):
def prep(self, shared):
return shared["data"]
def exec(self, prep_res):
prompt = f"Summarize: {prep_res}"
summary = call_llm(prompt)
return summary
def post(self, shared, prep_res, exec_res):
shared["summary"] = exec_res
return "default"
load_data = LoadData()
summarize = Summarize()
load_data >> summarize
flow = Flow(start=load_data)
shared = {}
flow.run(shared)

学习心得

PocketFlow 给我的最大启发是:极简不等于功能弱。通过只保留核心抽象,PocketFlow 实现了:

  1. 极高的灵活性:支持任意 LLM 提供商
  2. 强大的表达力:100 行代码支持复杂的多代理协作
  3. 优秀的可维护性:关注点分离使代码清晰易懂

更多资源

PocketFlow 还有 TypeScript、Java、C++、Go、Rust 和 PHP 版本!