状态机卡死与熔断
Q:Agent 用状态机编排时,状态机卡死悬停、死循环怎么排查和熔断?
来源:百度 AI Agent前端研发实习生一面
新手答:”加个超时就行了。”
高手答:
状态机卡死有三种典型模式,排查和熔断策略不同:
| 卡死模式 | 现象 | 根因 | 熔断策略 |
|---|---|---|---|
| 悬停 | 停在某状态不转移 | 等待外部事件(工具超时/用户无响应)或转移条件永远不满足 | 状态级超时 + 强制转移到 fallback 状态 |
| 死循环 | A→B→A→B 反复跳转 | 两个状态互相触发对方的转移条件 | 转移计数器 + 相同路径出现 N 次触发熔断 |
| 活锁 | 状态在变但任务没进展 | 每次转移都触发”重新评估”导致回退 | 进度检测——每 K 步检查目标距离是否缩短 |
排查手段:
- 状态转移日志:记录每次
(from_state, event, to_state, timestamp),卡死时直接看最后几条转移 - 状态停留时长监控:每个状态设置预期最大停留时间,超时即告警
- 转移热力图:统计各状态对之间的转移频率,异常高频的路径就是循环点
熔断设计:
text
每个状态:max_duration = 30s(超时强制离开)
全局:max_transitions = 20(总转移次数上限)
路径级:same_path_count >= 3(同一条转移路径出现3次 → 熔断)
熔断动作:进入 ERROR 终态 → 输出已完成部分 + 错误原因关键原则:熔断不是”直接报错退出”——而是带着当前上下文进入一个优雅降级状态,告诉用户”已完成 XX,但 YY 步骤无法继续,原因是 ZZ”。
差距在哪:面试官考的是你对”状态机不是银弹”的认知。用了状态机不等于不会死循环——三种卡死模式的识别和分级熔断是核心。只说”加超时”覆盖了悬停但漏了循环和活锁。