第08章:中间件(5)

📅 2026/8/18 19:35:20
第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(overrideTrue) # 主模型 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( modelprimary_model, tools[], middleware[fallback], ) response agent.invoke({ messages: [ { role: user, content: 你是啥模型 } ] }) print(response){messages: [HumanMessage(content你是啥模型, additional_kwargs{}, response_metadata{}, ida5bef311-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}, idlc_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( modelopenai:gpt-5.4-mini, max_tools5, # 最多选择 5 个工具 always_include[get_weather], ) agent create_agent( modeldeepseek-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(overrideTrue) model_out init_chat_model( modeldeepseek-v4-flash, model_providerdeepseek, extra_body{thinking: {type: disabled}}, )from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os # 从 .env 文件中加载环境变量 load_dotenv(overrideTrue) model_in init_chat_model( modeldeepseek-v4-pro, model_providerdeepseek, 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( modelmodel_out, tools[ get_weather, get_news, calculate, search_stock, ], middleware[ LLMToolSelectorMiddleware( modelmodel_in, max_tools0, 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_QLhHJz4xzxBiC4czDSLT9811Args:city: 北京 Tool Message Name: get_weather北京今天天气晴朗 Ai Message **北京今日天气**北京今天天气晴朗适合出行。☀️**今日新闻概要**很抱歉我目前没有获取实时新闻的工具无法为您提供今日的新闻概要。建议您通过新闻客户端或门户网站如新华网、人民网、腾讯新闻等获取最新资讯。如果您有其他需求例如查询其他城市的天气随时告诉我举例2agent create_agent( modelmodel_out, tools[ get_weather, get_news, calculate, search_stock, ], middleware[ LLMToolSelectorMiddleware( modelmodel_in, max_tools0, always_include[get_news], ), ], )** 今日新闻概要**- 中方三艘油轮过航霍尔木兹海峡这是今日国内新闻的概要信息**️ 北京天气**- 很抱歉我目前没有天气查询工具无法获取北京今日的实时天气信息。建议你通过天气App如中国天气网、墨迹天气等查询实时气温、空气质量及出行指数。如果你需要更多新闻细节或想了解其他信息随时告诉我举例3agent create_agent( modelmodel_out, tools[ get_weather, get_news, calculate, search_stock, ], middleware[ LLMToolSelectorMiddleware( modelmodel_in, max_tools0, always_include[get_news,get_weather], ), ], )查询结果如下**️ 北京今日天气**- 天气晴朗适合户外活动。** 今日国内新闻概要**- 中方三艘油轮过航霍尔木兹海峡。举例4agent create_agent( modelmodel_out, tools[ get_weather, get_news, calculate, search_stock, ], middleware[ LLMToolSelectorMiddleware( modelmodel_in, max_tools1, always_include[get_weather], ), ], )为您查询到以下信息**️ 北京今日天气**- 天气晴朗** 今日国内新闻概要**- 中方三艘油轮过航霍尔木兹海峡如需了解更多详情可以随时告诉我举例5agent create_agent( modelmodel_out, tools[ get_weather, get_news, calculate, search_stock, ], middleware[ LLMToolSelectorMiddleware( modelmodel_in, max_tools1, always_include[get_news], ), ], )已为您查询到以下信息**☀️ 北京今日天气**- 天气晴朗** 今日国内新闻概要**- 中方三艘油轮过航霍尔木兹海峡如需更详细的天气信息或其他新闻请随时告诉我