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'],
        ),
    ],
)

已为您查询到以下信息:

**☀️ 北京今日天气**
- 天气:晴朗

**📰 今日国内新闻概要**
- 中方三艘油轮过航霍尔木兹海峡

如需更详细的天气信息或其他新闻,请随时告诉我!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐