Middleware 中间件

Middleware 是 LangChain 1.0 的核心扩展机制:在 Agent 循环的固定阶段插入逻辑,解决 0.x 时代「一用就毕业到自写循环」的问题。


为什么需要 Middleware?

Agent 生产化常见需求:

  • 对话摘要(防 context 溢出)
  • 长期记忆加载
  • 人机协同(敏感工具前暂停)
  • 子 Agent 委派
  • 动态 system prompt / 换模型
  • 限步数、限工具

Middleware 在 model 节点与 tool 节点之间 提供钩子,多个 Middleware 可组合(类似 Web 中间件洋葱模型)。


钩子类型(概念)

钩子时机典型用途
before_model模型调用前修剪/注入 messages
modify_model_request构建请求时换 model、改 temperature
wrap_model_call包裹模型调用重试、缓存、日志
after_model模型返回后HITL 中断、过滤 tool_calls

多个 Middleware:进入顺序正序,离开时逆序。


概念示例:限制步数

from langchain.agents import create_agent
from langchain.agents.middleware import AgentMiddleware  # API 以官方文档为准

class StepLimitMiddleware(AgentMiddleware):
    def __init__(self, max_steps: int = 10):
        self.max_steps = max_steps

    def before_model(self, state, runtime):
        if state.get("step_count", 0) >= self.max_steps:
            # 强制结束或注入「请总结」指令
            ...
        return state

agent = create_agent(
    "openai:gpt-4.1-mini",
    tools=[...],
    middleware=[StepLimitMiddleware(max_steps=15)],
)

具体基类名与方法签名以你安装的 langchain 版本文档为准;1.0 仍在快速迭代,请以 Agent Middleware 文档 为权威。


官方与社区 Middleware

LangChain 提供/计划提供开箱即用 Middleware,例如:

  • Human-in-the-loopafter_model 中断待审批 tool call
  • Summarization:历史压缩
  • Model fallback:主模型失败切换备用
  • PII 过滤prompt caching

社区 Middleware 列表见官方博客与 GitHub。


Middleware vs LangGraph 节点

Middleware自定义 LangGraph 节点
侵入性低,挂到 create_agent高,自建图
适用横切关注点全新控制流
组合多个 Middleware 叠加节点 + 边自由连接

复杂 Orchestrator-Worker 往往用 LangGraph;单 Agent 增强优先 Middleware。


子 Agent 与委派

Middleware 可在 after_model 检测「任务过大」,触发 子 Agent(独立 thread / 隔离 context)执行后把结果合并回主 Agent——官方 Deep Agents / 委派类 Middleware 封装此模式。


调试建议

  1. 在 LangSmith 中查看每步 Middleware 前后的 state diff
  2. 一次只加一个 Middleware,验证行为
  3. 避免在 Middleware 中做重型同步 IO(阻塞整个循环)

下一步