1. Middleware 的设计思想
Middleware 是 LangChain v1.x 引入的一等公民概念,暴露了一组钩子(Hooks),允许开发者在每个执行步骤前后插入自定义逻辑。Middleware 是可组合的,多个中间件可以按需叠加,互不干扰。
2. 两类钩子机制
- 节点级钩子(Node-Style Hooks):按顺序在特定生命周期点触发,不直接改变执行流程(除非显式跳转或抛出异常)。包括 before_agent(智能体启动前,仅触发一次)、before_model(每次模型调用前)、after_model(每次模型返回后)、after_agent(智能体结束后,仅触发一次)
- 包装级钩子(Wrap-Style Hooks):包裹目标函数,拥有是否调用、调用次数和是否绕过的完全控制权。包括 wrap_model_call(包裹模型调用)和 wrap_tool_call(包裹工具调用),是实现重试、缓存、限流的核心位置
3. 内置中间件场景
LangChain 内置了多款常用中间件:
- PII 脱敏中间件:在 before_model 和 after_model 钩子中自动检测并掩码/哈希个人信息,支持 HIPAA 合规需求
- 摘要中间件(SummarizationMiddleware):在 before_model 钩子中监控 Token 使用量,当消息历史超过阈值时自动摘要压缩,防止上下文溢出
- LLM 工具选择中间件(LLMToolSelectorMiddleware):在 wrap_model_call 钩子中使用轻量 LLM 预先筛选相关工具子集,减少上下文膨胀
- 重试中间件:在 wrap_model_call 中实现指数退避重试逻辑,自动处理网络抖动和临时故障
- 人工审批中间件:在 after_model 钩子中实现 human-in-the-loop,在模型输出发送给客户端前先经过人工确认
4. 自定义中间件
开发者可以通过继承 AgentMiddleware 类或使用装饰器(@before_model、@after_model、@wrap_model_call 等)编写自定义中间件。中间件可以读取和修改 Agent State,实现状态统计、日志记录、指标上报、动态配置注入等功能。