智能体工具调用的有界重试
我们的智能体造成的最严重事故并不是给出了错误答案,而是一个死循环。
一次工具调用失败了。智能体进行了重试。重试再次失败。智能体继续尝试。它消耗了大量 Token,并在短短一分钟内调用了我们数百次 API。
智能体只是在执行我们告诉它的指令。我们告诉它如果工具调用失败就重试,却忘了告诉它什么时候该停止。
重试对于临时性错误是有益的。问题在于,智能体无法区分临时错误和永久性错误。如果没有限制,智能体会不断重试一个已经损坏的调用,直到被某种机制强制终止。
传统代码使用重试限制。而智能体的工具调用将这一决策权交给了模型的推理过程。这使得循环变得不可见且无界。
我们通过在模型之外添加两个“预算”解决了这个问题:
• 单次调用上限:为特定工具设置固定的尝试次数。如果失败,智能体必须尝试其他路径。 • 单次会话预算:整个任务的总工具调用次数设有上限。如果智能体达到了这个限制,它会停止并寻求帮助。
限制本身并不是解决方案。关键在于达到限制后会发生什么。
如果只是简单地停止,智能体会陷入僵局。相反,我们向智能体发送一条明确的消息:告知调用已失败且不得再重试。这把一个“循环”变成了一个“决策”。通常情况下,智能体会随后选择一种新的方法。
自从引入这一机制后,工具误用导致的循环几乎消失了。即使发生,它们也会以清晰的方式进行错误升级,而不是产生巨额的 API 账单。
找到合适的限制很难。限制太严会中断长任务,限制太松则会导致昂贵的循环。我们根据任务长度的第 95 百分位数来设定限制。
你有更好的设置这些预算的方法吗?欢迎在评论区告诉我。
Optional learning community: https://t.me/GyaanSetuAi