langchain1.0中各种类型的Middleware详解
langchain middleware
Langchain1.0
引入的中间件(Middleware)机制,是构建生产级 AI Agent 的核心支柱;
你可以把它理解为 Agent 的"可插拔功能插件",它让你能在 Agent 执行的关键环节(调用模型前、调用工具后等)插入自定义逻辑,从而实现对上下文、安全、成本和行为的精细化控制;
核心价值:它将过去需要大量手写代码才能实现的复杂功能(如记忆管理、人工审批、成本限制等),标准化、模块化为一组可自由组合的"乐高积木"
中间件的"钩子":如何介入 Agent 的生命周期
中间件通过在 Agent 执行流程的不同阶段暴露"钩子"(Hooks)来发挥作用。理解这些钩子,你就掌握了定制 Agent 的钥匙;
内置中间件"全家桶"
LangChain 提供了丰富的预置中间件,覆盖了从上下文管理到安全控制的方方面面。
上下文与记忆管理
SummarizationMiddleware
自动摘要。当对话超过设定的 Token 或消息数量阈值时,自动调用一个更便宜的模型将历史对话压缩成摘要,防止因上下文过长导致超限或成本失控
ContextEditingMiddleware
上下文编辑。允许你按规则编程式地修改、删除或修剪对话中的特定消息,例如自动移除过时的工具调用结果,只保留关键信息
安全与合规
PIIMiddleware
隐私保护。在信息发送给模型之前,自动检测并处理个人敏感信息(如邮箱、电话、身份证号),可按"修订"、“屏蔽”、"哈希"等策略进行处理,满足合规要求
HumanInTheLoopMiddleware
(HITL):人工审核。当 Agent 准备执行你指定的高风险工具(如send_email, delete_record)时,会强制暂停执行,等待人工的"批准"、"修改"或"拒绝"指令后才能继续。注意:此中间件需要配合 checkpointer 使用以保存暂停时的状态
控制与可靠性
ToolCallLimitMiddleware / ModelCallLimitMiddleware
调用限制。为 Agent 的执行设置预算,你可以限制单次对话或单次请求中模型或工具的调用次数,有效防止无限循环和成本失控
ModelFallbackMiddleware
故障转移。当主模型(如 GPT-4)因限流、超时等原因失败时,自动切换到一个备用模型(如 GPT-3.5)继续工作,极大地提升了生产环境的鲁棒性
ToolRetryMiddleware
自动重试。当工具调用(如访问外部 API)因网络抖动等临时问题失败时,自动按照指数退避策略进行重试,提高任务成功率
任务规划与测试
TodoListMiddleware
任务规划。为 Agent 装备一个内置的待办事项列表。Agent 会自动将复杂任务拆解成步骤并动态更新列表,帮助它理清思路、避免遗漏,在处理多步任务时效果显著
LLMToolEmulator
工具模拟。在开发和测试阶段,用一个 LLM 来模拟真实工具的行为。这允许你在不调用真实外部服务(如数据库、支付接口)的情况下,对 Agent 的流程进行低成本验证
两种创建自定义中间件的方式
当内置中间件无法满足需求时,你可以轻松创建自定义中间件。
方式一:装饰器模式(轻量、快速)
对于单一、简单的功能,推荐使用装饰器。下面的例子创建了一个在每次调用模型前打印日志的中间件
from langchain.agents import create_agent
from langchain.agents.middleware import before_model, AgentState
from langgraph.runtime import Runtime
# 使用 @before_model 装饰器定义一个钩子函数
@before_model
def log_before_model(state: AgentState, runtime: Runtime):
print(f"即将调用模型,当前消息数: {len(state['messages'])}")
# 返回 None 表示不中断流程,让请求继续传递
# 在创建 Agent 时,将中间件函数加入列表即可
agent = create_agent(
model="gpt-4o-mini",
middleware=[log_before_model]
)
方式二:类模式(复杂、可配置)
对于需要配置或复用多个钩子的复杂中间件,推荐继承 AgentMiddleware 类。下面的例子展示了如何实现一个根据用户级别动态切换模型和工具的中间件
from langchain.agents.middleware import AgentMiddleware
from langchain.agents.middleware.types import ModelRequest, ModelResponse
from typing import Callable
class ExpertiseBasedToolMiddleware(AgentMiddleware):
def wrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], ModelResponse]
) -> ModelResponse:
# 从上下文中读取用户级别
user_level = request.runtime.context.get("user_expertise", "beginner")
if user_level == "expert":
# 为专家用户切换更强大的模型和工具
new_request = request.override(
model="gpt-5",
tools=[advanced_search, data_analysis]
)
else:
# 为新手用户使用更经济的配置
new_request = request.override(
model="gpt-5-nano",
tools=[simple_search, basic_calculator]
)
# 将修改后的请求传递给下一个处理器
return handler(new_request)
使用中间件的实用建议
从最小的核心开始
先用 create_agent 跑通一个最简单的工作流,再根据需要逐步添加中间件
组合有序
中间件按列表顺序依次执行,不同顺序可能导致不同结果。通常将通用功能(如日志、PII过滤)放在前面,特定功能(如工具选择)放在后面
善用内置
大多数通用需求(摘要、限流、HITL)都有对应的内置中间件,优先使用它们可以避免重复造轮子
更多推荐



所有评论(0)