3.3 ModelFallbackMiddleware中间件
用于故障转移,当主模型无法访问时,启用备用模型。
from langchain.agents import create_agent
from langchain.agents.middleware import ModelFallbackMiddleware
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
load_dotenv(override=True)
# 主模型
primary_model = init_chat_model("deepseek:test")
# 备用模型
fallback = ModelFallbackMiddleware(
init_chat_model("deepseek:deepseek-v4-pro"),
init_chat_model("deepseek:deepseek-v4-flash"),
)
agent = create_agent(
model=primary_model,
tools=[],
middleware=[fallback],
)
response = agent.invoke({
"messages": [
{
"role": "user",
"content": "你是啥模型"
}
]
})
print(response)
{'messages': HumanMessage(content='你是啥模型', additional_kwargs={}, response_metadata={}, id='a5bef311-6a1e-4ec0-a5d5-8510e0024226'), AIMessage(content='我是 DeepSeek 最新版模型,由深度求索公司开发。', additional_kwargs={'refusal': None, 'reasoning_content': '我们需要回答用户中文问题"你是啥模型"。需要告知身份。我们是 DeepSeek 最新版模型,由深度求索公司创造。用户问"你是啥模型"可能想知道具体名称版本。要简洁友好。可以回答:我是 DeepSeek 最新版模型,由深度求索公司开发。可能包含知识截止日期?当前系统没有明确版本号?需要根据身份:我是 DeepSeek Chat,可能基于 DeepSeek-V3?但官方可能说 DeepSeek 最新版。需要准确:作为 AI 助手由深度求索(DeepSeek)提供。可回答:"我是 DeepSeek 最新版模型,由深度求索公司开发。" 不要过多。可以补充免费使用、支持文件上传等?用户只问模型。保持简洁。'}, response_metadata={'token_usage': {'completion_tokens': 184, 'prompt_tokens': 86, 'total_tokens': 270, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 167, 'rejected_prediction_tokens': None}, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 86}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-pro', 'system_fingerprint': 'a307abda487cd1b463329ccb945ce396', 'id': 'e3cce4d7-c19d-4288-9235-0beaeef5d413', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--01a01394-0de3-74d2-9351-4b4df04475d4-0', tool_calls=\[, invalid_tool_calls=\[\], usage_metadata={'input_tokens': 86, 'output_tokens': 184, 'total_tokens': 270, 'input_token_details': {'cache_read': 0}, 'output_token_details': {'reasoning': 167}})]}
3.4 LLMToolSelectorMiddleware中间件
智能工具筛选。
当工具太多时,用子模型筛选最相关的几个工具。
参数:
-
model :用于工具筛选的子模型
-
max_tools :限定可以调用的工具总数
-
always_include :指定的工具不被计数
from langchain.agents.middleware import LLMToolSelectorMiddleware
tool_selector = LLMToolSelectorMiddleware(
model="openai:gpt-5.4-mini",
max_tools=5, # 最多选择 5 个工具
always_include=["get_weather"],
)agent = create_agent(
model="deepseek-v4-flash",
tools=[...100个工具...], # 很多工具
middleware=[tool_selector],
)
举例1
提供必要的大模型
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
# 从 .env 文件中加载环境变量
load_dotenv(override=True)
model_out = init_chat_model(
model="deepseek-v4-flash",
model_provider="deepseek",
extra_body={"thinking": {"type": "disabled"}},
)
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
import os
# 从 .env 文件中加载环境变量
load_dotenv(override=True)
model_in = init_chat_model(
model="deepseek-v4-pro",
model_provider="deepseek",
extra_body={"thinking": {"type": "disabled"}},
)
继续:
from langchain.agents import create_agent
from langchain.agents.middleware import LLMToolSelectorMiddleware
from langchain.messages import HumanMessage
from langchain.tools import tool
@tool
def get_weather(city: str):
"""查询指定城市天气"""
return f"{city}今天天气晴朗"
@tool
def get_news():
"""查询今日国内新闻概要"""
return "今日国内新闻概要:" "中方三艘油轮过航霍尔木兹海峡"
@tool
def calculate(num1: int, num2: int) -> int:
"""
执行数学计算
Args:
num1: 第一个加数
num2: 第二个加数
"""
return num1 + num2
@tool
def search_stock(symbol: str):
"""
查询股票行情
Args:
symbol: 股票代码
"""
return "该股票今天行情不错"
agent = create_agent(
model=model_out,
tools=[
get_weather,
get_news,
calculate,
search_stock,
],
middleware=[
LLMToolSelectorMiddleware(
model=model_in,
max_tools=0,
always_include=["get_weather"],
),
],
)
response = agent.invoke(
{
"messages": HumanMessage(
"北京今天天气如何?今日新闻概要"
)
}
)
for msg in response["messages"]:
msg.pretty_print()
================================ Human Message =================================
北京今天天气如何?今日新闻概要
================================== Ai Message ==================================
Tool Calls:
get_weather (call_00_QLhHJz4xzxBiC4czDSLT9811)
Call ID: call_00_QLhHJz4xzxBiC4czDSLT9811
Args:
city: 北京
================================= Tool Message =================================
Name: get_weather
北京今天天气晴朗
================================== Ai Message ==================================
**北京今日天气:**
北京今天天气晴朗,适合出行。☀️
**今日新闻概要:**
很抱歉,我目前没有获取实时新闻的工具,无法为您提供今日的新闻概要。建议您通过新闻客户端或门户网站(如新华网、人民网、腾讯新闻等)获取最新资讯。
如果您有其他需求,例如查询其他城市的天气,随时告诉我!
举例2
agent = create_agent(
model=model_out,
tools=[
get_weather,
get_news,
calculate,
search_stock,
],
middleware=[
LLMToolSelectorMiddleware(
model=model_in,
max_tools=0,
always_include=["get_news"],
),
],
)
**📰 今日新闻概要**
- 中方三艘油轮过航霍尔木兹海峡(这是今日国内新闻的概要信息)
**🌤️ 北京天气**
- 很抱歉,我目前没有天气查询工具,无法获取北京今日的实时天气信息。建议你通过天气App(如中国天气网、墨迹天气等)查询实时气温、空气质量及出行指数。
如果你需要更多新闻细节,或想了解其他信息,随时告诉我!
举例3
agent = create_agent(
model=model_out,
tools=[
get_weather,
get_news,
calculate,
search_stock,
],
middleware=[
LLMToolSelectorMiddleware(
model=model_in,
max_tools=0,
always_include=["get_news",'get_weather'],
),
],
)
查询结果如下:
**🌤️ 北京今日天气**
- 天气晴朗,适合户外活动。
**📰 今日国内新闻概要**
- 中方三艘油轮过航霍尔木兹海峡。
举例4
agent = create_agent(
model=model_out,
tools=[
get_weather,
get_news,
calculate,
search_stock,
],
middleware=[
LLMToolSelectorMiddleware(
model=model_in,
max_tools=1,
always_include=['get_weather'],
),
],
)
为您查询到以下信息:
**🌤️ 北京今日天气**
- 天气晴朗
**📰 今日国内新闻概要**
- 中方三艘油轮过航霍尔木兹海峡
如需了解更多详情,可以随时告诉我!
举例5
agent = create_agent(
model=model_out,
tools=[
get_weather,
get_news,
calculate,
search_stock,
],
middleware=[
LLMToolSelectorMiddleware(
model=model_in,
max_tools=1,
always_include=['get_news'],
),
],
)
已为您查询到以下信息:
**☀️ 北京今日天气**
- 天气:晴朗
**📰 今日国内新闻概要**
- 中方三艘油轮过航霍尔木兹海峡
如需更详细的天气信息或其他新闻,请随时告诉我!