我的 Agent 跑了一晚上,早上起来发现它还在搜索,已经调用了200次 API。
这不是 bug,这是我没写停止条件。
给 Agent 写提示词和给 GPT 写提示词,最大的区别不是工具调用,而是停止条件。GPT 是一次性输出,Agent 是持续运行。如果你不告诉它什么时候停,它就会一直跑下去——直到 API 额度耗尽,或者你手动 kill 掉。
真实失败案例
任务: 让 Agent 找到3个支持”AI 正在改变教育”的数据。
我的提示词(第一版):
> 任务目标:找到3个可验证的数据,支持”AI 正在改变教育”这个观点。
>
> 要求:
> – 每个数据有明确来源
> – 数据时间在2023年之后
> – 数据之间有逻辑关联
结果: Agent 搜索了50次,找到了20个数据,但一直在继续搜索,因为它觉得”还可以找到更好的”。
问题: 我只定义了成功标准(3个数据),但没定义停止条件(找到3个后立刻停止)。
停止条件的三种类型
类型1:任务完成(Success Stop)
定义: 达到目标后立刻停止,不要继续优化。
Before(没有停止条件):
> 任务目标:找到3个数据。
After(有停止条件):
> 任务目标:找到3个数据。
> 停止条件:找到3个符合标准的数据后,立刻停止搜索,不要继续寻找”更好的”数据。
关键词: “立刻停止””不要继续”
类型2:证据充分(Evidence Stop)
定义: 当证据足够支撑结论时停止,不要追求完美。
Before(没有停止条件):
> 任务目标:分析这个方案的可行性。
After(有停止条件):
> 任务目标:分析这个方案的可行性。
> 停止条件:当你有足够证据判断”可行”或”不可行”时停止,不需要穷尽所有可能性。
关键词: “足够证据””不需要穷尽”
类型3:错误处理(Error Stop)
定义: 遇到无法解决的问题时停止,报告当前进展。
Before(没有停止条件):
> 任务目标:找到这个问题的解决方案。
After(有停止条件):
> 任务目标:找到这个问题的解决方案。
> 停止条件:
> – 如果尝试5次仍未找到可行方案,停止并报告当前进展
> – 如果遇到无法访问的资源,跳过并继续
> – 如果发现问题本身无解,立刻停止并说明原因
关键词: “尝试N次后停止””无法解决时停止”
Before/After 对比
案例1:数据搜索任务
Before(只有目标,没有停止条件):
> 任务目标:找到3个支持”远程工作提高生产力”的研究数据。
>
> 要求:
> – 数据来自权威机构
> – 时间在2022年之后
问题: Agent 会一直搜索,试图找到”最权威”的数据。
After(有明确停止条件):
> 任务目标:找到3个支持”远程工作提高生产力”的研究数据。
>
> 成功标准:
> – 数据来自权威机构(学术期刊、知名咨询公司、政府报告)
> – 时间在2022年之后
>
> 停止条件:
> – 找到3个符合标准的数据后,立刻停止
> – 如果搜索10次仍未找到3个,报告当前找到的数据并说明原因
> – 如果发现”远程工作降低生产力”的反向证据,也记录下来
改进: 明确了什么时候停(找到3个),什么时候放弃(搜索10次),以及如何处理意外情况(反向证据)。
案例2:代码审查任务
Before(只有目标,没有停止条件):
> 任务目标:审查这段代码,找出所有潜在问题。
问题: “所有潜在问题”是无限的,Agent 会一直找下去。
After(有明确停止条件):
> 任务目标:审查这段代码,找出关键问题。
>
> 优先级:
> – P0:安全漏洞、数据泄露风险
> – P1:性能瓶颈、逻辑错误
> – P2:代码风格、可读性问题
>
> 停止条件:
> – 找到所有 P0 和 P1 问题后停止
> – P2 问题只报告明显的,不要深挖
> – 如果代码超过1000行,只审查核心逻辑部分
改进: 用优先级代替”所有”,明确了审查深度。
案例3:方案对比任务
Before(只有目标,没有停止条件):
> 任务目标:对比三个云服务商(AWS、Azure、GCP),给出推荐。
问题: 对比维度是无限的,Agent 会一直对比下去。
After(有明确停止条件):
> 任务目标:对比三个云服务商(AWS、Azure、GCP),给出推荐。
>
> 对比维度:
> – 价格(必须)
> – 性能(必须)
> – 易用性(必须)
> – 生态(可选)
>
> 停止条件:
> – 完成三个必须维度的对比后,给出推荐
> – 如果某个维度数据不全,说明并继续
> – 不要深挖可选维度,除非前三个维度无法决策
改进: 区分了必须和可选,避免无限扩展对比范围。
五个场景的停止条件写法
场景1:搜索任务
> 停止条件:
> – 找到N个结果后立刻停止
> – 搜索M次仍未找到,报告当前进展
> – 遇到付费墙或无法访问的资源,跳过
场景2:分析任务
> 停止条件:
> – 当你有足够证据支撑结论时停止
> – 不要追求100%确定性,80%置信度即可
> – 如果数据互相矛盾,报告矛盾并停止
场景3:生成任务
> 停止条件:
> – 生成一个符合标准的版本后停止
> – 不要生成多个版本让我选
> – 如果第一次生成不符合标准,最多重试2次
场景4:调试任务
> 停止条件:
> – 找到根本原因后停止,不要继续找其他可能原因
> – 如果尝试5种方法仍未解决,报告当前进展
> – 如果问题超出你的能力范围,立刻说明
场景5:优化任务
> 停止条件:
> – 达到目标性能后停止(如响应时间<100ms)
> – 不要追求极致优化,够用就行
> – 如果优化带来新问题,回退并报告
自检清单
写完 Agent 提示词后,问自己:
– [ ] 我写了”什么时候停止”吗?
– [ ] 我定义了”失败后怎么办”吗?
– [ ] 我区分了”必须”和”可选”吗?
– [ ] 我的停止条件是可验证的吗?(不是”做得差不多了”,而是”找到3个”)
– [ ] 我考虑了意外情况吗?(资源不可达、数据矛盾、超出能力范围)
如果有任何一个答案是”没有”,你的 Agent 可能会跑飞。
停止条件不是可选项,而是 Agent 提示词的核心。没有停止条件的 Agent,就像没有刹车的车——你永远不知道它会跑到哪里。



