上一篇讲了 create_agent——一行代码搭出标准 Agent。但标准 Agent 只有「调工具回答」这一个核心能力。真实 Agent 还要:记住上文、压缩超长上下文、加护栏防止越界……这些能力往哪加?
这就是 Middleware 要解决的。它是 v1.0 最重要的设计,这一篇讲它的概念。
问题:核心 loop 是固定的
create_agent 把核心 loop 封装好了:模型 → 判断 → 工具 → 循环。这个 loop 是固定的,你没法随便往里塞东西。
但 Agent 真实需要的能力,很多都该「插在 loop 的某个位置」:
- 记忆管理:每次调模型前,要把历史消息注入进去
- 上下文压缩:消息太多时,调用前先压缩
- 护栏:模型输出后,检查有没有违规
- 日志/追踪:每一步前后都要记录
如果核心 loop 固定,要加这些怎么办?传统做法是继承重写——但那意味着你要 fork 整个 loop 的实现,框架一升级你就得跟着改。
Middleware:横切注入,不动 loop
Middleware 的思路完全不同:核心 loop 保持不动,你通过「钩子」在 loop 的固定位置插入自己的逻辑。
就像 Web 框架的中间件(Express、Koa、Django):核心请求处理循环不变,你加日志中间件、鉴权中间件、限流中间件,各管各的,叠加生效。
LangChain 的 middleware 能 hook 的位置(下一篇 20 详讲)主要有:
- 模型调用前(beforeModel):注入历史、压缩上下文
- 模型调用后(afterModel):检查输出、做护栏
- 工具执行前后:校验、日志
为什么这个设计重要
Middleware 之所以是 v1.0 的灵魂,因为它解决了三个老大难:
1. 可组合。多个 middleware 能叠加,互不干扰。一个 Agent 可以同时有「记忆 middleware + 压缩 middleware + 护栏 middleware」,像叠积木。
2. 可复用。一个 middleware 写一次,能跨多个 Agent 用。写好一个「上下文压缩 middleware」,所有 Agent 都能用。
3. 不动核心 loop。你加 middleware 不用碰 create_agent 的核心实现,框架升级不会破坏你的定制。
这三点合起来,意味着定制 Agent 从「重写」变成了「配置」——这是工程上巨大的进步。
一个心智模型
理解 middleware,记住这个心智模型:
核心 loop 是一条流水线,middleware 是流水线旁边的工位。产品(每次模型调用/工具调用)经过流水线时,经过这些工位,每个工位干自己的事(加料、检查、记录),但不改变流水线本身的走向。
产品还是按流水线的方向走(这是核心 loop),但每个工位(middleware)能在产品经过时做点处理。这个模型让你直观理解 middleware 为什么「能定制却不改 loop」。
和 LangGraph 的关系
一个自然的疑问:middleware 和 LangGraph 是什么关系?
记住:create_agent 底层是 LangGraph,middleware 是 create_agent 这一层提供的扩展机制。所以:
- 用
create_agent时,用 middleware 定制(高层) - 自己用 LangGraph 手搭时,直接在图里写 node/edge(底层,更灵活但要自己搭)
middleware 是「在封装好的标准品上加能力」的捷径。如果你完全自己搭 LangGraph,就不需要 middleware——你直接在图里加节点就行。middleware 的价值,是让用 create_agent 的人也能定制,而不必下沉到手搭。
收束:从重写到配置
这一篇讲了 Middleware 的概念:
- 它解决「核心 loop 固定,怎么加能力」的问题
- 思路:不动 loop,通过钩子横切注入(像 Web 中间件)
- 三个价值:可组合、可复用、不动核心 loop
- 心智模型:流水线旁边的工位
- 它是
create_agent层的扩展机制,手搭 LangGraph 不需要
下一篇讲 middleware 具体能 hook 在哪些位置——beforeModel / afterModel,以及每个位置适合做什么。
关于十三Tech
我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。
如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

