在 LangGraph 中,ReAct(Reasoning + Acting)循环可以用最简化的两节点一图实现:一个 Agent 节点负责调用 LLM 生成回复或 tool_calls,一个 Tool 节点负责执行工具调用。两者之间通过一条条件边连接:如果 LLM 响应包含 tool_calls,路由到 Tool 节点;否则路由到 END 结束执行。Tool 节点执行完毕后通过普通边回到 Agent 节点,形成循环。
传统 ReAct 实现依赖 prompt 模板中的格式约定(如 "Thought: ... Action: ... Action Input: ..."),通过正则表达式解析 LLM 的文本输出。2026 年的实现已全面转向原生工具调用:模型根据工具定义的 JSON Schema 直接生成结构化的 tool_calls 字段,由框架层面进行严格验证,彻底消除了格式幻觉导致的崩溃问题。
静态实现使用独立的 router 函数配合 add_conditional_edges() 判断是否继续循环,图结构清晰可视;动态实现则将跳转逻辑内聚在 LLM 节点内部,通过 Command[Literal["tool_node", "output_node"]](update=..., goto=...) 直接在返回值中决定下一步去向。前者适合路由规则简单且被多个节点共享的场景,后者适合节点内部已掌握全部决策信息的场景。
ReAct 循环的出口始终在 LLM 手中——模型决定是否发出 tool_calls。为防止模型陷入无限循环或过度消耗 token,必须在代码层面设置防护:使用 recursion_limit 配置最大步数、在状态中维护 retry_count 或 stagnant_turns 计数器、对工具调用结果做去重检测等。生产环境还应加入 token 用量监控和断路器机制。