Documentation Index
Fetch the complete documentation index at: https://langchain-zh.cn/llms.txt
Use this file to discover all available pages before exploring further.
在路由器架构中,路由步骤会对输入进行分类,并将其引导至专门的智能体。当您拥有不同的垂直领域(各自需要专属智能体的独立知识领域)时,这非常有用。
主要特性
- 路由器对查询进行分解
- 零个或多个专门智能体被并行调用
- 结果被综合成一个连贯的响应
何时使用
当您拥有不同的垂直领域(各自需要专属智能体的独立知识领域)、需要并行查询多个来源,并希望将结果综合成组合响应时,请使用路由器模式。
基本实现
路由器对查询进行分类并将其引导至适当的智能体。使用 Command 进行单智能体路由,或使用 Send 进行并行扇出到多个智能体。
使用 Command 路由到单个专门智能体:import { z } from "zod";
import { Command } from "@langchain/langgraph";
const ClassificationResult = z.object({
query: z.string(),
agent: z.string(),
});
function classifyQuery(query: string): z.infer<typeof ClassificationResult> {
// 使用 LLM 对查询进行分类并确定合适的智能体
// 分类逻辑在此处
...
}
function routeQuery(state: z.infer<typeof ClassificationResult>) {
const classification = classifyQuery(state.query);
// 路由到选定的智能体
return new Command({ goto: classification.agent });
}
使用 Send 并行扇出到多个专门智能体:import { z } from "zod";
import { Command } from "@langchain/langgraph";
const ClassificationResult = z.object({
query: z.string(),
agent: z.string(),
});
function classifyQuery(query: string): z.infer<typeof ClassificationResult>[] {
// 使用 LLM 对查询进行分类并确定合适的智能体
// 分类逻辑在此处
...
}
function routeQuery(state: typeof State.State) {
const classifications = classifyQuery(state.query);
// 并行扇出到选定的智能体
return classifications.map(
(c) => new Send(c.agent, { query: c.query })
);
}
完整实现请参见以下教程。
教程:使用路由构建多源知识库
构建一个路由器,并行查询 GitHub、Notion 和 Slack,然后将结果综合成一个连贯的答案。涵盖状态定义、专门智能体、使用 Send 的并行执行以及结果综合。
无状态 vs. 有状态
两种方法:
无状态
每个请求独立路由——调用之间没有记忆。对于多轮对话,请参见有状态路由器。
路由器 vs. 子智能体:两种模式都可以将工作分派给多个智能体,但它们在路由决策的制定方式上有所不同:
- 路由器:一个专用的路由步骤(通常是单个 LLM 调用或基于规则的逻辑),对输入进行分类并分派给智能体。路由器本身通常不维护对话历史记录或执行多轮编排——它是一个预处理步骤。
- 子智能体:一个主监督智能体在持续对话中动态决定调用哪些子智能体。主智能体维护上下文,可以跨轮次调用多个子智能体,并编排复杂的多步骤工作流。
当您有清晰的输入类别并希望进行确定性或轻量级分类时,请使用路由器。当您需要灵活、对话感知的编排,其中 LLM 根据不断变化的上下文决定下一步操作时,请使用监督器。
有状态
对于多轮对话,您需要在调用之间维护上下文。
工具包装器
最简单的方法:将无状态路由器包装为对话智能体可以调用的工具。对话智能体处理记忆和上下文;路由器保持无状态。这避免了跨多个并行智能体管理对话历史的复杂性。
const searchDocs = tool(
async ({ query }) => {
const result = await workflow.invoke({ query });
return result.finalAnswer;
},
{
name: "search_docs",
description: "跨多个文档源进行搜索",
schema: z.object({
query: z.string().describe("搜索查询"),
}),
}
);
// 对话智能体将路由器作为工具使用
const conversationalAgent = createAgent({
model,
tools: [searchDocs],
systemPrompt: "你是一个乐于助人的助手。使用 search_docs 来回答问题。",
});
完全持久化
如果您需要路由器本身维护状态,请使用持久化来存储消息历史记录。当路由到智能体时,从状态中获取先前的消息,并有选择地将它们包含在智能体的上下文中——这是上下文工程的一个杠杆。
有状态路由器需要自定义历史管理。 如果路由器在轮次之间切换智能体,当智能体具有不同的语气或提示时,对话对最终用户来说可能感觉不流畅。使用并行调用时,您需要在路由器级别维护历史记录(输入和综合输出),并在路由逻辑中利用此历史记录。请考虑使用交接模式或子智能体模式替代——两者都为多轮对话提供了更清晰的语义。