标准回答
先定性:为什么会循环
死循环的根源通常是 Agent 失去了"前进的判据"。常见四类:一是目标或子目标不清,模型不知道做到什么程度算完成,于是反复尝试;二是工具结果无进展,比如同样的查询返回同样的空结果,模型却不断重试;三是缺终止判断,没有"是否已足够"的显式检查,模型默认继续行动;四是反思失效,自我批评环节产生矛盾建议,让 Agent 在两个方案间来回横跳。
再排查:靠 trace 还原现场
不要凭猜测。打开完整执行 trace(每一步的 thought、tool call、tool result),按时间线看是否存在重复的"动作-观察"对:同一工具同一参数被多次调用、或 A 工具与 B 工具交替触发却无状态推进。用可观测性平台(如 LangSmith)或结构化日志做动作指纹(工具名+归一化参数的哈希),统计重复次数,就能快速锁定循环点与触发条件。
再止血:硬上限兜底
给 Agent 加最大迭代步数和单工具调用次数上限,这是任何生产 Agent 的必备护栏。一旦超限,立刻停止并降级:返回已有的部分结果、向用户澄清,或转人工。硬上限保证最坏情况下成本与延迟有界,绝不会无限烧 token。
再治本:软机制让它会"停"
在上限之上叠加更聪明的控制:重复检测——发现连续重复动作就提前终止或强制换策略;显式终止判断——每步让模型先回答"现有信息是否已足够给出最终答案",足够就直接收尾;进度评估/反思——周期性让模型总结"距离目标还差什么、上一步是否带来新信息",无进展就改道而非重试;降低温度——把决策温度调低,减少在等价选项间的随机摇摆。多管齐下,既能止血又能治本。
常见误区
⚠️ 常见踩坑
只加最大步数上限就以为万事大吉——上限只能止血,无法解决"为什么循环",用户仍会拿到一个跑满步数却没结果的失败响应。也别走另一极端,完全寄希望于模型自我反思而不设硬上限:反思本身可能失效甚至加剧抖动。正确姿势是硬上限兜底 + 重复检测 + 显式终止判断 + 进度评估,并务必先看 trace 定位根因,而不是盲目调 prompt。
追问
追问 1:怎么在代码层面检测"重复调用同一工具"?
对每次工具调用生成指纹:工具名 + 归一化后的参数(去空格、统一大小写、排序键、对长文本取哈希)。维护一个最近 N 步的指纹窗口,若同一指纹出现次数超过阈值(如 3 次),或最近 K 步在两三个指纹间循环,就判定为循环,触发提前终止或强制切换策略。可进一步比较工具返回值是否也相同——参数和结果都重复才更确定是无进展循环,避免误杀合法的分页/重试。
追问 2:反思(self-reflection)机制本身导致来回纠结怎么办?
反思越改越乱通常是因为缺少收敛约束。可以限制反思轮数(如最多反思 2 次后必须给出最终决定);让反思输出结构化的"保留/修改/放弃"决策而非自由发挥;引入外部校验器或测试结果作为客观判据,而不是让模型自说自话;并记录每轮反思前后的方案,若在两方案间振荡就锁定其一。本质是给反思加"刹车"和外部锚点,防止自我对话发散。
追问 3:上限触发后,怎样给用户一个体面的降级响应而不是直接报错?
超限时不要抛裸异常。先让模型基于已收集的中间结果生成一个"尽力而为"的部分回答,并明确告知哪些信息未能获取、卡在了哪一步;若任务高风险或部分结果不可用,则转为向用户澄清需求或转人工兜底。同时把这次超限事件连同 trace 落日志,便于离线分析是哪类查询易触发循环,反哺 prompt 与工具改进。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习