Spring AI Alibaba 1.x 系列【43】多智能体 - 路由执行、循环执行
文章目录1. 路由执行1.1 构建子智能体1.2 路由编排1.3 单元测试1.4 路由准确性1.4.1 注意事项1.4.2 系统提示词1.4.3 指令1.4.4 同时使用系统提示词和指令2. 循环执行2.1 构建子智能体2.2 循环编排2.2.1 固定次数循环COUNT2.2.2 条件判断循环CONDITION2.2.3 JSON数组遍历循环JSON_ARRAY2.2.4 自定义循环策略2.3 单元测试1. 路由执行在路由模式中使用大语言模型LLM动态决定将请求路由到哪个子Agent。这种模式非常适合需要智能选择不同专家Agent的场景。关键特性智能路由LLM根据输入内容和子Agent的描述自动选择最合适的Agent灵活扩展可以轻松添加新的专家AgentLLM会自动识别并路由描述驱动子Agent的description非常重要它告诉LLM何时应该选择该Agent单次执行每次请求只路由到一个Agent执行1.1 构建子智能体// 创建专业化的子AgentReactAgentwriterAgentReactAgent.builder().name(writer_agent).model(chatModel).description(擅长创作各类文章包括散文、诗歌等文学作品).instruction(你是一个知名的作家擅长写作和创作。请根据用户的提问进行回答。).outputKey(writer_output).build();ReactAgentreviewerAgentReactAgent.builder().name(reviewer_agent).model(chatModel).description(擅长对文章进行评论、修改和润色).instruction(你是一个知名的评论家擅长对文章进行评论和修改。对于散文类文章请确保文章中必须包含对于西湖风景的描述。).outputKey(reviewer_output).build();ReactAgenttranslatorAgentReactAgent.builder().name(translator_agent).model(chatModel).description(擅长将文章翻译成各种语言).instruction(你是一个专业的翻译家能够准确地将文章翻译成目标语言。).outputKey(translator_output).build();1.2 路由编排直接传入各子智能体即可// 创建路由AgentLlmRoutingAgentroutingAgentLlmRoutingAgent.builder().name(content_routing_agent).description(根据用户需求智能路由到合适的专家Agent).model(chatModel).subAgents(List.of(writerAgent,reviewerAgent,translatorAgent)).build();1.3 单元测试// 使用 - LLM会自动选择最合适的AgentOptionalOverAllStateresult1routingAgent.invoke(帮我写一篇关于春天的散文);// LLM会路由到 writerAgentOptionalOverAllStateresult2routingAgent.invoke(请帮我修改这篇文章春天来了花开了。);// LLM会路由到 reviewerAgentOptionalOverAllStateresult3routingAgent.invoke(请将以下内容翻译成英文春暖花开);// LLM会路由到 translatorAgent1.4 路由准确性1.4.1 注意事项为了提高路由的准确性需要注意以下几点提供清晰明确的Agent描述明确Agent的职责边界使用不同领域的Agent避免能力重叠提供清晰明确的Agent描述给每一个子Agent编写具体、无歧义的description说明。不要笼统模糊介绍需要清晰写明当前Agent擅长的业务、可处理的问题、适用场景。让LLM能通过描述快速判断当前任务是否匹配该Agent。明确Agent的职责边界严格划定每个Agent的权责范围明确哪些任务归它处理、哪些任务不属于它。限制Agent的能力范围不跨业务、跨职能处理问题避免任务归属模糊造成LLM路由判断混乱。使用不同领域的Agent避免能力重叠按垂直领域拆分子Agent每个Agent只聚焦单一专业领域。杜绝多个Agent拥有相同/相似的业务能力防止出现多个Agent都能处理同一任务的情况避免LLM无法抉择、路由错误。1.4.2 系统提示词LlmRoutingAgent支持通过systemPrompt和instruction来自定义路由决策行为提供更精确的路由控制。使用systemPrompt设置路由决策的系统提示会替换默认的系统提示可以通过它提供详细的决策规则和上下文finalStringROUTING_SYSTEM_PROMPT 你是一个智能的内容路由Agent负责根据用户需求将任务路由到最合适的专家Agent。 ## 你的职责 1. 仔细分析用户输入的意图和需求 2. 根据任务特性选择最合适的专家Agent 3. 确保路由决策准确、高效 ## 可用的子Agent及其职责 ### writer_agent - **功能**: 擅长创作各类文章包括散文、诗歌等文学作品 - **适用场景**: * 用户需要创作新文章、散文、诗歌等原创内容 * 简单的写作任务 - **输出**: writer_output ### reviewer_agent - **功能**: 擅长对文章进行评论、修改和润色 - **适用场景**: * 用户需要修改、评审或优化现有文章 * 需要提高文章质量 - **输出**: reviewer_output ### translator_agent - **功能**: 擅长将文章翻译成各种语言 - **适用场景**: * 用户需要将内容翻译成其他语言 * 多语言转换需求 - **输出**: translator_output ## 决策规则 1. **写作任务**: 如果用户需要创作新内容选择 writer_agent 2. **修改任务**: 如果用户需要修改或优化现有内容选择 reviewer_agent 3. **翻译任务**: 如果用户需要翻译内容选择 translator_agent ## 响应格式 只返回Agent名称writer_agent、reviewer_agent、translator_agent不要包含其他解释。 ;LlmRoutingAgentroutingAgentLlmRoutingAgent.builder().name(content_routing_agent).description(根据用户需求智能路由到合适的专家Agent).model(chatModel).systemPrompt(ROUTING_SYSTEM_PROMPT).subAgents(List.of(writerAgent,reviewerAgent,translatorAgent)).build();1.4.3 指令使用instruction设置路由决策的用户指令会作为UserMessage添加到消息列表中可以通过它提供额外的上下文信息或特定的路由指导// 使用 instruction 提供额外的路由指导finalStringROUTING_INSTRUCTION 请根据用户的需求选择最合适的Agent来处理任务。 特别注意 - 如果用户明确提到写、创作、生成等词汇优先选择 writer_agent - 如果用户提到修改、优化、评审等词汇选择 reviewer_agent - 如果用户提到翻译、转换语言等词汇选择 translator_agent ;LlmRoutingAgentroutingAgentLlmRoutingAgent.builder().name(content_routing_agent).description(根据用户需求智能路由到合适的专家Agent).model(chatModel).instruction(ROUTING_INSTRUCTION).subAgents(List.of(writerAgent,reviewerAgent,translatorAgent)).build();1.4.4 同时使用系统提示词和指令特性SystemPromptInstruction作用位置系统消息SystemMessage用户消息UserMessage用途定义路由Agent的角色、职责和决策规则提供具体的路由指导或额外上下文优先级更高影响整体路由行为作为补充信息使用场景需要详细定义路由规则和Agent职责时需要提供特定场景的路由指导时可以同时使用systemPrompt和instruction来提供更完整的路由决策上下文finalStringROUTING_SYSTEM_PROMPT 你是一个智能的内容路由Agent负责根据用户需求将任务路由到最合适的专家Agent。 ## 可用的子Agent及其职责 ### writer_agent - **功能**: 擅长创作各类文章 - **输出**: writer_output ### reviewer_agent - **功能**: 擅长对文章进行评论、修改和润色 - **输出**: reviewer_output ### translator_agent - **功能**: 擅长将文章翻译成各种语言 - **输出**: translator_output ## 响应格式 只返回Agent名称不要包含其他解释。 ;finalStringROUTING_INSTRUCTION 请仔细分析用户输入根据以下规则选择最合适的Agent 1. 创作新内容 - writer_agent 2. 修改现有内容 - reviewer_agent 3. 翻译内容 - translator_agent ;LlmRoutingAgentroutingAgentLlmRoutingAgent.builder().name(content_routing_agent).description(根据用户需求智能路由到合适的专家Agent).model(chatModel).systemPrompt(ROUTING_SYSTEM_PROMPT).instruction(ROUTING_INSTRUCTION).subAgents(List.of(writerAgent,reviewerAgent,translatorAgent)).build();使用说明使用systemPrompt定义路由Agent的整体行为与决策框架。使用instruction提供特定场景的路由指导或额外上下文。两者可搭配使用实现更精准的路由控制。2. 循环执行LoopAgent是支持多种循环执行模式的流程型智能体用于重复执行单个子Agent它基于StateGraph构建循环流程支持固定次数、条件判断、JSON数组遍历等标准化循环策略也支持用户自定义扩展。关键特性多模式循环支持固定次数、条件判断、JSON数组遍历、自定义循环策略单一执行单元强制绑定单个子Agent作为每次循环的执行主体灵活扩展通过实现LoopStrategy接口可自定义任意循环逻辑框架集成无缝适配AI状态图执行框架自动管理循环状态与流程LoopAgent内置4种循环模式覆盖绝大多数循环场景固定次数模式COUNT按照指定的次数重复执行子Agent条件判断模式CONDITION类do-while结构条件为true时终止循环JSON数组遍历模式JSON_ARRAY解析JSON数组遍历每一个元素执行子Agent自定义循环策略实现LoopStrategy接口定制专属循环逻辑2.1 构建子智能体LoopAgent必须且只能绑定一个子Agent先构建循环中需要重复执行的子智能体// 构建循环执行的子Agent示例数据处理AgentReactAgentdataProcessAgentReactAgent.builder().name(data_process_agent).model(chatModel).description(负责单条数据的清洗、解析与格式化).instruction(你是一个数据处理专家负责处理输入的单条数据返回格式化后的结果).outputKey(process_result).build();2.2 循环编排通过LoopAgentBuilder构建循环代理指定循环策略和子Agent支持四种循环模式配置2.2.1 固定次数循环COUNT// 构建固定次数循环执行3次子AgentLoopAgentloopAgentLoopAgent.builder().name(count_loop_agent).description(固定次数循环代理执行3次数据处理)// 指定循环策略固定执行3次.loopStrategy(LoopMode.count(3))// 指定循环执行的子Agent.subAgent(dataProcessAgent).build();2.2.2 条件判断循环CONDITION// 构建条件循环满足条件时终止循环LoopAgentloopAgentLoopAgent.builder().name(condition_loop_agent).description(条件判断循环代理符合条件则终止)// 指定循环策略条件为true时停止循环.loopStrategy(LoopMode.condition(state-// 自定义终止条件状态中包含成功标识state.containsKey(process_success))).subAgent(dataProcessAgent).build();2.2.3 JSON数组遍历循环JSON_ARRAY// 构建JSON数组遍历循环遍历数组元素执行LoopAgentloopAgentLoopAgent.builder().name(json_array_loop_agent).description(JSON数组遍历循环代理逐条处理数据)// 指定循环策略遍历状态中的data_array数组.loopStrategy(LoopMode.jsonArray(data_array)).subAgent(dataProcessAgent).build();2.2.4 自定义循环策略// 自定义循环策略实现LoopStrategy接口LoopStrategycustomLoopStrategynewCustomLoopStrategy();LoopAgentloopAgentLoopAgent.builder().name(custom_loop_agent).description(自定义循环策略代理).loopStrategy(customLoopStrategy).subAgent(dataProcessAgent).build();2.3 单元测试直接调用invoke方法执行循环代理框架自动按照循环策略执行// 1. 固定次数循环测试OverAllStateinputState1newOverAllState();OptionalOverAllStateresult1loopAgent.invoke(inputState1);// 子Agent会自动执行3次// 2. 条件循环测试OverAllStateinputState2newOverAllState();OptionalOverAllStateresult2loopAgent.invoke(inputState2);// 循环执行直到状态满足终止条件// 3. JSON数组遍历测试OverAllStateinputState3newOverAllState();// 存入待遍历的JSON数组inputState3.put(data_array,[{\id\:1},{\id\:2},{\id\:3}]);OptionalOverAllStateresult3loopAgent.invoke(inputState3);// 逐条处理数组中的3个元素