AI Agent 为什么会陷入死循环?用 Python 实现一个轻量级工具调用控制器
一、前言
随着大模型技术的发展,AI Agent 已经能够自主调用搜索、文件读取、API 等外部工具,完成复杂任务。
但在实际开发中,我们可能遇到一个问题:Agent 反复调用相同的工具,却始终无法完成任务。
这种情况不仅浪费 Token,还可能造成 API 调用成本增加、程序响应缓慢等问题。
本文通过 Python 实现一个简单的工具调用控制器,介绍如何避免 AI Agent 陷入无限循环。
二、为什么 Agent 会陷入循环?
AI Agent 通常按照以下流程工作:
接收任务 → 分析任务 → 选择工具 → 执行工具 → 获取结果 → 再次决策
如果模型始终认为任务没有完成,就可能不断重复执行。
常见原因包括:
-
工具返回信息不足: Agent 无法判断任务是否完成。
-
缺少调用次数限制: 程序允许模型无限次调用工具。
-
缺少重复检测: 相同的工具和参数被反复执行。
-
缺少超时机制: 执行流程长时间无法结束。
因此,我们需要在 Agent 和外部工具之间增加一层控制逻辑。
三、Python 实战:实现工具调用控制器
下面实现三个核心功能:
-
限制最大工具调用次数。
-
检测重复的工具调用。
-
限制整体执行时间。
示例不依赖第三方库,Python 3.9 及以上版本即可运行。
完整代码
import json
import time
# 模拟搜索工具
def search(keyword):
return f"搜索结果:{keyword}相关内容"
TOOLS = {
"search": search
}
# 模拟 Agent 决策
def agent_decide(history):
return {
"name": "search",
"args": {"keyword": "AI Agent"}
}
# 工具调用控制器
def run_agent(max_calls=5, timeout=10):
start = time.monotonic()
history = []
seen = set()
for step in range(max_calls):
# 1. 总时间检查
if time.monotonic() - start >= timeout:
return "停止:执行超时"
action = agent_decide(history)
name = action["name"]
args = action["args"]
# 2. 工具白名单检查
if name not in TOOLS:
return "停止:未知工具"
# 3. 重复调用检查
key = json.dumps(
action, sort_keys=True
)
if key in seen:
return "停止:检测到重复工具调用"
seen.add(key)
# 4. 执行工具
try:
result = TOOLS[name](**args)
except Exception as e:
return f"工具执行失败:{e}"
history.append(result)
print(f"第{step + 1}次调用:{result}")
return "停止:达到最大调用次数"
print(run_agent())
四、运行效果
运行上述代码,预期输出:
第1次调用:搜索结果:AI Agent相关内容
停止:检测到重复工具调用
可以看到:
第一次调用正常执行,而第二次请求与第一次完全相同,因此控制器直接终止执行。
这里采用严格的重复检测策略,适合演示循环防护。在真实系统中,某些重复调用可能是合理的,例如轮询任务状态,因此可以进一步设置重复次数阈值。
另外,示例中的超时检查只能在每次循环开始时生效。如果工具本身发生阻塞,还需要为实际 HTTP 请求或工具执行过程单独配置超时机制。
五、实际开发中的优化方向
除了上述基础方案,还可以继续完善:
-
失败重试: 对临时网络错误采用有限次数的重试。
-
执行日志: 记录每次工具调用的参数和返回状态。
-
Token 预算: 限制 Agent 单次任务的模型调用成本。
-
终止条件: 让 Agent 明确区分任务完成、任务失败与需要继续执行。
这些机制可以让 Agent 的执行过程更加可控。
六、总结
AI Agent 的能力不仅取决于大模型本身,还取决于外围执行系统的设计。
本文通过一个轻量级 Python 示例,实现了调用次数限制、重复检测和基础超时检查。
虽然示例简单,但体现了一个重要的工程思想:
Agent 可以自主决定使用什么工具,但工具执行必须受到程序规则的约束。
在实际项目中,合理设计工具调用边界,是提升 AI Agent 稳定性、安全性和可维护性的重要一步。
- 点赞
- 收藏
- 关注作者
评论(0)