上一篇我们手写了一套多Agent协作框架:定义AgentRole、写任务分发器、自己起线程池做并行、手写executeWithFeedback做反馈循环,前前后后500多行。发出去之后,评论区有个同学说得很直接:
“这不就是自己造了个迷你版Spring AI Alibaba吗?官方不是有多Agent支持吗?”
被他说中了。我们手写那套,就是为了让你看懂多Agent是怎么跑起来的——真到项目里,没必要自己造轮子。Spring AI Alibaba 1.0 GA 已经把这套协作原语内置了:定义角色用ReactAgent,串流水线用SequentialAgent,并行用ParallelAgent,主管调度用Supervisor模式。今天就把上篇那套,用SAA重写一遍,你看看从500行能瘦到多少。
一、先对账:我们手写了什么,框架替你做了什么
| 上篇手写(500行) | Spring AI Alibaba |
|---|---|
AgentRole+ 四个静态角色定义 | ReactAgent.builder().name().instruction()一个Builder |
executePipeline顺序流水线 | SequentialAgent.builder().agents(a,b,c) |
自己写CompletableFuture+线程池并行 | ParallelAgent.builder(),内置合并策略 |
手写executeWithFeedback反馈循环 | Supervisor主管模式,路由+回退 |
| 手动把上一步output塞进下一步context | outputKey自动在状态里传递 |
| 自己打日志、记耗时 | 框架内置日志和状态追踪 |
一句话:你之前写的调度、并行、上下文传递,框架全干了。你真正该自己写的,只剩每个角色的Prompt和业务工具。
二、用SAA重写"需求→开发→测试"流水线
上篇我们手写了一个软件开发流水线:需求分析师→代码生成→测试。用SAA重写,整个配置类长这样:
@Configuration public class MultiAgentConfig { // 1. 需求分析Agent:一个ReactAgent就是一个角色 @Bean public ReactAgent requirementAnalyst(ChatModel chatModel) { return ReactAgent.builder() .name("requirement_analyst") .model(chatModel) .description("需求分析师,把业务需求拆成功能点") .instruction(""" 你是资深需求分析师。把下面需求拆成3-5个功能点,每个点一句话说清输入输出。 只做需求分析,不写代码。需求:{input} """) .outputKey("requirement_doc") // 输出存进状态,下一个Agent直接取 .build(); } // 2. 代码生成Agent:自动能读到上一步的 requirement_doc @Bean public ReactAgent codeGenerator(ChatModel chatModel) { return ReactAgent.builder() .name("code_generator") .model(chatModel) .description("Java开发,根据需求写代码") .instruction(""" 根据下面需求文档生成生产级Java代码,含异常处理。 只写代码。需求文档:{requirement_doc} """) .outputKey("code") .build(); } // 3. 测试Agent:同时能读到需求和代码 @Bean public ReactAgent testEngineer(ChatModel chatModel) { return ReactAgent.builder() .name("test_engineer") .model(chatModel) .description("测试工程师,写JUnit用例") .instruction(""" 根据需求和代码写3个JUnit用例,覆盖正常和异常。 需求:{requirement_doc} 代码:{code} """) .outputKey("test_cases") .build(); } // 4. 流水线:三个Agent串起来,替代上篇手写的 executePipeline @Bean public SequentialAgent devPipeline(ReactAgent requirementAnalyst, ReactAgent codeGenerator, ReactAgent testEngineer) { return SequentialAgent.builder() .name("dev_pipeline") .agents(requirementAnalyst, codeGenerator, testEngineer) .build(); } }对外暴露就一行:
@PostMapping("/pipeline") public Map<String,Object> pipeline(@RequestBody Map<String,String> body) { Object result = devPipeline.invoke(Map.of("input", body.get("requirement"))); return Map.of("status","success","result", result); }注意那个outputKey——这是框架替你做的最关键的事:需求Agent的输出自动存到requirement_doc,开发Agent的Prompt里写{requirement_doc}就能直接取到,你不用再像上篇那样手动拼context字符串、手动把上一步结果传进下一步。这就是"状态在节点间自动流转"。
三、并行和反馈循环,也有现成的
上篇我们手写了并行执行(executeParallel起线程池)和反馈循环(executeWithFeedback审查不通过回退重写)。SAA里:
- 并行:把
SequentialAgent换成ParallelAgent.builder().agents(a,b,c),几个Agent同时跑同一个输入,结果自动合并——你不用再写CompletableFuture.allOf().join(); - 主管模式:复杂流程不是固定流水线时,用Supervisor Agent做"调度者",由大模型判断下一步该派哪个角色,相当于上篇那个"分发器"升级成了由模型自主决策,比硬编码if-else灵活。
四、说句公道话:框架不是万能的
不能光吹,有三个边界你得清楚,不然上生产要踩坑:
- 你还是得自己写Prompt——
instruction那部分,角色靠不靠谱全看你Prompt写得行不行,框架只是把架子搭好; - 业务工具还是你自己接——查数据库、调内部接口这些,还是得做成
@Tool函数挂给Agent,框架不替你写业务; - 版本和成本要盯——多Agent一次跑下来是好几倍Token消耗(三个角色各调一次模型),上线前算清楚钱;框架版本也跟着官方更新,别锁死在老里程碑版。
所以正确姿势是:用SAA当骨架,把上篇手写那500行调度代码省掉,把精力放在Prompt和工具上。上篇手写那篇不白写——你真懂了调度原理,用框架时才知道它在背后帮你干了啥,出了问题才查得动。
五、简历可以这么写
基于 Spring AI Alibaba(ReactAgent/SequentialAgent)实现多Agent协作流水线,将需求分析、代码生成、测试用例三个专职Agent串联,通过outputKey自动传递上下文;
替代手写线程池调度约300行代码,支持ParallelAgent并行扩展与Supervisor主管路由。
💡领取完整Demo
关注图片上水印即Java-AI工程师,打出【agents】即可得到:三个ReactAgent + 一条Sequential流水线 + 一个接口,配好Key直接跑。
📢下期预告
多Agent讲完,下一篇回到生产避坑:Agent上线后Token账单爆炸?这5个地方在偷偷烧钱,省下来就是纯利润。
本文属于「Java AI Agent实战」合集