SpringAiAlibaba学习笔记:循环和路由

发布时间:2026/6/30 4:43:48

SpringAiAlibaba学习笔记:循环和路由 前言这两天2026-06-29大火的loop engineering到底是什么这么说吧就像你在下厨放点盐然后尝尝味道淡了继续放盐再尝尝味道......直到你觉得味道可以了出锅结束放盐尝味这个循环。这个循环工程的本质是人类对AI的输出结果不满意然后对AI进行追问这个过程的自动化。比如你要AI写一个关于《人工智能发展对人类社会的影响》的文章AI输出的第一个版本你觉得有很多待补充的地方评分也就60分左右然后你跟AI说需要补充哪些信息再次生成可以达到75分了再继续让AI完善信息直到拿到一份评分达到90分以上的文章。而loopEngineering是把这个过程进行内化第1轮60 分 → 自检 → 不合格 → 补充对人类当前社会的冲击第2轮75 分 → 自检 → 不合格 → 补充普通人应该如何应对AI的冲击第3轮90 分 → 自检 → 合格 → 输出这样用户直接拿到的就是一个达到90分的最后结果文章。那loop engineering在SpringAiAlibaba里具象就是LoopAgent一、LoopAgent循环执行生活类比论文修改循环想象你在写毕业论文你写完一版初稿交给导师导师看完说第三章逻辑不清重写格式有问题改一下你根据意见修改再交导师再看如果满意就签通过不满意继续打回最多打回 3 次超过就直接放行防止无限循环这个过程就是 LoopAgent。核心概念LoopAgent 只包装一个子 Agent让它反复执行直到满足停止条件或达到最大次数。用户输入 → [Agent执行] → 检查停止条件 → 不满足 → 再执行 → 满足 → 输出结果关键 APILoopAgent loop LoopAgent.builder() .name(quality-loop) // 名字 .description(文章质量循环审核) // 描述 .subAgent(reviewAgent) // 被循环的 Agent注意是 subAgent .loopStrategy(new CountLoopStrategy(3)) // 循环策略最多3次 .build();注意这里用的是.subAgent(Agent)而不是.agent()循环次数通过CountLoopStrategy控制。LoopStrategy 循环策略策略类行为用法适用场景CountLoopStrategy循环固定 N 次new CountLoopStrategy(3)固定循环次数超过则跳出循环ConditionLoopStrategy循环直到条件满足new ConditionLoopStrategy(messages - ...)判断消息内容满足条件跳出循环ArrayLoopStrategy遍历数组元素每个元素循环一次new ArrayLoopStrategy(messages-...)从对话历史msg中提取出需要遍历的集合ConditionLoopStrategy 示例.loopStrategy(new ConditionLoopStrategy(messages - { // 当最后一条消息包含通过时停止循环 if (messages.isEmpty()) return false; String last messages.get(messages.size() - 1).getText(); return last.contains(通过); }))典型使用场景文章质量审核循环不满意就打回重写代码 review 循环直到代码没有严重问题翻译精校循环直到达到指定质量分数LoopAgent 提供了循环的能力但 Loop Engineering 是用循环实现质量提升的设计思想。你需要正确组合 LoopAgent 检查者 条件策略才能真正实现 Loop Engineering如下代码真正实现一个Loop Engineering/** * 创建真正的 Loop Engineering执行者 检查者分离 * * 架构 * LoopAgent (循环控制) * └── SequentialAgent (唯一的 subAgent) * ├── analyst执行者写分析报告 * └── qualityChecker检查者评估质量并给出反馈 * * 每轮循环analyst 写报告 → checker 评估 → ConditionLoopStrategy 决定是否继续 * * 关键设计 * - analyst 只负责写报告不评估质量 * - checker 只负责评估不写报告 * - ConditionLoopStrategy 检查 checker 的输出决定是否继续 * - LoopAgent 只支持一个 subAgent所以用 SequentialAgent 包装两个 agent */ private LoopAgent createRealLoopEngineering() { // 执行者股票分析师只负责写报告 ReactAgent analyst (ReactAgent) ReactAgent.builder() .name(analyst) .model(chatModel) .description(股票分析师根据反馈撰写/修改分析报告) .systemPrompt( 你是一位股票分析师。你的任务是根据用户要求和反馈撰写分析报告。 ## 工作规则 1. 如果是第一次分析根据股票名称撰写完整报告 2. 如果看到审计员反馈根据反馈内容修改和完善报告 3. 每次修改都要针对反馈中提到的不足之处 4. 报告必须包含以下维度 - 基本面主营业务、行业地位、财务指标 - 技术面K线形态、均线系统、MACD、KDJ - 资金面主力资金流向、北向资金 - 消息面近期公告、行业新闻 - 操作建议买入价位、目标价位、止损价位 - 风险评估主要风险点 ## 输出格式必须包含【股票分析报告】标题 【股票分析报告】 ### 1. 基本面分析 ... ### 2. 技术面分析 ... ### 3. 资金面分析 ... ### 4. 操作建议 - 买入价位XX元 - 目标价位XX元 - 止损价位XX元 ### 5. 风险评估 ... 注意你只负责写报告不要自己评估质量。质量评估由审计员负责。 ) .instruction(请分析股票{input}) .outputKey(stock_analysis) .includeContents(true)// 能看到所有的历史消息这样循环时能看到审计员给的反馈 .build(); // 检查者质量审计员只负责评估和反馈 ReactAgent qualityChecker (ReactAgent) ReactAgent.builder() .name(quality_checker) .model(chatModel) .description(质量审计员评估分析报告质量并给出反馈) .systemPrompt( 你是一位严格的质量审计员。你的任务是评估股票分析报告的质量。 ## 评估标准总分 10 分 1. 数据完整性3分是否有具体的财务数据、技术指标 2. 分析深度3分是否有多维度分析而不是泛泛而谈 3. 操作建议2分是否有明确的买入/目标/止损价位 4. 风险评估2分是否有具体的风险点和应对措施 ## 输出格式必须包含【质量评估报告】标题 【质量评估报告】 ### 评分明细 - 数据完整性X/3说明 - 分析深度X/3说明 - 操作建议X/2说明 - 风险评估X/2说明 - **总分X/10** ### 评估结论 - 如果总分 8分输出需改进并详细说明不足和改进建议 - 如果总分 8分输出通过并简要说明优点 注意你只负责评估和反馈不要自己写分析报告。 ) .instruction(请评估以下股票分析报告的质量\n\n{stock_analysis}) .outputKey(quality_feedback) .includeContents(true) .build(); // 用 SequentialAgent 包装 analyst checker因为 LoopAgent 只支持一个 subAgent SequentialAgent analystAndChecker SequentialAgent.builder() .name(analyst_and_checker) .description(分析师写报告 → 审计员评估质量) .subAgents(List.of(analyst, qualityChecker)) .build(); // LoopAgent循环执行 SequentialAgent直到 checker 说通过 return LoopAgent.builder() .name(real_loop_engineering) .description(真正的 Loop Engineering分析师写报告 → 审计员评估 → 不合格则循环) .subAgent(analystAndChecker) // 只有一个 subAgentSequentialAgent .loopStrategy(new ConditionLoopStrategy(messages - { // 检查最后一条消息qualityChecker 的输出的分数 if (messages ! null !messages.isEmpty()) { String lastMsg messages.get(messages.size() - 1).getText(); // 用正则提取分数例如 总分7/10 或 **总分8/10** java.util.regex.Pattern pattern java.util.regex.Pattern.compile(总分[::]\\s*(\\d)/10); java.util.regex.Matcher matcher pattern.matcher(lastMsg); if (matcher.find()) { int score Integer.parseInt(matcher.group(1)); // 分数 8 → 继续循环 // 分数 8 → 停止循环 return score 8; } // 如果没找到分数检查关键词作为兜底 return !lastMsg.contains(通过); } return true; // 没有消息 → 继续循环 }) { Override public int maxLoopCount() { return 5; // 最多循环 5 次防止无限循环 } }) .build(); }二、LlmRoutingAgentLLM 路由分发生活类比医院分诊台你走进医院不知道挂哪个科。分诊台护士问你哪里不舒服你说胸口闷 → 分到心内科你说膝盖疼 → 分到骨科你说有点发烧 → 分到全科分诊台护士就是 Router Agent她根据症状分类把你送到对应的专科医生那里。核心概念LlmRoutingAgent 内部使用 LLM 自动判断输入应该路由到哪个子 Agent用户输入 → LlmRoutingAgent内部 LLM 分类 → tech_expert技术问题agent → billing_expert账单问题agent → general_assistant其他agent路由的依据是子 Agent 的 name 和 description—— LLM 会看哪个 Agent 的 description 最匹配用户问题。关键 API// 技术支持专家 ReactAgent techExpert (ReactAgent) ReactAgent.builder() .name(tech_expert) .model(chatModel) .description(解决技术问题编程、服务器、数据库、网络、AI 等) .systemPrompt( 你是一位资深技术支持专家。请帮助用户解决技术相关问题。 回答要专业、准确、给出可操作的解决方案。回答用中文。) .build(); // 账单专家 ReactAgent billingExpert (ReactAgent) ReactAgent.builder() .name(billing_expert) .model(chatModel) .description(处理计费和账单问题充值、退款、价格、扣款等) .systemPrompt( 你是一位账单和计费专家。请帮助用户解决充值、退款、价格、 账单查询、重复扣款等问题。回答要耐心、清晰。回答用中文。) .build(); // 通用助手 ReactAgent generalAssistant (ReactAgent) ReactAgent.builder() .name(general_assistant) .model(chatModel) .description(处理一般性问题问候、闲聊、常识问答等) .systemPrompt(你是一位友好的通用助手。请帮助用户解答各种日常问题 包括问候、闲聊、常识问答等。回答要亲切、简洁。回答用中文。) .build(); // 创建路由分发 LlmRoutingAgent router LlmRoutingAgent.builder() .name(smart-router) .description(智能客服路由) .model(chatModel) // 路由用的 LLM .systemPrompt(你是一个智能路由器...) // 路由指令 .subAgents(List.of(techExpert, billingExpert, generalAssistant)) .fallbackAgent(general_assistant) // 无法分类时的兜底 .build();注意LlmRoutingAgent 不需要单独写一个 classifier Agent。它内部会用 model 自动根据 subAgent 的 description 做匹配。路由原理用户输入进入 LlmRoutingAgent内部 LLM 阅读所有 subAgent 的 name descriptionLLM 判断哪个 Agent 最适合处理这个问题请求转发到该 Agent如果没有任何 Agent 匹配走.fallbackAgent()指定的兜底 Agent关键description 要写得有区分度// 好的 description — 有明确的领域关键词 .description(解决技术问题编程、服务器、数据库、网络、AI 等) // 差的 description — 太模糊LLM 无法区分 .description(处理问题)典型使用场景智能客服技术问题转技术专家账单问题转财务专家工单分发系统多领域问答助手三、对比总结特性LoopAgentLlmRoutingAgent类比论文修改循环医院分诊台子Agent数1个反复执行多个选一个执行控制逻辑CountLoopStrategy / ConditionLoopStrategy内部 LLM 根据 description 自动匹配Builder方法.subAgent().loopStrategy().model().subAgents().fallbackAgent()适用场景需要迭代优化的任务多领域问题分发

相关新闻