Agent的两种玩法:parallel 与 pipeline

0 阅读3分钟

parallel 与 pipeline:并行的两种玩法

系列第 4 篇 · 前置:第 1 篇第 2 篇第 3 篇


上一篇用了 parallel,这篇讲清楚它和 pipeline 的区别。这俩是 Workflow 里最容易搞混的。

一句话:parallel 等人,pipeline 不等人。


一、parallel:等所有人到齐

const [chinese, english, github] = await parallel([
  () => agent('搜中文资料'),
  () => agent('搜英文资料'),
  () => agent('搜开源项目'),
])

三个 Agent 同时启动,但 parallel 会等最慢的那个回来,才把三个结果一起给你。先回来的干等着。

就像约三个人开会,两个人提前到了,也得等最后那个迟到的。

二、pipeline:各走各的

const results = await pipeline(
  ['Hook入门', 'Hook进阶', 'Hook实战'],
  (topic) => agent(`搜 ${topic} 资料`),
  (materials, topic) => agent(`根据资料写 ${topic} 大纲`),
  (outline, topic) => agent(`根据大纲写 ${topic} 初稿`),
)

三个主题同时启动,但每个主题独立走完"搜资料→写大纲→写初稿"全程。A 搜完资料立刻去写大纲,不用等 B 和 C 搜完。快的先交稿,慢的自己慢慢跑。

就像工厂流水线:三件产品同时上传送带,第一件到第二道工序时,第三件可能还在第一道工序。


三、时间线对比

三个主题,每个走三步,用同一个例子看两种写法差多少:

parallel 分三个阶段(每阶段等最慢的):

阶段1 搜资料:  入门▓▓  进阶▓▓▓▓▓  实战▓▓     等 5 分钟
阶段2 写大纲:  入门▓▓▓ 进阶▓▓      实战▓▓▓    等 3 分钟
阶段3 写初稿:  入门▓▓▓▓▓▓ 进阶▓▓▓▓ 实战▓▓▓   等 6 分钟
总耗时:5 + 3 + 6 = 14 分钟,其中 7 分钟在干等

pipeline(各走各的):

入门:[搜▓▓][大纲▓▓▓][初稿▓▓▓▓▓▓] ✅ 11 分钟
进阶:[搜▓▓▓▓▓][大纲▓▓][初稿▓▓▓▓]  ✅ 11 分钟
实战:[搜▓▓][大纲▓▓▓][初稿▓▓▓]      ✅  8 分钟
总耗时:11 分钟,没人等

任务越多、每步耗时差异越大,pipeline 的优势越明显。10 个主题用 parallel,最慢那个能把所有人拖跨;用 pipeline,快的早交早了。


四、barrier:什么时候该等

parallel 自带一个 barrier(屏障):所有任务到齐了才放行。

什么时候需要 barrier? 下一步真的需要所有人的结果时:

// 需要:去重必须等所有维度的发现都到齐
const allFindings = await parallel([
  () => agent('查 Bug'),
  () => agent('查安全问题'),
  () => agent('查性能问题'),
])
const unique = 去重(allFindings.flat())  // 不全到齐没法去重
// 不需要:三篇文章各写各的,谁写完谁先去润色
// 用 pipeline,别用三个 parallel 阶段

判断标准就一句话:下一步要不要把所有人的结果放一起处理? 要就 parallel,不要就 pipeline。


五、常见错误

1. 单个任务也用 pipeline

// 没必要,直接 agent 串联
await pipeline(['一个主题'], (t) => agent('搜'), (r) => agent('写'))

2. 不相关的任务拆成多个 parallel

// 四个任务互不依赖,一个 parallel 就行
const a = await parallel([() => agent('A'), () => agent('B')])
const b = await parallel([() => agent('C'), () => agent('D')])

3. 中间是纯 JS 处理,却开了新的 parallel 阶段

// 去重是 JS 操作,不花时间,不需要 barrier
const all = await parallel([查A(), 查B(), 查C()])
const filtered = all.filter(Boolean)  // 纯 JS,瞬间完成
// 下一步直接 pipeline,不用再 parallel

六、决策口诀

下一步要汇总所有人的结果 → parallel(开会等人到齐)
各干各的互不依赖       → pipeline(流水线各走各的)
只有一个任务          → 直接 await agent 串联
不知道要跑多少轮      → while 循环(下一篇讲)

自测几个场景:

场景用哪个
三个源同时搜,搜完一起分析parallel
十个文件各自检查→修复→验证pipeline
写完文章从三个维度同时审查parallel
五个主题各写各的文章pipeline

小结

parallel:同时启动,等最慢的,自带 barrier
pipeline:同时启动,各走各的,没有 barrier

barrier 只在"需要所有人结果才能下一步"时才需要
pipeline 传多个变量用 .then() 打包

口诀:开会用 parallel,流水线用 pipeline