模型路由
ModelRouterMiddleware 是一个用于根据输入内容动态路由到最适配模型的中间件。它通过一个"路由模型"分析用户请求,从预定义的模型列表中选择最适合当前任务的模型进行处理。
参数说明
| 参数 | 说明 |
|---|---|
router_model |
用于执行路由决策的模型。 类型: str | BaseChatModel必填: 是 |
model_list |
模型配置列表。 类型: list[ModelDict]必填: 是 |
router_prompt |
自定义路由模型的提示词。 类型: str必填: 否 |
model_list 配置说明
每个模型配置为一个字典,包含以下字段:
| 字段 | 说明 |
|---|---|
model_name |
模型的唯一标识,使用 provider:model-name 格式。类型: str必填: 是 |
model_description |
模型能力或适用场景的简要描述。 类型: str必填: 是 |
tools |
该模型可调用的工具白名单,如果不传,默认该模型拥有所有工具的使用权限。 类型: list[BaseTool]必填: 否 |
model_kwargs |
模型加载时的额外参数。 类型: dict必填: 否 |
model_system_prompt |
模型的系统级提示词。 类型: str必填: 否 |
model_instance |
已实例化的模型对象。 类型: BaseChatModel必填: 否 |
model_instance 字段说明
- 若提供:直接使用该实例,
model_name仅作标识,model_kwargs被忽略;适用于不使用本库的对话模型管理功能的情况。 - 若未提供:根据
model_name和model_kwargs使用load_chat_model加载模型。 - 命名格式:无论哪种情况,
model_name的命名都推荐采用provider:model-name格式。
使用示例
步骤一:定义模型列表
from langchain_dev_utils.agents.middleware.model_router import ModelDict
model_list: list[ModelDict] = [
{
"model_name": "vllm:qwen2.5-7b",
"model_description": "适合普通任务,如对话、文本生成等",
"model_kwargs": {
"temperature": 0.7,
"extra_body": {"chat_template_kwargs": {"enable_thinking": False}},
},
"model_system_prompt": "你是一个助手,擅长处理普通任务,如对话、文本生成等。",
},
{
"model_name": "vllm:qwen2.5-vl-7b",
"model_description": "适合视觉任务",
"tools": [], # 如果该模型不需要任何工具,请将此字段设置为空列表 []
},
{
"model_name": "vllm:glm-4.7-flash",
"model_description": "适合代码生成任务",
"tools": [run_python_code], # 仅允许使用 run_python_code 工具
},
{
"model_name": "openai:gpt-4o",
"model_description": "适合综合类高难度任务",
"model_system_prompt": "你是一个助手,擅长处理综合类的高难度任务",
"model_instance": ChatOpenAI(
model="gpt-4o"
), # 直接传入实例,此时 model_name 仅作标识,model_kwargs 被忽略
},
]
步骤二:创建 Agent 并启用中间件
from langchain_dev_utils.agents.middleware import ModelRouterMiddleware
from langchain_core.messages import HumanMessage
agent = create_agent(
model="vllm:qwen2.5-7b", # 此模型仅作占位,实际由中间件动态替换
tools=[get_current_time],
middleware=[
ModelRouterMiddleware(
router_model="vllm:qwen2.5-7b",
model_list=model_list,
)
],
)
# 路由中间件会根据输入内容自动选择最合适的模型
response = agent.invoke({"messages": [HumanMessage(content="帮我写一个冒泡排序代码")]})
print(response)
tools参数
使用本中间件后,create_agent 的 tools 参数被视为“全局补充工具”。只有当model_list中的模型的tools 字段未定义时,这些全局工具才会被追加到该模型的可用工具列表中;且这些全局工具不能包含在model_list中的模型的tools 字段中。
通过 ModelRouterMiddleware,你可以轻松构建一个多模型、多能力的 Agent,根据任务类型自动选择最优模型,提升响应质量与效率。
并行执行
采用中间件实现模型路由,每次仅会分配一个任务进行执行,如果你想要将任务分解为多个子任务由多个模型进行并行执行,请参考预置StateGraph构建函数。