切换主题
第 10 章:LLM Routing,让模型当分诊台
顺序、并行、循环解决的是“任务怎么执行”。Routing 解决的是“任务该交给谁”。当用户一句话可能涉及多个专家 Agent,就需要一个路由器先分诊。
本章边界
本章讲 LLM 根据语义选择子 Agent。它很有用,但不是万能分诊台;能用稳定规则解决的分支,优先用代码或 Graph 条件边。
1. 生活类比:医院分诊台
你去医院说“胸口疼,还咳嗽”。分诊台不会直接治疗,它先判断该挂急诊、呼吸科还是心内科。路由 Agent 也是这样:它不一定直接完成任务,而是判断哪些子 Agent 应该参与。
| 医院 | LLM Routing |
|---|---|
| 分诊台 | LlmRoutingAgent |
| 科室 | 子 ReactAgent |
| 科室牌 | description(...) |
| 会诊总结 | 合并节点 / 结果综合 |
子 Agent 的 description(...) 很重要。描述写得模糊,路由器就像看不懂科室牌。
2. 最小路由示例
java
ReactAgent githubAgent = ReactAgent.builder()
.name("github")
.description("处理代码、issue、pull request 相关问题")
.model(chatModel)
.methodTools(githubTools)
.outputKey("github_key")
.inputType(String.class)
.build();
ReactAgent slackAgent = ReactAgent.builder()
.name("slack")
.description("处理团队讨论和消息搜索")
.model(chatModel)
.methodTools(slackTools)
.outputKey("slack_key")
.inputType(String.class)
.build();
LlmRoutingAgent router = LlmRoutingAgent.builder()
.name("router")
.model(chatModel)
.subAgents(List.of(githubAgent, slackAgent))
.build();这段代码最关键的是两个 description(...)。它们不是注释,而是给路由模型看的能力说明。
3. 路由流程
Routing 和 Parallel 的区别在这里:
| 模式 | 做法 | 适合场景 |
|---|---|---|
| Parallel | 所有专家都做,再合并 | 每个专家都应该参与 |
| Routing | 先判断谁相关,再派发 | 只有部分专家相关 |
如果你的规则是“金额大于 10000 走人工审核”,别用 LLM Routing。这个分支确定、稳定、可解释,用普通代码更好。
4. 决策表
| 场景 | 推荐 |
|---|---|
| “一定要先 A 再 B” | Sequential |
| “A/B/C 都要做,最后合并” | Parallel |
| “做完要评分,不合格继续做” | Loop |
| “先判断交给哪个专家” | Routing |
| “规则非常确定” | 普通代码或 Graph 条件边 |
Routing 的价值在语义判断,不在替代所有 if-else。
5. 新手容易误解什么
误解一:Routing 可以替代所有分支逻辑。
不可以。确定规则交给代码,语义判断才交给模型。
误解二:子 Agent 名字写清楚就够。
名字只是短标签,description(...) 才是能力说明。路由模型主要靠它理解谁能做什么。
误解三:Routing 等于多 Agent 都执行。
不等于。Routing 是先分诊;Parallel 才是都执行。
6. 本章小结
Routing 的核心:
text
描述能力 -> 判断相关性 -> 分派子任务 -> 合并结果下一章我们从算法和源码回到工程:Studio、Starters、A2A、Nacos、Observation。
7. 练习题
- 给“技术支持 Agent、售前 Agent、财务 Agent”各写一句清晰的
description(...)。 - 判断下面场景该用 Routing 还是 if-else:金额审批、用户意图分流、文件类型判断、复杂问题分诊。
- 设计一个路由结果日志,记录用户问题、命中的 Agent、置信理由和最终输出。
课后源码索引:想验证实现时再打开
| 你想验证的结论 | 源码锚点 |
|---|---|
| 官方 Routing 示例 | examples/multiagent-patterns/routing/src/main/java/com/alibaba/cloud/ai/examples/multiagents/routing/simple/RoutingConfig.java,类 RoutingConfig,方法 githubAgent(...)、notionAgent(...)、slackAgent(...)、routerAgent(...) |
| LLM Routing Agent 如何构建 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/agent/LlmRoutingAgent.java,类 LlmRoutingAgent,方法 builder()、buildSpecificGraph(...) |
| 路由图如何生成 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/strategy/RoutingGraphBuildingStrategy.java,类 RoutingGraphBuildingStrategy |
| 子 Agent 输出如何合并 | spring-ai-alibaba-agent-framework/src/main/java/com/alibaba/cloud/ai/graph/agent/flow/node/RoutingMergeNode.java,类 RoutingMergeNode |
| 示例服务如何收集分类和输出 | examples/multiagent-patterns/routing/src/main/java/com/alibaba/cloud/ai/examples/multiagents/routing/simple/RouterService.java,类 RouterService,方法 run(...)、collectClassifications(...)、collectAgentOutputs(...)、synthesize(...) |