langchain-routerchain
核心概念:什么是 Router Chain?
Router Chain 是 LangChain 中一种特殊类型的链,它的核心功能是:根据输入数据的内容或类型,智能地将其路由(分发)到多个不同的子链(Subchain)或目标处理程序之一。
你可以把它想象成一个智能路由器或调度中心:
输入:一个问题或一段文本。
决策:分析输入内容,判断它属于哪一类任务。
路由:将其发送给最擅长处理该类任务的专用链(子链)。
输出:返回专用链的处理结果。
它的存在是为了解决一个关键问题:如何让一个 AI 系统能够处理多种不同类型的、需要不同专业知识的任务,而不是用一个“万能”的模型去处理所有事情。
为什么需要 Router Chain?
假设你要构建一个全能助手,它能:
回答一般知识问题(例如:“珠穆朗玛峰有多高?”)
进行复杂的数学计算(例如:“计算 3456 x 789 的值”)
分析和总结长篇文档
用一个模型来处理所有任务效率低下。更好的方案是:
知识问题 → 路由到
QA_Chain
(连接到向量数据库)数学计算 → 路由到
Math_Chain
(使用 Python REPL 工具)文档总结 → 路由到
Summarize_Chain
Router Chain 就是实现这个“智能分发”的大脑。
Router Chain 的核心组件与工作流程
一个典型的 Router Chain 系统包含以下部分,其工作流程如下图所示:
下面我们来详解图中的关键组件:
1. 路由链(Router Chain)
这是做决策的链。它本身通常是一个 LLMChain,其提示模板被专门设计用来分析输入并选择目的地。它的输出不是一个直接答案,而是一个指令,指明应该调用哪个子链以及用什么输入调用它。
2. 目标链(Destination Chains)
这些是专门处理特定类型任务的子链(如 QA_Chain
, Math_Chain
)。每个目标链都针对其领域进行了高度优化。
3. 多路由链(MultiRoute Chain)
这是 LangChain 中将 Router Chain 和多个 Destination Chains 组合在一起的高级容器。它负责协调整个路由过程:
将输入传递给 Router Chain。
解析 Router Chain 的决策。
将输入路由到正确的目标链。
从目标链获取结果并返回给用户。
代码示例
以下是一个使用 LLMRouterChain
和 MultiPromptChain
(一种 MultiRoute Chain)的简化示例。
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI# 1. 定义专门针对不同任务的目标链的提示模板
physics_template = """你是一位非常聪明的物理教授。\
你擅长用简单易懂的方式回答物理问题。
当你不知道答案时,你会坦诚承认。问题:
{input}
"""math_template = """你是一位伟大的数学家。\
你擅长回答数学问题。\
你能把复杂问题分解成步骤来进行解答。问题:
{input}
"""# 2. 为目标链创建信息列表
prompt_infos = [{"name": "physics","description": "适用于回答物理问题","prompt_template": physics_template,},{"name": "math","description": "适用于回答数学问题","prompt_template": math_template,},
]# 3. 初始化默认链(如果路由失败则使用)和语言模型
llm = OpenAI(temperature=0)
default_chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template("{input}"))# 4. 创建目标链的映射字典
destination_chains = {}
for p_info in prompt_infos:name = p_info["name"]prompt_template = p_info["prompt_template"]prompt = PromptTemplate(template=prompt_template, input_variables=["input"])chain = LLMChain(llm=llm, prompt=prompt)destination_chains[name] = chain# 5. 组合所有链,创建多路由链
router_chain = MultiPromptChain(router_chain=LLMRouterChain.from_llm(llm, prompt_infos), # 路由决策链destination_chains=destination_chains, # 目标链字典default_chain=default_chain, # 默认链verbose=True, # 显示详细过程
)# 6. 使用路由链!
physics_result = router_chain.run("什么是量子纠缠?")
# 路由链会识别这是物理问题,将其路由到 physics 链处理math_result = router_chain.run("什么是勾股定理?")
# 路由链会识别这是数学问题,将其路由到 math 链处理unknown_result = router_chain.run("今天天气怎么样?")
# 路由链无法识别,将其路由到 default_chain 处理
典型应用场景
构建专家系统:将用户问题路由到不同的专业模型(如法律模型、医疗模型、金融模型)。
处理多格式数据:根据输入是文本、图片还是代码,路由到不同的处理流水线。
降级策略:优先使用更强大的专用链,如果失败则回退到通用的链。
集成多工具:根据问题决定是使用计算器、搜索引擎还是数据库查询。
总结
Router Chain 是 LangChain 框架中实现智能任务分发的核心机制。它通过一个主链(路由链)来分析输入,并根据分析结果将任务分配给多个专门化的子链(目标链)之一来处理,最后汇总结果返回给用户。
这种设计模式极大地增强了AI应用的模块化和专业化能力,使得构建复杂、多功能的全能AI助手成为可能。