LangChain 1.0-Agent中间件-多模型动态选择

发布时间: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-部署/上线(开发人员必备)

下一篇: 没有了