Skip to content

路由器(router)架构中,路由步骤会对输入进行分类,并将其定向到专门的智能体(agents)。当您拥有不同的垂直领域(verticals)——即各自需要专属智能体的独立知识领域时,这种架构非常有用。

mermaid
graph LR
    A([Query]) --> B[Router]
    B --> C[Agent A]
    B --> D[Agent B]
    B --> E[Agent C]
    C --> F[Synthesize]
    D --> F
    E --> F
    F --> G([Combined answer])

主要特性

  • 路由器对查询进行分解
  • 零个或多个专门的智能体被并行调用
  • 结果被合成为一个连贯的响应

使用时机

当您拥有不同的垂直领域(即各自需要专属智能体的独立知识领域)、需要并行查询多个来源,并希望将结果合成为一个统一的响应时,请使用路由器模式。

基础实现

路由器对查询进行分类并将其定向到适当的智能体。使用 Command 进行单智能体路由,或使用 Send 进行向多个智能体的并行扇出(fan-out)。

单智能体
多智能体(并行)

使用 Command 路由到单个专门的智能体:

python
from langgraph.types import Command

def classify_query(query: str) -> str:
    """Use LLM to classify query and determine the appropriate agent."""
    # Classification logic here
    ...

def route_query(state: State) -> Command:
    """Route to the appropriate agent based on query classification."""
    active_agent = classify_query(state["query"])

    # Route to the selected agent
    return Command(goto=active_agent)

关于完整实现,请参阅下面的教程。

教程:构建带路由功能的多源知识库

构建一个路由器,并行查询 GitHub、Notion 和 Slack,然后将结果合成为一个连贯的答案。涵盖状态定义、专门智能体、使用 Send 的并行执行以及结果合成。

无状态 vs. 有状态

两种方法:

无状态

每个请求被独立路由——调用之间没有记忆。对于多轮对话,请参阅有状态路由器

路由器 vs. 子智能体:两种模式都可以将工作分派给多个智能体,但它们在路由决策的制定方式上有所不同:

  • 路由器:一个专用的路由步骤(通常是单个 LLM 调用或基于规则的逻辑),对输入进行分类并分派给智能体。路由器本身通常不维护对话历史记录或执行多轮编排——它是一个预处理步骤。
  • 子智能体:一个主监督智能体在持续对话中动态决定调用哪些子智能体(subagents)。主智能体维护上下文,可以在多轮对话中调用多个子智能体,并编排复杂的多步骤工作流。

当您有清晰的输入类别并希望进行确定性或轻量级分类时,使用路由器。当您需要灵活的、对话感知的编排,由 LLM 根据不断变化的上下文决定下一步做什么时,使用监督智能体

有状态

对于多轮对话,您需要在多次调用之间维护上下文。

工具包装器

最简单的方法:将无状态路由器包装成一个工具,供对话智能体调用。对话智能体处理记忆和上下文;路由器保持无状态。这避免了跨多个并行智能体管理对话历史的复杂性。

python
@tool
def search_docs(query: str) -> str:
    """Search across multiple documentation sources."""
    result = workflow.invoke({"query": query})  
    return result["final_answer"]

# Conversational agent uses the router as a tool
conversational_agent = create_agent(
    model,
    tools=[search_docs],
    prompt="You are a helpful assistant. Use search_docs to answer questions."
)

完全持久化

如果您需要路由器本身维护状态,请使用持久化(persistence)来存储消息历史。当路由到某个智能体时,从状态中获取先前的消息,并有选择地将其包含在智能体的上下文中——这是上下文工程(context engineering)的一个杠杆。

有状态路由器需要自定义历史管理。 如果路由器在多轮对话中在不同智能体之间切换,当智能体具有不同的语气或提示时,对话对最终用户来说可能感觉不流畅。在并行调用的情况下,您需要在路由器级别维护历史记录(输入和合成输出),并在路由逻辑中利用此历史记录。请考虑使用交接模式(handoffs pattern)子智能体模式(subagents pattern)——两者都为多轮对话提供了更清晰的语义。

LangChain 中文文档