发布时间:2026-02-27 22:34:03编辑:123阅读(44)
LangChain 1.0 中间件核心功能介绍
中间件Middleware是LangChain 1.0更新中上线的一个重大功能,根据官网的说明,借助中间件,开发者可以高度定制和控制Agent运行的每一个环节。
通过在Agent实际运行过程中设置一些钩子,来更改原始程序运行的行为。
LangChain 1.0的中间件能实现如下功能
| 功能类别 | 功能说明 | 常用钩子 |
| 监控/日志/指标 | 跟踪Agent的行为、模型调用次数、token使用量、工具调用频率等。 | before_model、 after_model、 wrap_model_call |
| 修改输入/上下文工程 | 在模型调用前修改消息历史、添补系统提示、裁剪上下文、替换模型参数等。 | before_model、 modify_model_request |
| 动态模型/工具路由 | 根据当前状态决定使用哪个模型、启用哪些工具,动态调整调用策略。 | modify_model_request、 wrap_model_call |
| 控制流程/限流/重试/降级 | 对模型或工具调用加上重试机制、超时、降级方案、跳转结束、提前中断。 | wrap_model_call、 before_model |
| 合规/审核 | 在调用工具前或后插入人工审核、敏感内容检查、Pll检测、安全过滤。 | after_model、 wrap_tool_call |
| 摘要/上下文裁剪 | 当对话变长或token靠近限制时,自动摘要历史、压缩上下文以维持性能。 | before_model |
| 工具选择与调用管理 | 在模型调度工具前决定哪些工具可用、它们是否被选中、限制调用频率。 | modify_model_request、 wrap_tool_call |
| 结构化输出/响应格式控制 | 在请求模型之前或之后规范输出格式、校验结构化数据。 | modify_model_request、 after_model |
| 状态扩展 | 自定义Aaent的状态schema(如调用次数、用户偏好、认证状态),中间件可以读写这些状态。 | before_model、 after_model |
钩子是框架或系统在某些关键执行点暴露的扩展接口。开发者可以“挂上”自己的逻辑,在那些点上插入、修改或替换行为,而无需改变主流程代码。就像在流水线上某个环节设置了一个“检查点”或“插入器”。
在LangChain的Agent执行循环中,比如“调用模型前”,“模型调用后”,“工具调用前后”都是可能挂钩子的点。
总的来说,Middlewaer"模型相关"钩子归纳为三种:before_model、modify_model_request、after_model(可三选其一或组合实现)。它们对应 "模型调用前——— 请求修改 ——— 模型返回后" 的三个阶段。
典型用途如下:
before_model:总结/裁剪历史、注入系统指令、敏感信息脱敏、状态校验、条件分支跳转。
modify_model_request:对即将发送的请求做精准改写(模型名、参数、工具列表、message等)。
after_model:做人审(HITL)、输出校验/重写、添加安全标签或生成可观测数据。
wrap_model_call:在一次模型调用外层加壳,可动态换模型/改温度/改tools,也可做A/B、回退策略。1.0版本把“动态模型选择”正式迁入这里。
wrap_tool_call:统一处理工具调用的超时、重试、白/黑名单、错误上报,或在人审批准前阻断高风险工具(写文件、SQL、HTTP)。
并且在LangChain 1.0中,还允许开发者自定义中间件,从而实现更加灵活的Agent行为管理。
基于ollama本地部署多个模型(1.对话模型qwen3:8b 2.视觉模型qwen3-vl:8b),实现根据用户输入的内容动态切换不同的模型回答问题.
多模型动态切换(1.对话chat模型 2.VL视觉模型)
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call
from langchain_core.tools import tool
import base64
import time
import requests
from lxml import etree
import warnings
warnings.filterwarnings("ignore",category=DeprecationWarning)
# 定义两种模型 1.对话模型 2.视觉模型
# 对话模型qwen3:8b
from langchain_ollama import ChatOllama
chat_model = ChatOllama(
model="qwen3:8b",
temperature=0.2,
top_p=0.95,
)
# 视觉模型qwen3-vl:8b
vl_model = ChatOllama(
model="qwen3-vl:8b",
temperature=0.2,
top_p=0.95,
)
# 示例工具
@tool
def get_weather(city):
"""
查询即时天气函数
:param city: 必要参数,字符串类型。用于表示查询天气的具体城市名称
:return: 返回即时天气的结果,dict类型
"""
today_time = time.strftime("%Y-%m-%d",time.localtime())
url = f'https://www.ks121.com/history/?location={city}&startdate={today_time}&enddate={today_time}'
headers = {
"sec-ch-ua": '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/144.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=headers, timeout=10)
html = etree.HTML(response.text)
res = html.xpath("//div[@class='box']/div[2]/div[1]/div/table/tbody/tr")
ret = {}
for i in res:
one = i.xpath("./td[1]/p[2]/text()")[0]
two = i.xpath("./td[2]/p[2]/span/text()")[0]
three = i.xpath("./td[3]/p/text()")[0]
four = i.xpath("./td[4]/p/text()")[0]
ret.setdefault('日期', one)
ret.setdefault('气象', two)
ret.setdefault('温度', three)
ret.setdefault('风级', four)
print(f"工具调用:{today_time}:{city}天气信息:{ret}")
return ret
# 视觉检测函数
def is_vision_input(messages) -> bool:
for msg in messages:
content = msg.content
if isinstance(content, list):
for item in content:
if isinstance(item, dict) and item.get("type") == "image_url":
return True
return False
@wrap_model_call
def dynamic_model_router(request, handler):
messages = request.messages
if is_vision_input(messages):
print("👉 切换到 VL 视觉模型")
request.model=vl_model
else:
print("👉 使用对话 Chat 模型")
request.model=chat_model
return handler(request)
# 5. 创建 Agent
agent = create_agent(
# 默认使用chat模型
model=chat_model,
tools=[get_weather],
middleware=[dynamic_model_router],
)
# 6. 测试文本
response = agent.invoke({"messages": [{"role": "user", "content": "上海今天的天气,并且介绍下上海"}]})
print(response["messages"][-1].content)
image_path = r"D:\spider_agent\111.png"
with open(image_path, "rb") as image_file:
base64_image = base64.b64encode(image_file.read()).decode("utf-8")
_messages = {
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "详细描述下图片"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}
}
]
}
]
}
result = agent.invoke(_messages)
print(result["messages"][-1].content)运行结果:
工具调用:2026-02-27:上海天气信息:{'日期': '2026-02-27', '气象': '雾转多云', '温度': '7℃\n~ 12℃', '风级': '东北风<3级'}
👉 使用对话 Chat 模型
上海今天天气为雾转多云,气温7℃至12℃,东北风<3级。
关于上海的简介:
上海是中国东部沿海的经济、金融、贸易、航运中心,也是国际大都市。著名地标包括东方明珠塔、外滩、豫园、迪士尼乐园
等。作为中国最具国际化气息的城市之一,上海拥有发达的交通网络、丰富的文化资源和现代化的都市景观。
👉 切换到 VL 视觉模型
图片中是一位女性的肖像照。她留着深棕色的自然卷发,发丝略显蓬松,部分发丝垂落在脸颊两侧。面部妆容精致,眼妆突出,
唇色为自然的粉红色。她身穿一件白色蕾丝边V领上衣,领口处有精致的镂空蕾丝设计,衣料轻盈柔软。颈部佩戴多层黑色串珠
项链,其中最外层项链中央悬挂着一枚带有复杂花纹的圆形吊坠,吊坠下方还垂有黑色小珠饰,整体造型层次丰富且富有设计感。
背景为深色调的纹理墙面,呈现出类似旧墙纸或艺术涂料的斑驳质感,色调以深棕、灰蓝为主,营造出复古而沉静的氛围。画面
右下角有“CSDN @盛溪的猫猫”的水印标识。整体画面风格偏向写实摄影,光线柔和,突出人物的自然美感与服饰细节。
上一篇: LangChain1.0-Agent-部署/上线(开发人员必备)
下一篇: 没有了
52161
52064
42245
39089
33607
30565
29226
24221
24116
22459
44°
266°
300°
306°
279°
320°
290°
323°
327°
335°