要用langgraph实现复杂有状态流程控制,必须先定义带类型约束的typeddict状态结构(含input、messages等字段),再注册纯函数节点、设置条件/循环边,最后compile校验并invoke执行;字段名、节点名、条件返回值须严格一致,否则运行时报错。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要用LangGraph实现复杂有状态流程控制,必须跳出线性链式思维,直接基于状态图(StateGraph)定义节点行为、边跳转逻辑与状态更新规则——不声明状态结构就写节点,运行时会报KeyError或ValidationError,根本无法编译。
定义带类型约束的状态结构
第一步不是写函数,而是用TypedDict明确声明状态字段及其类型。LangGraph依赖此结构做运行时校验,字段名拼错、类型不匹配都会在graph.compile()时报错。
创建State类,继承TypedDict,至少包含input和messages两个基础字段;若需历史累积,对messages使用Annotated配合lambda x, y: x + y合并策略。
【字段名必须与后续节点返回字典的键完全一致】,比如状态里定义user_query: str,但节点返回{"query": "xxx"},该字段不会被写入状态,且无任何警告。
添加节点并绑定处理逻辑
节点本质是纯函数:接收State类型输入,返回dict形式的状态更新片段。
用add_node("node_name", func)注册节点;函数名可任意,但add_node第一个参数字符串必须唯一,后续设边时靠它引用。
每个节点函数内部不能修改传入的state对象本身,必须构造新字典返回——LangGraph默认采用浅合并(shallow merge),同名键会被覆盖,非同名键保留原值。
设置执行路径:普通边、条件边、循环边
方法一:线性顺序执行
调用add_edge("A", "B"),表示A执行完后无条件跳转到B;入口点用set_entry_point("A")指定起始节点。
方法二:条件分支跳转
用add_conditional_edge("A", condition_func, {"yes": "B", "no": "C"});其中condition_func接收state,返回字符串(如"yes"),必须严格匹配映射字典的键,否则流程中断并抛出InvalidUpdateError。
方法三:显式循环控制
在条件边的目标映射中加入END或自循环目标,例如{"continue": "A", "end": END};注意END是langgraph.graph模块导出的特殊常量,不可手写字符串"END"。
编译图并触发执行
调用graph.compile()生成可执行对象,这一步会校验所有节点名、边指向、状态字段一致性。未通过则直接报错,不生成实例。
执行时用graph.invoke({"input": "xxx", "messages": []})传入初始状态;传入字段必须是状态结构中声明过的键,多传不报错但被忽略,少传则触发ValidationError。
这一步操作起来很简单,直接把初始化字典传进去就行。但若状态含Annotated字段(如messages),初始值必须符合其类型要求——例如messages初始不能为None,必须是空列表[]或含BaseMessage实例的序列。











