AI Agent 常见反模式
学 AI Agent 的时候,很多人最开始关注的都是:
- 怎么让系统跑起来
- 怎么接工具
- 怎么让它多步执行
但做着做着就会发现,真正让系统难以变稳的,往往不是“不会搭”,而是:
用了很多看起来合理、实际上会把系统拖向不可控状态的错误模式。
这些错误模式,也就是 Anti-Patterns。
这篇文档的目标,是把做 Agent 时最常见的一批反模式拆清楚,帮助你更早建立判断力。
1. 什么是 Anti-Pattern
Anti-Pattern 可以理解为:
表面上像解决方案,实际上会持续制造问题的一类做法。
它和普通 bug 不一样。
bug 往往是单点错误;anti-pattern 则是一种系统性习惯:
- 一开始看起来能跑
- 短期内甚至挺省事
- 但随着复杂度上升,会不断放大成本和混乱
所以学 Agent 时,知道“什么是好的模式”很重要,知道“哪些看似方便的路不要走”同样重要。
2. 为什么 Agent 特别容易出现反模式
因为 Agent 系统天然具备几个特点:
- 行为不确定性更强
- 多变量同时变化
- 中间步骤比最终结果更重要
- 很多问题不是立即爆炸,而是慢慢积累
这会导致团队很容易采用一些“先跑通再说”的做法。
这些做法在原型期没问题,但如果不及时识别,后面会越来越难收拾。
3. 反模式一:把所有复杂任务都默认做成 Agent
这是最常见的一种。
表面思路是:
- 任务复杂
- 所以用 Agent
但真实情况往往是:
- 很多任务其实只需要固定 Workflow
- 上 Agent 只会增加不确定性和调试成本
怎么识别:
- 路径其实 80% 能提前写出来
- 中间决策很少
- 主要问题是流程而不是推理
更好的做法:
- 先用 Workflow
- 只把真正需要运行时决策的节点 Agent 化
4. 反模式二:把多步执行误当成 Agent
系统做了:
- 检索
- 调工具
- 输出答案
很多人就会说“这是个 Agent”。
但它可能只是一个多步 Workflow。
问题在于,如果定义都没分清,后面很多设计判断都会错位:
- 会过度设计 state
- 过度设计 memory
- 过度引入 planning
更好的做法:
- 先区分
Workflow和Agent - 明确“下一步是谁决定的”
5. 反模式三:一上来就多 Agent
很多人会天然觉得:
- 一个 Agent 已经不错了
- 多个 Agent 分工协作应该更强
但现实通常是:
- 协调复杂度先上来了
- 状态同步更难了
- 责任边界更模糊了
- 问题更难排查了
更好的做法:
- 先把单 Agent 做稳
- 明确单 Agent 的瓶颈在哪
- 只有当分工收益真的明显时,再考虑多 Agent
6. 反模式四:没有状态管理,只靠历史消息硬撑
很多初版系统会把“多轮对话历史”直接当成状态管理。
短期看起来没问题,长期就会出现:
- 失忆
- 重复动作
- 状态污染
- 重点信息淹没
更好的做法:
- 显式维护
State - 区分历史消息、当前状态、长期记忆
7. 反模式五:什么都记成 Memory
一旦开始学 Memory,很多系统就会进入“尽量多记”的倾向。
但结果往往是:
- 临时偏好变长期规则
- 错误信息被写成事实
- 历史信息不断污染当前任务
更好的做法:
- 先把
State管清楚 - 只有稳定、可复用的信息才进入
Memory - 给 memory 写入设置明确规则
8. 反模式六:所有问题都靠改 Prompt
这是 Agent 项目里非常高频的误判。
一看到系统表现不好,就立即:
- 改 prompt
- 加规则
- 再塞更多说明
但很多问题根本不是 prompt 问题,而是:
- 工具 schema 差
- 状态设计不清
- 编排逻辑有问题
- 停止条件不明确
更好的做法:
先分层判断问题属于哪一层:
- Prompt
- Tool
- State
- Orchestration
- Evaluation
9. 反模式七:不做评估,只凭感觉优化
很多系统迭代方式是:
- 改一版
- 问几个问题
- 觉得还不错
- 就继续往前走
这会直接导致:
- 不知道哪次优化真的有效
- 看不到局部提升以外的退化
- 无法积累回归能力
更好的做法:
- 建立最小任务集
- 保留失败案例
- 做版本对比
10. 反模式八:只看最终答案,不看轨迹
对普通问答来说,很多时候看结果就够了。
但对 Agent 来说,很多核心问题都藏在过程里:
- 为什么选了这个工具
- 为什么多跑了 4 步
- 为什么明明拿到证据却没用上
更好的做法:
- 记录 step trace
- 记录工具调用
- 记录状态变化
- 记录停止原因
11. 反模式九:没有明确停止条件
如果系统没有:
- 最大步数
- 重试上限
- 完成条件
那它就很容易:
- 无意义循环
- 多次重复同类操作
- 成本飙升
更好的做法:
- 设置最大步数
- 设置重试限制
- 定义任务完成标准