修复智能体的死循环

我们的智能体陷入了 4 分钟的无限循环。

修复智能体的死循环
AI编程/Vibe Coding 遇到问题需要帮助的,联系微信 ezpoda,免费咨询。

我们的智能体陷入了 4 分钟的无限循环。

这是它的运行方式:

for i in range(10000):
    result = agent.query_database("找出所有收入大于 100 万的用户")
    for user in result:
        send_email_campaign(user)

每一轮都触发一个新问题:"这个用户年收入超过 100 万吗?"——但答案永远只是"是的"。

为什么会这样发生?我们检查了代码,并发现了根本原因:我们的智能体没有"思维链"——它没有内部对话来追踪自己的行为。

1、问题

这个问题并不新鲜——它是"回复哥"问题的一个经典变体。

当你构建智能体时,你经常会遇到以下问题:

  • 循环陷阱:智能体不断触发相同的操作循环。
  • 没有工作记忆:每个新提示都是独立处理的,没有上下文意识。
  • 状态跟踪失败:智能体忘记了它在做什么或它为什么这样做。

循环是如何发生的

我们的循环以 4 分钟的旋转开始,当时智能体决定执行"数据库查询"任务:

  1. 第一轮(0:00):查询数据库
  2. 第二轮(1:30):……又是查询数据库
  3. 第三轮(3:00):……查询数据库
  4. 第四轮(4:00):……查询数据库
  5. 第 N 轮:……查询数据库

在 4 分钟内,智能体向数据库发送了超过 14,000 次查询。

这个循环暴露了一个根本问题:缺乏内部对话和自我纠正机制

智能体没有问过自己:"等等,我刚才查过这个了吗?"

这是"回复哥"问题——但更危险的是,因为它发生在真实的 AI 系统(如 LLM 智能体、自主编码智能体等)中。

2、循环陷阱与真实 AI 系统

在 LLM 智能体中,这个问题非常真实。例如:

  • ReAct 智能体会卡在"观察-思考-行动"循环中
  • AutoGPT 循环:智能体不断向工具发送命令,而没有明确的目标
  • 工具使用死循环:智能体因为一个 bug 不断调用相同的工具

我们的智能体需要一种"内部对话"机制来:

  1. 追踪对话历史:记住什么发生了、为什么发生以及它是否有效
  2. 自我纠正:检测重复或无效行为
  3. 目标意识:理解它正在试图实现什么
  4. 终止条件:知道何时停止或改变策略

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 智能体的几个重要教训:

  1. 内部对话至关重要:没有它,智能体就像失忆一样
  2. 状态跟踪不可或缺:你需要知道智能体"认为"它正在做什么"
  3. 反思胜于盲目执行:在行动前暂停,思考后果
  4. 测试边缘情况:循环通常在边界条件时触发
  5. 日志和可观察性:没有可见性,你无法调试

现在我们的智能体运行更加可靠。但我们将继续改进:

  • 更好的对话模型:长期记忆而不是短期历史
  • 规划能力:多步规划而不仅仅是反应式
  • 工具使用优化:智能地选择和组合工具
  • 错误恢复:从失败中学习并恢复

6、结束语

4 分钟循环是一个简单的问题,但它揭示了构建智能体的一个深刻真理:没有内部对话,任何外部输入都可以导致灾难性行为。

我们的修复展示了,通过添加几个关键机制——对话历史、状态跟踪、反思和更好的提示工程——我们可以将一个失控的智能体转变为可靠的助手。


原文链接: Our Agent Had a 4-Minute Loop — How We Fixed It

汇智网翻译整理,转载请标明出处