LangGraph 状态机:把 AI Agent 从「随机复读机」变成「可控流程引擎」
LangChain 的 LangGraph 给 Agent 开发带来的不是新玩具,而是一套「确定性治理框架」。写 ReAct 模式 Agent 的开发者都懂这种痛:模型在两个工具间反复横跳,或者沿着错误方向一路狂奔,Token 烧完才发现问题。
引入状态机实现带护栏的显式循环
DAG 工作流太僵硬,纯 LLM 循环又太随性。LangGraph 的关键在于引入了「状态机」和「显式状态管理」——它允许定义循环,但循环是带护栏的。
它处理死循环的几个实招:
状态快照与持久化。 LangGraph 把 Agent 中间状态全部塞进一个可检查的 State 对象。每一步跳转都有迹可循,开发者直接查 message_history 或自定义计数器,在代码层强行截断死循环,而不是靠 Prompt 苦口婆心劝 AI「别重复了」。
显式边与条件路由。 不再是「模型说了算」,你可以定义 conditional_edge。比如写个简单判断:同一工具连续调用 3 次且结果相同,直接强制跳到「报错处理」节点,不跟它耗。
人类介入(Human-in-the-loop)。 这是兜底手段。通过 breakpoint 机制,Agent 在可能陷入风险循环前挂起,等人工确认或修改状态再继续。
从调试提示词转向设计状态拓扑图
开发者要干的事变了:从「调 Prompt 防死循环」转向「设计状态拓扑图避死循环」。
典型的状态定义逻辑:
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, END
# 定义状态,记录调用次数以防止死循环
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
loop_count: int
def should_continue(state: AgentState):
# 强制约束:超过 5 次循环直接跳出
if state["loop_count"] > 5:
return "end"
if "FINAL ANSWER" in state["messages"][-1].content:
return "end"
return "continue"
# 构建图
workflow = StateGraph(AgentState)
# ... 添加节点和边 ...
workflow.add_conditional_edges("agent", should_continue, {
"continue": "tools",
"end": END
})
AI Agent 向工程化组件转型的趋势
行业层面,这意味着一件事:AI Agent 正从「概率性玩具」转向「工程化组件」。状态机能精确控制 LLM 的执行路径时,Agent 才敢部署到自动化财务审计、复杂代码重构这类对稳定性要求极高的企业级环境,而不是停留在聊天机器人层面。
