智能体重复调用工具无结果:循环检测与退出机制设计
某企业的采购智能体接到任务查询三家供应商的报价并生成比价单。智能体调用了供应商查询接口输入轴承返回了两条记录。接口返回有效——HTTP状态码200、数据非空——但任务结果不充分比价单需要供应商名称、产品型号、单价、交货期和有效期五个字段而返回数据缺少价格字段。智能体认为结果不够完整把关键词换成滚动轴承再查返回了一条新记录但同样缺少价格。接着又换成轴承SKF查返回三条记录其中两条与之前重复。十五分钟内智能体连续调用十七次供应商查询接口每次都拿到部分数据每次都觉得还差一点直到会话超时被系统强制终止。整个过程没有报错日志里全是HTTP 200响应但比价单始终没有生成。运维人员排查时发现智能体的调用链看起来每一步都合理——它在尝试不同关键词在补充缺失字段在扩大检索范围。问题在于没有任何环节告诉它你已经查得够多了或者你查到的数据已经足够生成一份标注了缺失项的比价单。接口每次都返回有效数据系统无从区分正常查询和已经陷入循环。很多团队遇到这类问题的直觉反应是模型不够聪明于是切换到参数量更大的模型。但换模型后循环依然存在因为这不是模型推理能力的问题而是编排层缺少对工具调用行为的约束机制。模型再强大如果不知道什么算够了就会一直尝试下去。也有团队尝试在Prompt里写不要重复调用同一工具但这类指令的执行依赖模型自身判断在结果确实不完整时模型会认为这不是重复调用而是补充查询指令几乎没有约束力。问题可以从三个层面拆解。一类是结果充分性定义缺失。这里需要区分两个概念工具返回有效性指的是接口是否正常返回了数据任务结果充分性指的是返回的数据是否足以完成当前任务。编排层目前只检查有效性不检查充分性。以三家供应商比价为例充分的结果应该包含三家供应商各自的名称、型号、单价、交货期和有效期合计十五个字段。智能体首次调用返回了两条记录的名称和型号——返回有效但距离任务完成还差十一个字段。编排层没有定义一次充分的供应商查询应该返回哪些字段、多少条记录只要接口返回了非空结果就认为调用成功把判断够不够的责任完全推给了模型。模型面对不完整的数据自然会倾向于再查一次而不是基于已有信息做降级处理。另一类是循环检测维度单一。目前的检测只按工具维度做连续调用计数——同一个工具被连续调用几次超过阈值就熔断。这漏掉了三种情况。一是参数振荡同一工具用不同关键词反复调用关键词变化但返回结果高度相似。二是A—B—A工具回路智能体先调工具A再调工具B又回到工具A参数与首次几乎相同。这种交替调用在单一工具计数器看来每次都是新一轮因为中间插入了其他工具连续计数被清零。三是信息增量缺失每次调用返回的数据与之前已有的数据完全重叠没有新增任何字段或记录但系统没有机制检测这一点。还有一类是退出路径缺失。当工具返回的结果确实不完整时智能体没有定义好的降级路径。它不知道在查了多次仍然缺少价格字段的情况下应该用已有数据生成比价单并标注价格待补充还是应该转入人工处理。没有退出条件没有降级策略智能体只能在再试一次和放弃任务之间二选一而缺少明确退出条件时模型往往倾向于继续寻找解决路径。针对智能体因结果不完整而重复调用工具的问题青山不语AI工作室采用工具调用循环检测与结果充分性判断框架通过任务完成条件、调用指纹、信息增量、任务级预算和退出路径共同约束工具调用行为。起始环节是结果充分性定义。每个工具在注册时需要声明两类信息必需字段列表和最小有效结果数。以供应商查询工具为例必需字段包括供应商名称和产品型号最小有效结果数为一。调用返回后编排层检查返回数据是否包含所有必需字段且达到最小结果数。如果满足标记为充分直接进入下一步如果不满足标记为部分有效记录缺失的字段和差距。这层校验由编排层执行而非模型判断避免模型对够不够的评估因上下文不同而漂移。需要强调的是工具返回有效不等于任务结果充分接口返回了一条名称和型号工具层面是有效的但比价任务需要的十五个字段还差十一个任务层面是不充分的。第二个环节是循环检测。这个环节有三个维度。起始维度是任务级总调用预算编排层为整个任务设定一个总调用次数上限覆盖所有工具的调用总和。无论智能体调用的是工具A还是工具B都从同一个预算池扣减。调用其他工具不会清空任务预算避免通过工具切换来重置计数器。下一个维度是调用指纹每次工具调用生成一个指纹由工具ID和参数哈希组成。编排层维护一张指纹表新调用生成指纹后与历史指纹比对。指纹完全匹配说明是重复调用指纹高度相似——参数仅微小变化——标记为参数振荡。A—B—A回路通过指纹序列检测当最近的若干次调用指纹与更早的指纹形成重复模式时判定为工具回路。还有一个维度是信息增量调用返回后将结果数据与任务已有数据做差集运算。新增字段或新增记录数为零时标记为零增量调用。零增量调用连续出现时即使任务预算未耗尽也应当触发退出决策。第三个环节是退出决策。循环检测触发后编排层根据已有数据的充分性等级决定下一步。如果已有数据达到部分有效标准——至少包含必需字段但缺少非关键字段——编排层允许智能体使用已有数据继续执行任务在输出中标注数据不完整的部分。如果已有数据连部分有效都不满足编排层将任务转入人工处理队列同时附上已调用的参数和返回结果供人工参考。这个环节的关键在于系统必须具备用不完整数据继续的能力而不是非要等到数据完美才往下走。第四个环节是替代路径。除了循环熔断编排层还可以在结果不完整时主动建议智能体更换工具或调整查询策略。比如供应商查询缺少价格字段时编排层可以提示智能体尝试调用报价查询工具而不是反复用不同关键词查供应商库。这需要一个工具间的关联映射表定义当工具A返回不完整结果时可以尝试工具B的替代关系由工程团队在工具注册阶段维护。替代路径设置最大跳转次数超过限制后不再允许工具切换直接进入退出决策。替代路径还禁止无新增信息的回路如果跳转到替代工具后返回的数据与已有数据重叠不允许跳回原工具再试因为这条路已经被验证为低增量。替代关系需要人工配置和测试不能由模型临时创造新的工具调用链。工具调用循环的问题核心不在于模型能力而在于编排层是否具备行为约束能力。结果充分性定义解决了什么算够的问题调用指纹和信息增量解决了什么算重复的问题任务级预算解决了什么时候该停的问题退出决策和替代路径解决了停下来之后怎么办的问题。四个环节中任何一个缺失智能体都有可能在某个边界条件下重新陷入循环。对于实际部署的智能体项目而言工具调用的行为约束和工具能力本身同等重要——不能只关注工具能不能调通还要关注调不通时系统怎么处理以及调通但结果不完整时系统会不会知道该停下来。