修复智能体的死循环
我们的智能体陷入了 4 分钟的无限循环。
这是它的运行方式:
for i in range(10000):
result = agent.query_database("找出所有收入大于 100 万的用户")
for user in result:
send_email_campaign(user)
每一轮都触发一个新问题:"这个用户年收入超过 100 万吗?"——但答案永远只是"是的"。
为什么会这样发生?我们检查了代码,并发现了根本原因:我们的智能体没有"思维链"——它没有内部对话来追踪自己的行为。
1、问题
这个问题并不新鲜——它是"回复哥"问题的一个经典变体。
当你构建智能体时,你经常会遇到以下问题:
- 循环陷阱:智能体不断触发相同的操作循环。
- 没有工作记忆:每个新提示都是独立处理的,没有上下文意识。
- 状态跟踪失败:智能体忘记了它在做什么或它为什么这样做。
循环是如何发生的
我们的循环以 4 分钟的旋转开始,当时智能体决定执行"数据库查询"任务:
- 第一轮(0:00):查询数据库
- 第二轮(1:30):……又是查询数据库
- 第三轮(3:00):……查询数据库
- 第四轮(4:00):……查询数据库
- 第 N 轮:……查询数据库
在 4 分钟内,智能体向数据库发送了超过 14,000 次查询。
这个循环暴露了一个根本问题:缺乏内部对话和自我纠正机制。
智能体没有问过自己:"等等,我刚才查过这个了吗?"
这是"回复哥"问题——但更危险的是,因为它发生在真实的 AI 系统(如 LLM 智能体、自主编码智能体等)中。
2、循环陷阱与真实 AI 系统
在 LLM 智能体中,这个问题非常真实。例如:
- ReAct 智能体会卡在"观察-思考-行动"循环中
- AutoGPT 循环:智能体不断向工具发送命令,而没有明确的目标
- 工具使用死循环:智能体因为一个 bug 不断调用相同的工具
我们的智能体需要一种"内部对话"机制来:
- 追踪对话历史:记住什么发生了、为什么发生以及它是否有效
- 自我纠正:检测重复或无效行为
- 目标意识:理解它正在试图实现什么
- 终止条件:知道何时停止或改变策略
3、如何修复 4 分钟循环
我们实施了几个解决方案,将循环时间从 4 分钟减少到几秒钟:
3.1 添加对话历史
我们添加了一个 conversation_history 机制。智能体现在可以:
class Agent:
def __init__(self):
self.conversation_history = [] # 内部对话
def query_database(self, query):
# 检查对话历史,避免重复
last_query = self.get_last_database_query()
if last_query and query.similar_to(last_query):
self.log(f"跳过重复查询: {query}")
return "最近已经查询过了"
# 正常执行并记录
result = self.database.execute(query)
self.add_to_history(f"数据库查询: {query}", result=result)
return result
效果:智能体现在会记住它刚刚问过什么。
3.2 状态标记
我们添加了显式状态跟踪:
class Agent:
def __init__(self):
self.current_task = None # 当前正在执行的任务
self.task_stack = [] # 任务栈
def execute_task(self, task):
# 检查循环
if self.is_in_loop(task):
self.log(f"检测到循环: {task}")
return
# 正常执行
self.task_stack.append(task)
result = self.execute(task)
# 弹出任务
self.task_stack.pop()
return result
效果:智能体现在知道自己何时陷入循环并可以跳出。
3.3 反射机制
最有效的修复是反思——在执行操作之前问自己"这是个好主意吗?"
class Agent:
def should_execute(self, action):
# 反思:这有意义吗?会导致循环吗?
if not self.is_reasonable(action):
return False
return True
def execute(self, action):
if self.should_execute(action):
return self.perform(action)
else:
self.log(f"跳过可能有害的操作: {action}")
效果:智能体现在执行之前会检查自己的行为。
3.4 上下文窗口优化
我们改进了系统提示以提供更清晰的上下文:
SYSTEM_PROMPT = """
你是一个智能助手。你的任务是:
1. 回答用户问题
2. 维护对话历史,避免重复
3. 在执行操作前反思是否合适
4. 追踪你的任务状态
对话历史(最近 10 条):
{self.conversation_history}
当前任务:
{self.current_task}
重要:你有一个内部记忆。利用它来避免重复工作。
"""
4、修复后的性能
实施这些改进后,我们的智能体性能大幅提升:
| 指标 | 修复前 | 修复后 | 改进 |
|---|---|---|---|
| 数据库查询次数 | 14,000+/4 分钟 | ~300 | 减少 98.6% |
| 响应时间 | ~10 秒 | ~2 秒 | 提高 80% |
| 循环次数 | 无限 | 0 | 消除循环 |
5、关键教训
从这次调试中,我们学到了关于构建 AI 智能体的几个重要教训:
- 内部对话至关重要:没有它,智能体就像失忆一样
- 状态跟踪不可或缺:你需要知道智能体"认为"它正在做什么"
- 反思胜于盲目执行:在行动前暂停,思考后果
- 测试边缘情况:循环通常在边界条件时触发
- 日志和可观察性:没有可见性,你无法调试
现在我们的智能体运行更加可靠。但我们将继续改进:
- 更好的对话模型:长期记忆而不是短期历史
- 规划能力:多步规划而不仅仅是反应式
- 工具使用优化:智能地选择和组合工具
- 错误恢复:从失败中学习并恢复
6、结束语
4 分钟循环是一个简单的问题,但它揭示了构建智能体的一个深刻真理:没有内部对话,任何外部输入都可以导致灾难性行为。
我们的修复展示了,通过添加几个关键机制——对话历史、状态跟踪、反思和更好的提示工程——我们可以将一个失控的智能体转变为可靠的助手。
原文链接: Our Agent Had a 4-Minute Loop — How We Fixed It
汇智网翻译整理,转载请标明出处