Agent Infinite Loop

Agent 防止**无限循环(Infinite Loop)**是生产级 Agent 系统非常重要的问题。尤其是 Multi-Agent 中,Agent 之间可能互相调用,更容易出现循环。

可以把它理解成:

不能让 Agent 拥有“无限执行”的权力,必须给它设置硬边界。


1. 最基本的方法:最大执行次数

最简单也最有效:

Agent
调用 Tool
观察结果
继续思考
调用 Tool
...
达到 Max Steps
强制停止

例如:

int maxSteps = 10;

for (int step = 0; step < maxSteps; step++) {

    AgentResult result = agent.run(context);

    if (result.isCompleted()) {
        return result;
    }

    context = result.getNextContext();
}

return AgentResult.failed("Maximum steps exceeded");

比如:

max_steps = 10

意味着 Agent 最多执行 10 个 reasoning/action cycle。

这是第一道保险


2. Token Limit

第二层是限制 Token。

例如:

Agent
 ├── Prompt
 ├── History
 ├── Tool Result
 ├── Reasoning
Token Counter
 └── > 100K ?
      STOP

例如:

max_input_tokens  = 50,000
max_output_tokens = 10,000

如果 Agent 不断产生内容,Token 最终达到限制,就停止。

不过:

Token limit 不能代替 Max Steps。

因为 Agent 可能每次只产生很少 Token,但执行几千次。


3. Timeout

第三层:

Agent
Timer
30 seconds
STOP

例如:

CompletableFuture
    .supplyAsync(() -> agent.run(context))
    .orTimeout(30, TimeUnit.SECONDS);

生产系统通常同时设置:

Max Steps
+
Max Token
+
Timeout

形成三重保护。


4. Tool 调用次数限制

这个非常重要。

假设 Agent 有:

search()
database()
http()
code_execution()

不能让它无限调用。

例如:

search:        max 5
database:      max 10
http:          max 10
code_execution max 3

可以设计:

class ToolUsage {

    Map<String, Integer> counters;

    boolean allowed(String tool) {
        return counters.getOrDefault(tool, 0) < LIMIT;
    }
}

这样:

Agent
search()
search()
search()
search()
search()
第 6 次
REJECT

5. 检测重复调用

这是 Agent 防循环非常关键的一招。

例如 Agent 出现:

search("Java Redis")
search("Java Redis")
search("Java Redis")
search("Java Redis")

显然可能陷入循环。

可以建立一个:

Tool Call Fingerprint

例如:

hash(
    toolName
    +
    arguments
)

得到:

ABC123

如果:

ABC123
ABC123
ABC123

连续重复,就停止。


6. 检测 State 是否没有变化

比简单的重复 Tool Call 更高级。

例如:

State 1
question = "xxx"
answer   = null


State 2
question = "xxx"
answer   = null


State 3
question = "xxx"
answer   = null

虽然 Tool 参数可能不同,但系统状态实际上没有变化

这时候可以判断:

State(N) == State(N-1)

或者:

similarity(StateN, StateN-1) > threshold

然后:

STOP

7. Multi-Agent 最危险的是 Agent A ↔ Agent B

例如:

Agent A
"请 Agent B 分析"
Agent B
"请 Agent A 再确认"
Agent A
"请 Agent B 再分析"
Agent B
...

这就是典型的:

Agent Communication Loop

解决方法之一是建立:

Call Stack

例如:

Supervisor
 → ArchitectureAgent
   → DatabaseAgent
     → ArchitectureAgent

发现:

ArchitectureAgent

已经在当前调用链中:

ArchitectureAgent
 → DatabaseAgent
   → ArchitectureAgent ❌

直接拒绝。

类似 Java:

A()
B()
A()

本质上就是检测 recursion。


8. 给 Agent 设置“职责边界”

这个其实比技术限制更重要。

不要让所有 Agent 都拥有:

所有 Tool
+
调用所有 Agent

例如:

Supervisor
   ├── Architecture Agent
   │       └── 可以调用 DB Agent
   ├── DB Agent
   │       └── 可以查询数据库
   └── Security Agent
           └── 可以调用 Security Tools

而不是:

Every Agent
Every Agent
Every Tool

后者非常容易形成复杂循环。


9. 使用状态机控制 Agent

生产系统里我非常推荐这个思路。

不要:

LLM 自己决定下一步

而是:

             ┌──────────┐
             │   START  │
             └────┬─────┘
             ┌──────────┐
             │ PLANNING │
             └────┬─────┘
             ┌──────────┐
             │ EXECUTE  │
             └────┬─────┘
             ┌──────────┐
             │ VERIFY   │
             └────┬─────┘
             ┌──────────┐
             │  DONE    │
             └──────────┘

状态只能按照允许的方向移动。

例如:

PLANNING
EXECUTE
VERIFY
DONE

而不允许:

VERIFY
PLANNING
EXECUTE
VERIFY
PLANNING
...

除非明确允许重试,而且:

retry <= 3

10. Retry 也必须有限制

很多 Agent 无限循环实际上是:

Tool failed
Retry
Tool failed
Retry
Tool failed
Retry
...

所以必须:

if (retryCount >= 3) {
    throw new AgentExecutionException(
        "Maximum retry exceeded"
    );
}

更进一步,可以使用:

Exponential Backoff

例如:

1s
2s
4s
8s
STOP

11. 最好建立一个 Agent Guard

如果你以后真正做 Multi-Agent 项目,我建议把这些能力统一抽象出来:

                 Agent Guard
        ┌────────────┼─────────────┐
        ↓            ↓             ↓
   Max Steps     Timeout       Token Limit
        │            │             │
        ↓            ↓             ↓
   Tool Limit    Retry Limit   Cost Limit
        │            │             │
        └────────────┼─────────────┘
              Loop Detection
                ALLOW / STOP

例如:

public class AgentGuard {

    private final int maxSteps = 10;
    private final int maxToolCalls = 20;
    private final int maxRetries = 3;

    public boolean allow(AgentContext context) {

        if (context.getSteps() >= maxSteps) {
            return false;
        }

        if (context.getToolCalls() >= maxToolCalls) {
            return false;
        }

        if (context.getRetries() >= maxRetries) {
            return false;
        }

        if (context.isRepeatedState()) {
            return false;
        }

        if (context.isCycleDetected()) {
            return false;
        }

        return true;
    }
}

12. 最终可以形成一套生产级防护体系

我建议你记住这个架构:

                  User
              Supervisor
              Agent Runtime
          ┌────────┴────────┐
          │   Agent Guard   │
          └────────┬────────┘
      ┌────────────┼─────────────┐
      ↓            ↓             ↓
  Max Steps     Timeout      Token Limit
      ↓            ↓             ↓
  Tool Limit    Retry Limit   Cost Limit
      └────────────┼─────────────┘
             Loop Detection
              State Machine
             Agent Execution
                Result

总结

Agent 防止无限循环通常采用多层 Guard 机制,包括最大执行步数、Token 限制、Timeout、Tool 调用次数限制、Retry 上限、重复状态检测以及 Agent 调用链的 Cycle Detection。对于 Multi-Agent,还需要通过 Supervisor、State Machine 和 Agent 权限边界控制 Agent 间的循环调用。生产环境一般不会让 LLM 完全自由地控制 Workflow,而是让 LLM 负责决策,把执行流程交给确定性的 Workflow/State Machine 控制。

Vincent zhai
Vincent zhai
Full-Stack Engineer