一、循环 vs 批处理:两个节点,两种哲学

扣子工作流里有两个节点都能处理「多条数据」,但机制完全不同:

循环节点 批处理节点
执行方式 串行,一个接一个 并行,同时启动多个
适用场景 有依赖关系(第2步依赖第1步结果) 独立任务(每条数据处理互不干扰)
速度 线性累加 基本等于单次耗时
变量引用 {{节点_循环.变量}} {{节点.变量}},直接数组
典型用例 搜索结果逐条清洗 100 条文案同时生成

举个例子秒懂:

  • 循环:你要翻译 10 句话,每句翻译完检查质量再翻译下一句 → 串行,10 × 3 秒 = 30 秒
  • 批处理:你要用 10 个不同 Prompt 生成 10 张海报,互相没依赖 → 并行,一次 8 秒

市面上 90% 的教程都在讲循环节点,批处理被严重低估了。但它才是真正能让工作流「从分钟级降到秒级」的节点。


二、批处理节点怎么配

拖入批处理节点后,需要配置两个关键参数:

① 输入数组

function main({ prompts }) {
  const promptList = [
    '赛博朋克风格海报',
    '极简主义海报',
    '国潮风格海报',
    // ... 共 10 个
  ];
  
  return { 
    promptArray: promptList,
    count: promptList.length 
  };
}

在批处理节点内部,当前项通过 {{批处理节点.item}} 引用(不同版本字段名可能为 item、current 或 data,以实际节点面板显示为准)。

② 内部节点

批处理节点内部是一个子画布,你可以拖入插件、代码、大模型等任何节点。每个内部节点都会对数组的每一项独立执行一遍。


三、实战:一条 Prompt 数组 → 批量大模型调用

场景:你有一个包含 20 个不同主题的数组,要一次性调用大模型生成 20 篇文章摘要。

[开始] → [代码:生成主题数组] → [批处理] → [代码:汇总结果] → [结束]
                                      └→ [大模型:生成摘要]

第 1 步:代码节点生成数组

function main({}) {
  const topics = [
    '人工智能发展趋势',
    '云计算架构设计',
    '前端性能优化',
    // ... 共 20 个
  ];
  
  return { 
    topics: topics,
    count: topics.length 
  };
}

第 2 步:配置批处理节点

  • 输入数组:绑定 {{生成数组.topics}}
  • 当前项变量名:item(即 {{批处理.item}} 代表当前主题)

第 3 步:批处理内部放大模型节点

Prompt: 请用 100 字概括「{{批处理.item}}」的核心要点。
模型:豆包 Lite(快模型,适合摘要类简单任务)

20 个主题同时调用,一次跑完约 3-5 秒(取决于模型并发限制)。

第 4 步:汇总结果

function main({ batchResults }) {
  const summaries = (batchResults || [])
    .map((r, i) => `${i + 1}. ${r.output || r}`);
  
  return {
    summary: summaries.join('\n'),
    count: summaries.length
  };
}


四、进阶:批处理 + 循环组合

批处理和循环可以嵌套——批处理内部放一个循环节点。这种组合适合「分层并行」场景:

场景: 你有 5 个产品类目,每个类目要搜索 3 个不同关键词。如果全用循环串行跑,5 × 3 = 15 次搜索依次执行。用批处理+循环组合,5 个类目并行,内部各自串行跑 3 次搜索——总耗时约等于 3 次搜索。

[开始] → [批处理:5个类目]
              └→ [循环:3个关键词]
                     └→ [插件:搜索]

注意事项:

  • 批处理内部放循环时,变量引用路径会变长:批处理内部循环内的节点引用当前关键词是 {{循环.item}},引用当前类目是 {{批处理.item}}
  • 建议先用单层批处理跑通,确认无误再加循环嵌套
  • 双层嵌套时调试更困难,优先考虑能不能用一层批处理解决

五、3 个踩坑细节

坑 1:并发限制

扣子对批处理节点有并发数量的隐式限制(通常是 4-10 个并行任务,取决于节点类型和套餐)。如果你的数组有 100 条数据,实际会分批并行执行而不是一次全部跑完。大模型节点通常 4 个并发,插件节点可能更多。

解法: 数组太大时分批提交——用代码节点把 100 条切成 4 组各 25 条,循环调用 4 次批处理。

function main({ items }) {
  const BATCH_SIZE = 10;
  const batches = [];
  for (let i = 0; i < items.length; i += BATCH_SIZE) {
    batches.push(items.slice(i, i + BATCH_SIZE));
  }
  return { batches, totalBatches: batches.length };
}

坑 2:批处理输出顺序

批处理节点的输出数组顺序不一定和输入顺序一致——因为任务是并行执行的,先完成的先返回。如果你的业务需要保持原始顺序,在汇总节点里加一个排序逻辑:

function main({ batchResults }) {
  const sorted = (batchResults || [])
    .sort((a, b) => (a.index || 0) - (b.index || 0));
  return { results: sorted };
}

坑 3:内部节点报错导致整批失败

批处理里如果有一条数据触发了内部节点报错(比如某个 Prompt 格式不对导致大模型拒答),可能导致整批中断。解决办法是在批处理内部加一个条件分支做异常捕获——这个思路和之前「错误处理」文章里的模式 2(状态检查)完全一样,批处理内部同样适用。


六、总结

场景特征 选循环 选批处理
任务之间有依赖
任务独立可并行
任务数量 ≤ 5 都可以 ✅(更快)
任务数量 50+ ❌ 太慢 ✅(分批)
需要精确控制顺序 ⚠️ 需排序
大模型调用 ❌ 串行等太久 ✅ 并行秒出

一句话:能用批处理就别用循环。 循环是兜底方案,批处理才是性能最优解。下次看到工作流里一个循环节点串行跑 20 次大模型,你就知道该换成批处理了。


关于作者:专注扣子工作流效率与自动化实战,更多节点模板和进阶教程可搜索「米核AI易山」

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐