说明: 原先的 Spring Boot 示例模块在 Router 模式中,路由步骤对输入进行分类并分发给专职智能体。可以调用零个或多个专家(例如并行),再将结果合成为一个回答。适用于存在多个垂直领域的场景——每个领域有独立的知识与对应智能体(如 GitHub、Notion、Slack)。 在 Routing 模式中,路由器对查询进行分解,专家智能体被调用(单个或并行),最后得到组合答案。agentscope-examples/multiagent-patterns/已在 2.0 包重构中移除。请以本文中的代码片段作为参考实现。其他可运行示例见agentscope-examples/documentation/。
概述
核心特点:- 分类步骤:路由器(如 LLM 或规则分类器)决定调用哪些专家以及向每个专家发送什么子查询。
- 专家智能体:每个垂直领域有独立智能体(如 GitHub 专家、Notion 专家、Slack 专家),以 AgentScopeAgent 与 AgentScope 工具实现。
- 合成:将专家返回的原始结果合并为一个连贯答案(例如通过一次最终 LLM 调用)。
架构
DashScopeChatModel 和 AgentScopeAgent 作为各专家(GitHub、Notion、Slack),并配以桩工具(GitHubStubTools、NotionStubTools、SlackStubTools)。
Simple 与 Graph 对比
实现(Simple 变体)
设计要点
- 单一调用完成路由:业务只调
RouterService.run(query);内部用 AgentScopeRoutingAgent 一次invoke(query)完成分类、并行专家、框架内 merge。 - 合成可选:若路由框架已写入
RoutingMergeNode.DEFAULT_MERGED_OUTPUT_KEY,则直接用作最终答案;否则由 RouterService 用同一Model再跑一次 LLM,将各专家结果合成为一条回复。
代码结构(包 io.agentscope.examples.routing.simple)
Bean 与约定
- Model:一个
ModelBean(如DashScopeChatModel),供路由与所有专家共用。 - 专家 AgentScopeAgent:每个领域一个,例如:
name/description:供路由分类时识别;- instruction:模板中含占位符
{agentName_input}(如{github_input}),由路由节点在运行时填入子查询; - outputKey:该专家结果写入状态的键,如
github_key、notion_key、slack_key; - Toolkit:注册该领域的桩工具(如
GitHubStubTools的search_code、search_issues)。
- AgentScopeRoutingAgent:
AgentScopeRoutingAgent.builder().model(...).subAgents(List.of(githubAgent, notionAgent, slackAgent)).build();内部实现分类 + 并行调用专家 + 将结果写入各outputKey及 merge 键。 - RouterService:持有
Model与AgentScopeRoutingAgent;run(query)后若需要合成,则用Model将各专家结果格式化为一段 prompt 再调用一次 chat,得到finalAnswer。
RouterService.run 逻辑(简要)
routerAgent.invoke(query)→ 得到OverAllState。- 遍历
github_key、notion_key、slack_key:若 state 中有该 key,则从 state 取agentName_input与专家输出,构造Classification与AgentOutput列表。 - 若 state 中存在
RoutingMergeNode.DEFAULT_MERGED_OUTPUT_KEY,则将其内容作为finalAnswer;否则调用synthesize(query, results)(同一 Model,系统提示为“合并多源结果回答原问题”),返回值作为finalAnswer。 - 返回
RouterResult(query, classifications, results, finalAnswer)。
实现(Graph 变体)
设计要点
- 路由作为子图嵌入:整体是 StateGraph,其中「路由」不是单个 Bean 调用,而是 AgentScopeRoutingAgent.getAndCompileGraph() 返回的已编译子图作为一节节点;子图内部仍是分类 → 并行专家 → merge。
- 显式预处理与后处理:在路由节点前后增加 PreprocessNode 与 PostprocessNode,用于校验、规范化、埋点、格式化等,状态在整图上流转,便于扩展和观测。
代码结构(包 io.agentscope.examples.routing.graph)
图与状态键
- StateGraph:
new StateGraph("routing_graph", keyFactory),边为START → preprocess → routing → postprocess → END。 - keyFactory:为
input、query、messages、preprocess_metadata、merged_result、final_answer、postprocess_metadata以及github_key、notion_key、slack_key等配置策略(多为ReplaceStrategy,messages为AppendStrategy(false))。 - preprocess 节点:
node_async(new PreprocessNode()),纯函数节点,无 LLM;输出供 routing 子图消费。 - routing 节点:
routerAgent.getAndCompileGraph(),即把「分类 + 并行专家 + merge」整段逻辑作为子图挂到主图的一节,子图输出写入merged_result(及各xxx_key)。 - postprocess 节点:
node_async(new PostprocessNode()),读取 merge 结果与预处理元数据,写出final_answer与postprocess_metadata。
PreprocessNode / PostprocessNode 与 Simple 的区别
- Simple:无独立预处理;若需要“再合成”,仅在 RouterService 内用 Model 做一次调用,无统一的状态键或 trace 元数据。
- Graph:预处理集中做校验与规范化,并写入
preprocess_metadata(如 traceId);后处理集中做最终格式与日志,并写入postprocess_metadata;整条链路状态一致,便于扩展(如加条件分支、额外节点)。
示例项目
- Simple:入口为
RouterService.run(query);流程为分类 → 并行专家 →(框架 merge)→ 可选 RouterService 合成。设置routing.runner.enabled=true可在启动时运行 Simple 演示(见 RoutingRunner)。 - Graph:入口为
RoutingGraphService.run(query);流程为预处理 → 路由子图 → 后处理。设置routing-graph.runner.enabled=true可在启动时运行 Graph 演示(见 RoutingGraphRunner)。
AI_DASHSCOPE_API_KEY(或 spring.ai.dashscope.api-key)供 DashScope 模型与专家调用。
相关文档
- Pipeline - 顺序与并行智能体组合
- MsgHub - 多智能体消息广播
- Agent as Tool - 将智能体注册为工具