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

核心特征

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

何时使用

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

基本实现

路由器对查询进行分类,并将其定向到合适的智能体。对于单智能体路由,使用 Command;对于向多个智能体并行分发,使用 Send。
使用 Command 将查询路由到单个专门的智能体:
要查看完整实现,请参见下面的教程。

教程:使用路由构建多源知识库

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

无状态与有状态

两种方法:

无状态

每个请求都被独立路由——调用之间没有记忆。要进行多轮对话,请参见有状态路由器。
路由器与子智能体:这两种模式都可以将任务分派给多个智能体,但它们在路由决策的制定方式上有所不同:
  • 路由器:一个专门的路由步骤(通常是一次大语言模型调用或基于规则的逻辑),用于对输入进行分类并分派给智能体。路由器本身通常不维护对话历史或执行多轮编排——它是一个预处理步骤。
  • 子智能体:一个主监督智能体动态决定在进行的对话中调用哪些子智能体。主智能体维护上下文,可以在多个回合中调用多个子智能体,并编排复杂的多步骤工作流。
当你拥有清晰的输入类别并希望进行确定性或轻量级分类时,请使用路由器。当你需要灵活的、感知对话的编排,让大语言模型根据不断变化的上下文决定下一步该做什么时,请使用监督者。

有状态

对于多轮对话,你需要跨调用维护上下文。

工具封装

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

完全持久化

如果你需要路由器本身维护状态,请使用持久化来存储消息历史。当路由到某个智能体时,从状态中获取先前的消息,并有选择地将它们包含在智能体的上下文中——这是进行上下文工程的一个杠杆。
有状态路由器需要自定义历史管理。 如果路由器在多个回合之间切换智能体,当智能体具有不同的语气或提示时,对话对最终用户来说可能不够流畅。在使用并行调用时,你需要在路由器级别(输入和合成的输出)维护历史记录,并在路由逻辑中利用此历史记录。请考虑改用移交模式或子智能体模式——这两种模式都为多轮对话提供了更清晰的语义。