ZeroGraph
综合介绍
ZeroGraph是一个为AI智能体(Agent)编程而设计的极简主义LLM框架。它是PocketFlow(一个Python框架)的TypeScript实现版本,旨在推动面向智能体的LLM编程技术和理念发展。这个框架最显著的特点是其极致的轻量化设计,核心代码仅有300行,大小约10KB,并且没有任何外部依赖,杜绝了不必要的代码膨胀和供应商锁定问题。作为一个TypeScript原生框架,ZeroGraph提供了完整的类型安全和出色的IDE(集成开发环境)支持,让开发过程更加可靠和高效。它还推崇“智能体编程”模式,即利用AI智能体(例如Cursor AI)来辅助构建新的智能体,这可以极大地提升开发效率。
功能列表
- 极简设计: 核心代码仅300行(约10KB),无任何项目依赖,确保了框架的轻量和纯净。
- TypeScript原生: 完全使用TypeScript编写,提供端到端的类型安全检查和优秀的IDE自动补全、代码提示等支持。
- 智能体编程 (Agentic Coding): 框架设计理念支持使用AI工具辅助开发,让AI智能体构建AI智能体,从而提高生产力。
- 节点 (Node): 框架的基本构建模块,用于封装一个独立的任务单元,每个节点包含数据准备、核心逻辑执行和结果存储三个步骤。
- 流程 (Flow): 用于编排和管理多个节点,通过预设的“动作”(actions)来控制节点之间的执行顺序和条件分支,从而构建出完整的工作流。
- 异步支持: 内置
AsyncNode
和AsyncFlow
抽象,可以简单地处理需要网络请求或其他耗时的异步操作。 - 批量处理: 提供了
BatchNode
和BatchFlow
,能够高效地对一组数据中的每个项目执行相同的处理逻辑。 - 丰富的官方示例: 项目提供了多个开箱即用的代码示例,包括多智能体协作、检索增强生成(RAG)、工作流、批量处理等,方便开发者学习和使用。
使用帮助
ZeroGraph的设计非常直观,主要围绕Node
(节点)和Flow
(流程)这两个核心概念。下面将详细介绍如何安装和使用该框架。
安装
你可以使用npm
或yarn
将ZeroGraph添加到你的项目中。
使用 npm:
npm install @u0z/zero-graph
或者使用 yarn:
yarn add @u0z/zero-graph
核心概念
理解Node
和Flow
是使用ZeroGraph的关键。
1. 节点 (Node)
Node
是处理任务的最基本单位。你可以把它想象成工厂流水线上的一个工位,这个工位只负责一项具体的工作。一个标准的Node
由三个核心方法组成:
prep(shared: any)
: 准备阶段。此方法在核心逻辑执行前调用。它从shared
(共享数据存储对象)中读取所需要的数据,并将其处理成适合下一步执行的格式后返回。exec(prepResult: any)
: 执行阶段。此方法接收prep
方法返回的数据,并执行最核心的任务逻辑,例如调用一次API、处理一段文本或执行一次计算。然后,它会返回执行结果。post(shared: any, prepRes: any, execRes: any)
: 后处理阶段。此方法在exec
执行完毕后调用。它负责将exec
的执行结果存入shared
对象中,以便工作流中的其他节点可以使用。同时,它还会返回一个字符串,这个字符串被称为“动作”(action),用于决定接下来应该执行哪个节点。默认情况下可以返回'default'
。
下面是一个Node
的结构示例:
import { Node } from '@u0z/zero-graph';
class MyNode extends Node {
prep(shared: any): any {
// 从共享数据存储中准备数据
const input = shared.input;
return input;
}
exec(prepResult: any): any {
// 执行主要逻辑
const result = `processed: ${prepResult}`;
return result;
}
post(shared: any, prepRes: any, execRes: any): string {
// 将结果存回共享数据,并决定下一步动作
shared.result = execRes;
return 'success'; // 返回 'success' 动作
}
}
2. 流程 (Flow)
Flow
负责将多个Node
按照预定的逻辑串联起来,形成一个完整的工作流。你可以把它看作是控制工厂流水线运行的总开关和调度器。
- 创建流程: 创建一个
Flow
实例时,你需要传入一个起始节点。 - 连接节点: 你可以使用起始节点的
.next()
方法来连接下一个节点,并指定触发连接的“动作”(action)。例如,nodeA.next(nodeB, 'success')
的意思是:当nodeA
的post
方法返回'success'
时,流程将自动执行nodeB
。 - 运行流程: 调用
flow.run(shared)
方法来启动整个工作流。shared
是一个普通的JavaScript对象,用于在所有节点之间传递和共享数据。
下面是一个Flow
的编排示例:```tsconst nodeA = new NodeA();const nodeB = new NodeB();const nodeC = new NodeC();
// 定义节点之间的流转关系// 如果 nodeA 返回 'success',则执行 nodeBnodeA.next(nodeB, 'success');// 如果 nodeA 返回 'error',则执行 nodeCnodeA.next(nodeC, 'error');
// 创建一个以 nodeA 为起点的流程const flow = new Flow(nodeA);
// 准备共享数据并运行流程const shared = { initialData: 'start' };flow.run(shared);
### 高级用法
#### 异步操作
当你的任务需要调用API或执行其他异步操作时,可以使用`AsyncNode`和`AsyncFlow`。用法与同步版本非常相似,只是核心逻辑需要写在`execAsync`方法中,并使用`async/await`语法。
```ts
import { AsyncNode, AsyncFlow } from '@u0z/zero-graph';
class ApiCallNode extends AsyncNode {
async execAsync(input: any): Promise<any> {
const response = await fetch(`https://api.example.com/data/${input}`);
return await response.json();
}
}
const asyncFlow = new AsyncFlow(new ApiCallNode());
const shared = { input: 'some-id' };
await asyncFlow.runAsync(shared); // 注意这里使用 runAsync
批量处理
如果需要对一个列表中的所有项目执行同样的操作,可以使用BatchNode
和BatchFlow
。你只需要在exec
方法中定义如何处理单个项目即可,框架会自动为你处理循环。
import { BatchNode, BatchFlow } from '@u0z/zero-graph';
class ItemProcessor extends BatchNode {
exec(item: any): any {
// 定义处理单个项目的逻辑
return { ...item, processed: true };
}
}
const batchFlow = new BatchFlow(new ItemProcessor());
const shared = {
// input 必须是一个数组
input: [{ id: 1 }, { id: 2 }, { id: 3 }]
};
// 运行后,shared.result 将会是包含所有处理后项目的数组
batchFlow.run(shared);
应用场景
- 研究智能体构建一个可以自动进行网络搜索、分析和总结信息的智能体。例如,输入一个主题,智能体通过API调用搜索引擎节点,然后将结果传递给分析节点,最后由总结节点输出报告。
- 多步骤内容生成创建一个自动化的内容生成工作流。例如,第一步由一个节点生成文章大纲,第二步由多个节点并行撰写各章节内容,最后由一个节点将所有内容整合并润色成一篇文章。
- 检索增强生成 (RAG)构建一个问答机器人。当收到用户问题时,一个节点负责在本地知识库或向量数据库中检索相关信息,然后另一个节点将检索到的信息和原始问题一起提供给LLM,生成更准确、更具事实性的回答。
- 多智能体协作设计一个复杂的任务解决系统,其中包含多个角色不同的智能体。例如,一个“项目经理”智能体负责分解任务,然后将子任务分配给“程序员”智能体和“测试员”智能体,它们各自完成后再将结果汇总。
QA
- 问:与其他LLM框架(如LangChain, CrewAI)相比,ZeroGraph有什么不同?答: ZeroGraph最大的不同在于其极简的设计哲学。它的核心代码只有约300行,体积仅10KB,并且没有任何外部依赖。这与其他动辄数十万行代码、体积庞大的框架形成鲜明对比。ZeroGraph专注于提供AI智能体编程的核心功能,避免了不必要的复杂性,并且是为TypeScript原生设计的,提供了完整的类型安全。
- 问:ZeroGraph是某个Python框架的移植版吗?答: 是的,ZeroGraph TypeScript是
PocketFlow
(Python) 的一个TypeScript实现。它的目标是与社区共同推动面向智能体的LLM编程框架技术和理念的发展。