切换主题
第 9 章:多智能体编排,顺序、并行、循环不是开会
多智能体不是把几个 Agent 拉进群聊,让它们自由发挥。工程里的多智能体更像流水线、并行任务和质检回路。你真正要关心的是:谁先做、谁一起做、什么时候返工、结果怎么合并。
本章边界
本章只讲三种最常用的编排模式:顺序、并行、循环。更复杂的组织结构、自治协作和跨服务协议先不展开。
1. 生活类比:厨房分工
做一份套餐:
- 顺序模式:先切菜,再炒菜,再装盘。
- 并行模式:一个人煮汤,一个人炒菜,一个人准备甜点。
- 循环模式:厨师做完,主厨试味,不合格就返工。
对应到 Agent:
| 厨房动作 | Agent 模式 | 工程含义 |
|---|---|---|
| 先后依赖 | Sequential | 后一步依赖前一步输出 |
| 分头干活 | Parallel | 多个子任务独立执行,最后合并 |
| 返工改进 | Loop | 执行、评价、不合格再来一轮 |
2. 最小顺序示例
java
ReactAgent sqlGenerateAgent = ReactAgent.builder()
.name("sql_generator")
.model(chatModel)
.systemPrompt("把自然语言转换成 MySQL SQL,只输出 SQL。")
.outputKey("sql")
.includeContents(true)
.build();
ReactAgent sqlRatingAgent = ReactAgent.builder()
.name("sql_rater")
.model(chatModel)
.systemPrompt("给 SQL 和用户意图的匹配度打 0 到 1 分。")
.instruction("SQL: {sql}\n用户问题: {input}")
.outputKey("score")
.build();
SequentialAgent sqlAgent = SequentialAgent.builder()
.name("sequential_sql_agent")
.subAgents(List.of(sqlGenerateAgent, sqlRatingAgent))
.build();这段代码背后的关键不是“有两个 Agent”,而是第二个 Agent 要读取第一个 Agent 的输出。sql_generator 先写入 sql,sql_rater 再基于 sql 打分。
3. 三种编排模式
选择之前先问三句话:
- 后一步是否依赖前一步?
- 子任务能不能独立并行?
- 什么时候退出,谁说了算?
如果第三个问题答不出来,千万别急着用循环。没有退出条件的 Loop,就是把算力倒进无底洞。
4. 决策表
| 模式 | 什么时候用 | 最容易踩的坑 |
|---|---|---|
| Sequential | 生成 -> 校验 -> 总结 | 忘记定义中间输出 key |
| Parallel | 多专家独立分析同一问题 | 合并策略不清楚 |
| Loop | 生成 -> 评分 -> 低分重试 | 没有最大轮数和退出条件 |
| Routing | 先判断该交给哪个专家 | 把确定规则也交给模型猜 |
多智能体的难点不是“创建更多 Agent”,而是状态协议。每个 Agent 输出什么 key、下游怎么读、冲突怎么合并,都要提前说清楚。
5. 新手容易误解什么
误解一:Agent 越多越聪明。
Agent 越多,协调成本越高。两个职责清晰的 Agent,通常比五个描述模糊的 Agent 更可靠。
误解二:并行就是开线程。
并行还要处理结果合并。没有合并策略,三个专家给你三份报告,最后还是没人能交付结论。
误解三:循环就是无限优化。
循环必须有停止条件、最大次数和失败兜底。工程里没有“永远再试一次”这种浪漫。
6. 本章小结
多智能体编排的学习顺序:
text
SequentialAgent -> ParallelAgent -> LoopAgent -> Routing先把线性流水线看懂,再看并行聚合,最后看循环优化。下一章进入路由型多智能体:让模型决定任务交给谁。
7. 练习题
- 设计一个“生成 SQL -> 执行前审查 -> 输出解释”的顺序 Agent 流程。
- 设计一个“三个专家并行评审需求文档”的合并策略。
- 给一个 LoopAgent 写退出规则:最大几轮、什么分数算通过、失败怎么兜底。
课后源码索引:想验证实现时再打开
| 你想验证的结论 | 源码锚点 |
|---|---|
| 顺序 SQL 示例 | examples/multiagent-patterns/pipeline/src/main/java/com/alibaba/cloud/ai/examples/multiagents/pipeline/sequential/SequentialPipelineConfig.java,类 SequentialPipelineConfig,方法 sequentialSqlAgent(...) |
| 循环 SQL 优化示例 | examples/multiagent-patterns/pipeline/src/main/java/com/alibaba/cloud/ai/examples/multiagents/pipeline/loop/LoopPipelineConfig.java,类 LoopPipelineConfig,方法 loopSqlRefinementAgent(...) |
| 顺序 Agent 如何构建图 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/agent/SequentialAgent.java,类 SequentialAgent,方法 builder()、buildSpecificGraph(...) |
| 并行 Agent 如何合并结果 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/agent/ParallelAgent.java,类 ParallelAgent,方法 buildSpecificGraph(...)、MergeStrategy.merge(...) |
| 循环 Agent 如何设置子 Agent 和退出策略 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/agent/LoopAgent.java,类 LoopAgent,方法 subAgent(...)、loopStrategy(...)、buildSpecificGraph(...) |
| 三种图构建策略 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/strategy/SequentialGraphBuildingStrategy.java、ParallelGraphBuildingStrategy.java、LoopGraphBuildingStrategy.java |