面试官问你:“Agent 的 ReAct 会死循环吗?”如果你回答“不会,ReAct 有终止条件”,那你就只能回家等通知了。
为什么?
因为 ReAct 真的会死循环,我今天早上在用 QoderWork 跑无限画布设计 Codex/Claude Code 学习网站的时候,就遇到了,QoderWork 不但跑不出结果,还会莫名其妙挂掉,进程直接没了。重启也不行。
哈喽大家好,我是二哥呀。今天继续用 3 分钟,拆一道 Agent 高频面试题。
老规矩,先搞清楚面试官在考什么。
他问“ReAct 会不会死循环”,表面在问 ReAct 模式,实际在考察三件事:
第一,你理不理解 ReAct 循环机制;
第二,你知不知道 Harness 工程;
第三,Agent 遇到死循环后如何解决?
好,接下来给你满分回答,照着背就完事了。
先说机制。ReAct 的核心就是一个循环:Thought 思考、Action 执行、Observation 观察,然后回到 Thought,继续想下一步该干嘛。什么时候停?LLM 自己决定。
问题就出在这——停不停,完全取决于 LLM 的判断。它觉得不够,就停不下来。
死循环有三种典型场景。
第一种,重复调用。Agent 用同样的参数反复调同一个工具,每次拿到一样的结果,但它不认为自己重复了。因为 ReAct 没有原生的去重机制,Agent 看不到自己的历史行为模式。
第二种,上下文混乱。ReAct 每走一步,Thought、Action、Observation 都会追加到对话历史里。走到第 10 步,上下文可能已经膨胀到几万 token。LLM 对长上下文的注意力分布是 U 型的——开头和结尾记得清楚,中间的内容会被遗忘。所以走了十几步之后,Agent 可能忘了自己第 3 步已经试过的方案,又重新来一遍。
第三种,错误重试。工具报错了,Agent 用同样的方式重试,又报错,继续重试。更离谱的是,垃圾的大模型还会幻觉出根本不存在的工具名,每次重试都浪费一轮,直到耗尽 Token。
面试官如果追问:“生产环境里怎么防止ReAct死循环?”
告诉他,三道防线。
第一,硬性迭代上限。LangChain 的 AgentExecutor 默认最多跑 15 轮,超了就强制停止,把已有的中间结果返回给用户。这是最基本的兜底。
第二,循环检测。记录每次工具调用的指纹——工具名加返回结果。同样的指纹连续出现 3 次,判定为卡死,直接介入处理。
第三,上下文压缩。循环跑到 10 步以上,把早期的对话历史做摘要,只保留关键结论,扔掉细节。让 Agent 始终记住最重要的信息,去掉无关干扰。
最后一句口诀——ReAct 停不停靠 LLM 自己判断,要想不死循环,得做好 Harness。
这道题你学废了吗?想解锁更多 Agent 面试题的源码级拆解,点赞关注,我是二哥,下期见!
