LangGraph 为什么报 GraphRecursionError?recursion_limit 应该怎么设置?
下面是一段教学模拟,不是真实面试记录。
🧑💻 面试官:Agent 跑着跑着报了 GraphRecursionError,你会怎么处理?
🙋♂️ 我:说明递归太深,把 recursion_limit 调大就好了。
🧑💻 面试官:如果它一直在两个节点之间打转,调到一万有什么用?
🙋♂️ 我:那先检查循环条件。
🧑💻 面试官:对。另外,这个限制算的是 Python 函数递归次数、工具调用次数,还是图的执行步数?
先判断「为什么没停」,再判断「上限够不够」。这个错误限制的是图运行超步,不是在提醒你调大语言的递归栈。
面试速答(60 秒版)
GraphRecursionError 表示图在达到执行超步上限时,还没有满足停止条件。名称里有 Recursion,但它不是普通函数递归栈溢出。
排查时,我会先看最近的节点路径和状态变化。如果反复走同一条循环,就检查结束分支、工具结果是否写回,以及失败之后有没有退出条件。
如果图确实需要较多超步,再根据实际任务长度调整限制。Python 配置名是 recursion_limit,JavaScript 和 TypeScript 使用 recursionLimit。
不过,超步限制只能提供一道保护。模型调用、工具调用、运行时间和费用仍需要单独预算。调大限制不能代替修正循环,也不能保证任务一定完成。

知识点详解:报错之后,先找哪一轮开始没有进展
这个“递归”不是函数自己调用自己
假设图只有两个节点:模型决定下一步,工具执行任务。执行工具后又回到模型,这就是一条图循环。
即使节点内部没有任何递归函数,这条路线仍然可以运行很多超步。达到配置的限制还没结束,就可能出现这个错误。
反过来,一轮超步里可以有多个并行节点,一个节点内部也可能调用模型多次。因此不能把“限制 40”直接理解成“最多调用工具 40 次”。Python 错误说明
先看循环是否应该继续
假设 Agent 查询一条订单,第一次工具返回“没有找到”。
如果模型节点没有拿到这个结果,下一轮可能又发出同样的查询。工具很努力地执行,图却一直没有新增有效信息。
这时应查看最近几轮:
| 检查对象 | 要确认的问题 |
|---|---|
| 节点路径 | 是正常推进,还是重复走相同环路? |
| 状态更新 | 工具结果有没有保存并提供给下一轮? |
| 结束条件 | 有结果、无结果、不可重试错误分别走向哪里? |
| 重试逻辑 | 是否有次数限制、参数变化和退出分支? |
“失败后继续试”不是完整规则。至少还要说明哪些错误可以重试、什么时候放弃,以及放弃后怎样向用户解释。

正常长任务,也可能碰到上限
例如图需要处理一批资料,每份资料都要经过读取、抽取、检查几个节点。它可能一直在正常前进,但总超步确实超过了原限制。
这种情况下,调大限制有意义。不过不能只拿一个成功案例估算:还要覆盖资料数量的上界、失败重试和需要重新规划的路径。
下面仅演示对已构建图传入限制,40 是教学配置,不是推荐所有项目照用的数值。
TypeScript
// graph 已按当前项目构建;input 是符合该图状态定义的输入。
const result = await graph.invoke(input, {
recursionLimit: 40,
});
Python
# graph 已按当前项目构建;input_data 符合该图状态定义。
result = graph.invoke(input_data, {
"recursion_limit": 40,
})
两种语言的配置名不同,不能直接复制字段。JavaScript 配置说明
步数预算之外,还需要控制什么?
图有 40 个超步,不代表每轮都很便宜。某个节点可能发起多个查询,或者等待很慢的外部服务。
因此,实际还需要限制工具总调用量、单次工具超时、总执行时间以及费用。遇到权限错误、用户取消或明确无法完成的任务,也应主动结束,而不是一直耗到步数上限。
可以为循环保存“最近一次有效进展”。多次运行都没有得到新证据,通常就需要更换策略、询问用户,或者停止。这与超步上限解决的是不同问题:一个判断有没有继续的价值,一个限制最坏情况下跑多远。
面试官继续追问
报错后直接返回“任务完成”,行不行?
不行。达到限制只说明运行被保护性终止。应该返回未完成状态、已有结果和停止原因,不能把异常包装成成功。
有 END 节点,为什么还会无限循环?
存在结束节点,不代表条件分支会走到它。要检查实际判断依据,尤其是状态字段有没有更新,以及模型返回的工具请求是否被正确解析。
怎么证明调大限制是合理的?
先用一批固定任务观察正常超步范围,再测试故意循环和失败重试。新的上限既要覆盖合法长路径,也要能在异常情况下有限停止,同时不突破其他预算。
面试速记卡
- 错误含义:达到图执行超步限制,但还没有停止。
- 排查顺序:先查循环路径、状态更新与结束条件,再考虑增大上限。
- Python 参数:recursion_limit。
- TypeScript 参数:recursionLimit。
- 保护范围:超步上限不是工具、时间和费用的完整预算。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →