给下面三个任务,各自判断更适合流水线、生产者-评审者,还是多视角投票,并说明理由。
Level 1:给三个任务匹配协作模式- 「把一份技术文档先翻译成英文,再检查英文版里的专业术语翻译是否统一,最后按公司文档模板排版。」
- 「审查一份合同草案,找出里面所有可能存在法律风险的条款,希望尽量不要漏掉任何一处风险。」
- 「写一段推荐算法的核心代码,希望这段代码在性能上尽可能优化,允许反复打磨几轮直到满意为止。」
学习目标:
- 区分流水线、生产者-评审者、多视角投票三种协作模式的运作方式
- 判断一个具体任务适合哪种协作模式,说出各自的成本特点
- 理解 handoff 型协作和编排者-子代理型协作在控制权归属上的关键差异
前置要求:完成第 3 课,会写自包含、有明确范围的委派提示词 | 上一课 第 3 课 << | 下一课 第 5 课 >>
前两课讲的编排者-子代理,是「一个中心节点拆任务、多个子代理并行干活、再汇总」这一种结构。但多个 Agent 协作,不是只有这一种搭法。这一课讲三种更具体的协作模式——流水线、生产者-评审者、多视角投票——它们各自适合什么场景、成本花在哪里,最后再看一种跟编排者-子代理完全不同思路的协作方式:直接把控制权交出去。
流水线(prompt chaining):「把一个任务拆解成一串步骤,每一次 LLM 调用处理的是上一次调用的输出。」1 流水线和编排者-子代理最大的不同在于:编排者-子代理是一个中心 LLM 拆解任务、委派给多个工作 LLM 再整合结果的并行结构1,流水线是严格的一步接一步,后一步必须等前一步做完才能开始,而且直接拿前一步的产出当自己的输入。
举个例子:写一篇产品发布博客,可以拆成「先写一版初稿」→「把初稿翻译成英文」→「检查英文版有没有术语用词不一致的地方」这三步。第二步的输入就是第一步的输出,第三步的输入就是第二步的输出,谁都不能跳过前一步直接开始。这种结构适合那种天然有先后依赖、下一步必须基于上一步结果才能进行的任务——不像调研三家公司定价那样可以真正拆成互不依赖的几块,流水线里的每一步都离不开前一步。
生产者-评审者(evaluator-optimizer):「一次 LLM 调用生成回复,另一次 LLM 调用提供评估和反馈,如此循环。」1 跟流水线的关键区别在这个「循环」上——流水线是走完固定的几步就结束,生产者-评审者是「写一稿→评审给意见→照着意见改→再评审」,直到评审这一方满意(或者达到设定的最大循环次数)才停下来,中间要循环几轮通常事先并不确定。
比如让一个 Agent 写一段处理支付逻辑的代码,另一个 Agent 专门检查这段代码有没有漏处理某些边界情况(比如金额为负、并发重复提交)。如果评审 Agent 挑出了问题,代码会打回给生产者 Agent 重新改,改完再送去评审,直到评审 Agent 认为没有明显问题。这种结构适合那种「有没有做好」不是一次就能判断准确、需要反复打磨才能收敛的任务——第一版产出往往不是最终版本,评审这一步存在的意义就是把明显的问题在正式交付前挑出来,逼着生产者再改一轮。
多视角投票:让几个 Agent 各自独立对同一份内容做判断,而不是接力式地一步步处理。官方给出的例子是代码安全审查:「审查一段代码有没有漏洞,用几个不同的提示词分别审查,如果哪个提示词发现了问题就标记出来。」1 这里的「几个不同的提示词」各自独立看同一段代码,谁都不依赖别人的判断,只要有一个提示词标记出了问题,这段代码就会被标记出来,值得进一步复核。
这种模式跟生产者-评审者不一样——投票不是「写一稿、改一稿」的循环,几个 Agent 是并行地、独立地对同一份已经存在的内容下判断,目的是靠多个不同角度的检查让「漏检」的概率降下来,而不是靠反复修改让内容变得更好。适合那种「宁可多花几次调用、也不想漏掉问题」的场景——安全审查、合规检查这类任务里,漏掉一个真实存在的问题,代价往往比多花几次 token 严重得多。
三种模式的成本结构不一样,选的时候得对着场景算这笔账:
选哪种,先回到任务本身的形状:任务有没有天然的先后步骤——有就考虑流水线;产出质量需不需要反复打磨才能达标——需要就考虑生产者-评审者;漏掉问题的代价高不高、值不值得多个角度重复检查——值得就考虑多视角投票。三种模式也不互斥,一份完整的工作流里,可以先用流水线走完固定的几步,其中某一步再嵌套一个生产者-评审者循环,第 6 课会具体动手搭一个这样的组合。
前面几种模式都有一个共同点:编排者(或者流水线里承上启下的那个节点)始终掌控着全局,子代理做完就把结果交回来,不会自己接着往下指挥。但还有一种完全不同的协作思路——handoff:「对等的 Agent 之间把控制权交给一个专门的 Agent,由它接管对话。这是去中心化的。」2
Handoff 跟编排者-子代理的核心区别,不只是「谁掌控全局」,还包括新接手的 Agent 看到的信息量完全不同。官方文档说得很明确:「发生 handoff 时,就好像新的 Agent 接管了对话,并且能看到此前的完整对话历史。」3 这是默认行为——官方也提供了 input filter 之类的配置来改变新 Agent 能看到的历史范围。这跟第 2、3 课讲的子代理机制正好相反——子代理默认从全新、独立的上下文开始,看不到之前的对话4;handoff 接手的 Agent 默认反而能看到完整历史,因为它不是被临时派去做一件孤立任务再交回结果,而是真正接管了这场对话,之后由它继续跟用户或者下一个环节打交道。
这种差异决定了两种协作方式适合的场景不同:编排者-子代理适合「拆出一堆独立子任务,做完各自交结论,中心节点继续掌控全局」的场景;handoff 适合「随着对话推进,发现接下来该由另一个更专门的 Agent 来处理,把整场对话原封不动地交接过去」的场景——比如客服场景里,通用客服 Agent 判断出用户问题涉及退款,把整段对话交给专门处理退款的 Agent,退款 Agent 接手后不需要用户再重新描述一遍问题。不过这种控制权转移仍然发生在同一次运行内部:「handoff 停留在单次运行范围内。」3
Building effective agents(Anthropic Engineering) — https://www.anthropic.com/engineering/building-effective-agents ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
Agents(OpenAI Agents SDK) — https://openai.github.io/openai-agents-python/agents/ ↩ ↩2
Handoffs(OpenAI Agents SDK) — https://openai.github.io/openai-agents-python/handoffs/ ↩ ↩2 ↩3
Create custom subagents(Claude Code Docs) — https://code.claude.com/docs/en/sub-agents ↩ ↩2
记下想法、痛点、没懂的地方。只写进这门课的附录,正课文件不动。