背景
Agent 出问题时,我以前只会改提示词。后来发现:很多行为该放在 应用层循环 里,而不是指望模型自觉。
官方现在把扩展点叫 middleware:挂在 Agent 循环前后,处理日志、重试、摘要、PII、人在环等。
最小心智模型
用户消息
→ before_model 钩子
→ 模型调用
→ after_model 钩子
→ 若有 tool_calls:执行工具 → 结果回写
→ 循环直到结束
中间件就在这些步骤前后插逻辑。
一个实用例子:工具失败重试
与其在提示词里写「失败请重试」,不如在 harness 里限制:
# 概念示意
# 1) 同一工具失败超过 N 次 → 停止自动重试
# 2) 把错误整理成结构化反馈写回 messages
# 3) 下一步让模型改参或换工具,而不是空转
真实项目里我会自己包一层工具执行,失败返回可行动错误文本,而不是抛异常打断整轮。
什么时候该用中间件
| 需求 | 更适合中间件? |
|---|---|
| 结构化日志/追踪 | 是 |
| 工具/模型重试与降级 | 是 |
| 上下文摘要压缩 | 是 |
| 敏感操作审批 | 是 |
| 业务规则高度动态 | 可能更适合 LangGraph 图节点 |
踩坑提醒
- 中间件也会有 bug:先保证日志能看见每一步
- 不要在钩子里塞太多业务:一个中间件只做一类事
- 与 checkpointer 搭配时,注意状态写回是否符合预期
结论
提示词解决「会不会做」,中间件解决「做砸了怎么办、做危险了先停」。
可靠性不能只靠模型自觉。