第08章:中间件(5)

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

已为您查询到以下信息:

**☀️ 北京今日天气**

  • 天气:晴朗

**📰 今日国内新闻概要**

  • 中方三艘油轮过航霍尔木兹海峡

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

相关推荐
-今昭-1 小时前
MooseFS分布式文件系统
linux·服务器·网络
tech_zjf2 小时前
当 AI 把 Next.js Route 越写越快:我为什么做了 next-route-kit
前端·后端
常宇佳2 小时前
vue3 @代指src路径设置
前端·typescript·vue
砚凝霜2 小时前
软考网络工程师|案例分析:Eth‑Trunk 链路聚合、iStack 堆叠、CSS 集群核心考点总结
前端·css·网络
万联WANFLOW2 小时前
Meta开源了能本地跑的agent
运维·服务器·网络·人工智能·业界资讯
Brilliantwxx2 小时前
【Linux】 进程(1) 从冯诺依曼体系到进程核心概念
linux·运维·服务器
二级小助手2 小时前
二级Web前端选择题高频真题20道与考场避坑笔记
javascript·css3·html5·web前端·计算机二级·二级web·web真题
珐恩AI-人工智能2 小时前
大模型意图召回偏差分析:GEO如何解决“有收录却不触发问答曝光”的难题
大数据·前端·人工智能·html·流量运营·geo优化
王志来137944730082 小时前
从分散到集成:工控服务器机箱采购如何实现“一站式”破局
运维·服务器·人工智能·python