背景

Agent 出问题时,我以前只会改提示词。后来发现:很多行为该放在 应用层循环 里,而不是指望模型自觉。

官方现在把扩展点叫 middleware:挂在 Agent 循环前后,处理日志、重试、摘要、PII、人在环等。

最小心智模型

用户消息
  → before_model 钩子
  → 模型调用
  → after_model 钩子
  → 若有 tool_calls:执行工具 → 结果回写
  → 循环直到结束

中间件就在这些步骤前后插逻辑。

一个实用例子:工具失败重试

与其在提示词里写「失败请重试」,不如在 harness 里限制:

# 概念示意
# 1) 同一工具失败超过 N 次 → 停止自动重试
# 2) 把错误整理成结构化反馈写回 messages
# 3) 下一步让模型改参或换工具,而不是空转

真实项目里我会自己包一层工具执行,失败返回可行动错误文本,而不是抛异常打断整轮。

什么时候该用中间件

需求更适合中间件?
结构化日志/追踪是
工具/模型重试与降级是
上下文摘要压缩是
敏感操作审批是
业务规则高度动态可能更适合 LangGraph 图节点

踩坑提醒

  1. 中间件也会有 bug:先保证日志能看见每一步
  2. 不要在钩子里塞太多业务:一个中间件只做一类事
  3. 与 checkpointer 搭配时,注意状态写回是否符合预期

结论

提示词解决「会不会做」,中间件解决「做砸了怎么办、做危险了先停」。
可靠性不能只靠模型自觉。