概述
路由器模式是一种多智能体架构,其中路由步骤对输入进行分类并将其定向给专业化的智能体,然后将结果综合成一个组合响应。当您的组织知识分散在不同的垂直领域(即独立的知识域,每个都需要自己的、配备专业工具和提示词的智能体)时,这种模式尤为出色。 在本教程中,您将构建一个多源知识库路由器,通过一个实际的企业场景来展示这些优势。该系统将协调三个专业智能体:- GitHub 智能体:搜索代码、议题和拉取请求。
- Notion 智能体:搜索内部文档和维基。
- Slack 智能体:搜索相关的线程和讨论。
为什么使用路由器?
路由器模式提供了几个优势:- 并行执行:同时查询多个数据源,与顺序方法相比减少了延迟。
- 专业化智能体:每个垂直领域都有为其领域优化的聚焦工具和提示词。
- 选择性路由:并非每个查询都需要每个数据源——路由器会智能地选择相关的垂直领域。
- 有针对性的子问题:每个智能体都会收到针对其领域定制的问题,从而提高结果质量。
- 清晰的综合:来自多个数据源的结果被合并成一个单一、连贯的响应。
核心概念
我们将涵盖以下概念:- 多智能体系统
- 用于工作流编排的 StateGraph
- 用于并行执行的 Send API
环境设置
安装
本教程需要langchain 和 langgraph 包:
LangSmith
设置 LangSmith 以检查智能体内部发生的情况。然后设置以下环境变量:选择一个 LLM
从 LangChain 的集成套件中选择一个聊天模型:- OpenAI
- Anthropic
- Azure
- Google Gemini
- AWS Bedrock
- HuggingFace
- OpenRouter
1. 定义状态
首先,定义状态模式。我们使用三种类型:AgentInput:传递给每个子智能体的简单状态(只是一个查询)AgentOutput:每个子智能体返回的结果(数据源名称 + 结果)RouterState:主工作流状态,跟踪查询、分类、结果和最终答案
results 字段使用一个归约器(Python 中的 operator.add,JS 中的连接函数)将并行智能体执行的输出收集到一个单一的列表中。
2. 为每个垂直领域定义工具
为每个知识域创建工具。在生产系统中,这些工具将调用实际的 API。对于本教程,我们使用返回模拟数据的存根实现。我们在 3 个垂直领域中定义了 7 个工具:GitHub(搜索代码、议题、PR)、Notion(搜索文档、获取页面)和 Slack(搜索消息、获取线程)。3. 创建专业化的智能体
为每个垂直领域创建一个智能体。每个智能体都有领域特定的工具和为其知识源优化的提示词。这三个智能体遵循相同的模式——只有工具和系统提示词不同。4. 构建路由器工作流
现在使用 StateGraph 构建路由器工作流。工作流有四个主要步骤:- 分类:分析查询并确定要调用哪些智能体以及使用什么子问题
- 路由:使用
Send并行扇出到选定的智能体 - 查询智能体:每个智能体接收一个简单的
AgentInput并返回一个AgentOutput - 综合:将收集到的结果组合成一个连贯的响应
5. 编译工作流
现在通过边连接节点来组装工作流。关键是使用add_conditional_edges 配合路由函数来实现并行执行:
add_conditional_edges 调用通过 route_to_agents 函数将分类节点连接到智能体节点。当 route_to_agents 返回多个 Send 对象时,这些节点会并行执行。
6. 使用路由器
测试您的路由器是否能处理跨越多个知识域的查询:7. 理解架构
路由器工作流遵循一个清晰的模式:分类阶段
classify_query 函数使用结构化输出来分析用户查询并确定要调用哪些智能体。路由智能就在这里:
- 使用 Pydantic 模型(Python)或 Zod 模式(JS)来确保有效输出
- 返回一个
Classification对象列表,每个对象包含source和针对性的query - 仅包含相关的来源——不相关的来源会被直接省略
使用 Send 进行并行执行
route_to_agents 函数将分类映射到 Send 对象。每个 Send 指定目标节点和要传递的状态:
AgentInput,只包含 query 字段——而不是完整的路由器状态。这保持了接口的清晰和显式。
使用归约器收集结果
智能体的结果通过一个归约器流回主状态。每个智能体返回:operator.add)连接这些列表,将所有并行结果收集到 state["results"] 中。
综合阶段
所有智能体完成后,synthesize_results 函数遍历收集到的结果:
- 等待所有并行分支完成(LangGraph 自动处理)
- 引用原始查询以确保答案解决用户所问
- 组合来自所有来源的信息,避免冗余
部分结果:在本教程中,所有选定的智能体必须在综合前完成。
8. 完整的工作示例
以下是所有内容放在一个可运行的脚本中:9. 高级:有状态的路由器
我们迄今构建的路由器是无状态的(每个请求独立处理,调用之间没有记忆)。对于多轮对话,您需要一种有状态的方法。工具包装器方法
添加对话记忆的最简单方法是将无状态路由器包装成一个工具,供对话智能体调用:完整持久化方法
如果您需要路由器本身维护状态——例如,在路由决策中使用之前的搜索结果——请使用持久化在路由器级别存储消息历史。10. 关键要点
当您具备以下条件时,路由器模式表现出色:- 独立的垂直领域:需要专业化工具和提示词的独立知识域
- 并行查询需求:能够从同时查询多个数据源中受益的问题
- 综合要求:需要将来自多个数据源的结果组合成一个连贯的响应
后续步骤
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

