news 2026/6/10 15:45:24

LangChain 1.1 版本“中间件“特性解读与实战运用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain 1.1 版本“中间件“特性解读与实战运用

LangChain v1.1.0 于 2025 年 11 月 25 日发布,中间件(Middleware)作为create_agent的核心特性,为 Agent 开发带来了前所未有的灵活性和可扩展性。本文将深入解读中间件机制,并通过实战示例帮助你快速上手。


一、什么是中间件?

中间件(Middleware)是 LangChain v1 引入的核心抽象,它允许开发者在 Agent 执行流程的各个阶段插入自定义逻辑,实现上下文工程(Context Engineering)——在正确的时间将正确的信息传递给模型。

中间件的核心价值:

  • 动态提示词管理:根据上下文动态调整系统提示
  • 对话历史压缩:自动摘要过长的对话历史
  • 工具访问控制:根据用户权限选择性暴露工具
  • 状态管理:跨执行周期维护自定义状态
  • 安全护栏:输入输出验证、PII 脱敏、内容审核
Agent Flow
Yes
No
before_agent
Input
before_model
wrap_model_call
Model Call
after_model
Tool Call?
wrap_tool_call
Tool Exec
after_agent
Output

二、中间件钩子详解

LangChain 中间件提供6 个核心钩子,覆盖 Agent 执行的完整生命周期:

钩子执行时机典型用例
before_agentAgent 调用前加载记忆、验证输入
before_model每次 LLM 调用前更新提示词、裁剪消息
wrap_model_call包裹 LLM 调用拦截/修改请求和响应
wrap_tool_call包裹工具调用拦截/修改工具执行
after_model每次 LLM 响应后验证输出、应用护栏
after_agentAgent 完成后保存结果、清理资源

三、内置中间件一览

3.1 SummarizationMiddleware - 对话历史摘要

当对话历史接近 Token 上限时,自动使用 LLM 压缩旧消息,保留近期上下文。

fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportSummarizationMiddleware agent=create_agent(model="gpt-4o",tools=[weather_tool,calculator_tool],middleware=[SummarizationMiddleware(model="gpt-4o-mini",# 用于生成摘要的模型trigger={"tokens":4000},# 触发摘要的 Token 阈值keep={"messages":20},# 保留最近 20 条消息),],)

v1.1 增强:支持基于模型 Profile 的灵活触发点配置,实现上下文感知的摘要策略。


3.2 PIIMiddleware - PII 敏感信息处理

检测并处理个人身份信息(PII),支持脱敏(redact)、掩码(mask)、阻断(block)等策略。

fromlangchain.agents.middlewareimportPIIMiddleware agent=create_agent(model="claude-sonnet-4-5-20250929",tools=[read_email,send_email],middleware=[# 脱敏邮箱地址PIIMiddleware("email",strategy="redact",apply_to_input=True),# 使用正则检测并阻断电话号码PIIMiddleware("phone_number",detector=r"(?:\+?\d{1,3}[\s.-]?)?(?:\(?\d{2,4}\)?[\s.-]?)?\d{3,4}[\s.-]?\d{4}",strategy="block"),])

3.3 HumanInTheLoopMiddleware - 人机协作审批

对敏感工具调用暂停执行,等待人工审批。

fromlangchain.agents.middlewareimportHumanInTheLoopMiddleware agent=create_agent(model="claude-sonnet-4-5-20250929",tools=[read_email,send_email],middleware=[HumanInTheLoopMiddleware(interrupt_on={"send_email":{"description":"请审核此邮件后再发送","allowed_decisions":["approve","edit","reject"]}})])

3.4 TodoListMiddleware - 任务规划

为 Agent 提供任务规划和跟踪能力,自动注入write_todos工具和相关系统提示。

fromlangchain.agents.middlewareimportTodoListMiddleware agent=create_agent(model="gpt-4o",tools=[read_file,write_file,run_tests],middleware=[TodoListMiddleware()],)

适用场景:

  • 需要跨多个工具协调的复杂多步骤任务
  • 需要进度可见性的长时间运行操作

3.5 ModelRetryMiddleware - 模型调用重试(v1.1 新增)

自动重试失败的模型调用,支持可配置的指数退避策略,提升 Agent 可靠性。

fromlangchain.agents.middlewareimportModelRetryMiddleware agent=create_agent(model="gpt-4o",tools=[...],middleware=[ModelRetryMiddleware(max_retries=3,backoff_factor=2.0,# 指数退避因子),],)

3.6 OpenAI Content Moderation - 内容审核(v1.1 新增)

使用 OpenAI 的审核端点检测和处理不安全内容,支持检查用户输入、模型输出和工具结果。

fromlangchain.agents.middlewareimportOpenAIModerationMiddleware agent=create_agent(model="openai:gpt-4o",tools=[search_tool,database_tool],middleware=[OpenAIModerationMiddleware(model="openai:gpt-4o",moderation_model="omni-moderation-latest",check_input=True,# 检查用户输入check_output=True,# 检查模型输出exit_behavior="end",),],)

四、自定义中间件实战

4.1 基础结构

自定义中间件需要继承AgentMiddleware类并实现所需的钩子方法:

fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportAgentMiddleware,AgentStatefromtypingimportAnyclassMyCustomMiddleware(AgentMiddleware):defbefore_model(self,state:AgentState,runtime)->dict[str,Any]|None:"""在每次模型调用前执行"""print(f"即将调用模型,当前消息数:{len(state['messages'])}")returnNone# 返回 None 表示不修改状态defafter_model(self,state:AgentState,runtime)->dict[str,Any]|None:"""在每次模型响应后执行"""print("模型调用完成")returnNone

4.2 实战案例:调用计数器中间件

实现一个跟踪模型调用次数并在超限时终止的中间件:

fromlangchain.agentsimportcreate_agentfromlangchain.messagesimportHumanMessagefromlangchain.agents.middlewareimportAgentState,AgentMiddlewarefromtyping_extensionsimportNotRequiredfromtypingimportAny# 扩展状态 SchemaclassCustomState(AgentState):model_call_count:NotRequired[int]user_id:NotRequired[str]classCallCounterMiddleware(AgentMiddleware[CustomState]):"""调用计数器中间件:限制模型调用次数"""state_schema=CustomStatedef__init__(self,max_calls:int=10):self.max_calls=max_callsdefbefore_model(self,state:CustomState,runtime)->dict[str,Any]|None:count=state.get("model_call_count",0)ifcount>=self.max_calls:print(f"已达到最大调用次数{self.max_calls},终止执行")return{"jump_to":"end"}# 跳转到结束节点returnNonedefafter_model(self,state:CustomState,runtime)->dict[str,Any]|None:current_count=state.get("model_call_count",0)return{"model_call_count":current_count+1}# 使用中间件agent=create_agent(model="gpt-4o",middleware=[CallCounterMiddleware(max_calls=5)],tools=[],)# 调用时传入自定义状态result=agent.invoke({"messages":[HumanMessage("你好,请介绍一下自己")],"model_call_count":0,"user_id":"user-123",})

4.3 实战案例:基于用户等级的动态模型选择

根据用户专业等级动态切换模型和工具:

fromdataclassesimportdataclassfromtypingimportCallablefromlangchain_openaiimportChatOpenAIfromlangchain.agents.middlewareimportAgentMiddleware,ModelRequestfromlangchain.agents.middleware.typesimportModelResponse@dataclassclassUserContext:user_expertise:str="beginner"# beginner | expertclassExpertiseBasedMiddleware(AgentMiddleware):"""根据用户等级动态选择模型和工具"""defwrap_model_call(self,request:ModelRequest,handler:Callable[[ModelRequest],ModelResponse])->ModelResponse:user_level=request.runtime.context.user_expertiseifuser_level=="expert":# 专家用户:更强大的模型 + 高级工具model=ChatOpenAI(model="gpt-4o")tools=[advanced_search,data_analysis,code_execution]else:# 初学者:轻量模型 + 基础工具model=ChatOpenAI(model="gpt-4o-mini")tools=[simple_search,basic_calculator]returnhandler(request.override(model=model,tools=tools))agent=create_agent(model="gpt-4o",tools=[simple_search,advanced_search,basic_calculator,data_analysis,code_execution],middleware=[ExpertiseBasedMiddleware()],context_schema=UserContext)

五、中间件组合与执行顺序

多个中间件按照列表顺序依次执行,形成洋葱模型

agent=create_agent(model="gpt-4o",tools=[...],middleware=[PIIMiddleware("email",strategy="redact"),# 第 1 层SummarizationMiddleware(model="gpt-4o-mini"),# 第 2 层HumanInTheLoopMiddleware(interrupt_on={...}),# 第 3 层CallCounterMiddleware(max_calls=10),# 第 4 层],)

执行流程:

  1. 进入阶段:按顺序执行before_*钩子(1→2→3→4)
  2. 核心执行:模型调用 / 工具调用
  3. 退出阶段:按逆序执行after_*钩子(4→3→2→1)

六、最佳实践

  1. 从简单开始:先使用静态提示词和工具,仅在必要时添加动态特性
  2. 增量测试:每次只添加一个中间件,验证其行为
  3. 监控性能:跟踪模型调用次数、Token 使用量和延迟
  4. 善用内置中间件:优先使用SummarizationMiddlewarePIIMiddleware等成熟方案
  5. 区分瞬态与持久化
    • 瞬态(Transient)before_model中的消息裁剪仅影响当前调用
    • 持久化(Persistent)SummarizationMiddleware会永久更新状态

七、总结

LangChain 1.1 的中间件系统为 Agent 开发提供了强大的扩展能力:

特性说明
可组合性多个中间件可自由组合,各司其职
生命周期钩子6 个钩子覆盖完整执行流程
状态扩展自定义状态 Schema 支持跨调用数据传递
生产就绪内置中间件经过充分测试,可直接用于生产环境

无论是实现对话历史压缩、敏感信息脱敏、人机协作审批,还是构建复杂的动态上下文工程策略,中间件都能帮助你以优雅、可维护的方式实现目标。


参考资料

  • LangChain v1.1.0 Changelog
  • LangChain Middleware Documentation
  • Custom Middleware Guide
  • What’s new in LangChain v1
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 5:19:44

支付功能、支付平台、支持渠道如何测试?

作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 作为产品,我自己办了十几张银行卡方便测试,但QA和开…

作者头像 李华
网站建设 2026/6/10 15:35:42

腾讯游戏卡顿终极解决方案:5分钟实现游戏性能翻倍提升

还在为DNF、LOL、CF等腾讯游戏关键时刻的突然卡顿而懊恼?当你的角色在对局中即将释放大招时,画面却突然卡住,这种体验确实令人沮丧。今天,我们将为你揭秘一个高效解决方案——sguard_limit资源限制器,它能够智能管控AC…

作者头像 李华
网站建设 2026/6/9 8:18:06

Bazel构建系统终极指南:从基础到企业级实战

Bazel构建系统终极指南:从基础到企业级实战 【免费下载链接】bazel a fast, scalable, multi-language and extensible build system 项目地址: https://gitcode.com/GitHub_Trending/ba/bazel 在当今快速发展的软件开发环境中,构建系统的性能直接…

作者头像 李华
网站建设 2026/6/10 4:45:51

强化学习开发者的终极救星:Gymnasium类型提示完整指南

强化学习开发者的终极救星:Gymnasium类型提示完整指南 【免费下载链接】Gymnasium An API standard for single-agent reinforcement learning environments, with popular reference environments and related utilities (formerly Gym) 项目地址: https://gitco…

作者头像 李华
网站建设 2026/6/6 4:00:25

Fiddler抓包工具不会用?点这里手把手超详细教学!

Fiddler 是一个 HTTP 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯。 Fiddler 提供了电脑端、移动端的抓包、包括 http 协议和 https 协议都可以捕获到报文并进行分析;可以设置断点调试、截取报文进行请求替换和数据篡改&am…

作者头像 李华
网站建设 2026/6/9 19:41:32

实战指南:构建macOS跨版本兼容的图像优化应用

实战指南:构建macOS跨版本兼容的图像优化应用 【免费下载链接】ImageOptim GUI image optimizer for Mac 项目地址: https://gitcode.com/gh_mirrors/im/ImageOptim 当你开发的Mac应用需要在从macOS 10.13到最新系统的各个版本上稳定运行,面对不同…

作者头像 李华