【LangGraph 学习笔记】一文搞懂核心概念与 Hello World 实战
一、LangGraph 的四大核心组件构建一个 LangGraph 应用本质上就是在拼装四个核心零件State状态、Node节点、Edge边和StateGraph状态图。1. State状态—— 图的“共享记忆”是什么它是图运行过程中的全局变量用于在各个节点之间传递和保存信息。怎么写通常使用 Python 的TypedDict或Pydantic模型来定义。怎么用在创建图的时候传入如workflow StateGraph(State)。这样图里的所有节点都能读写这块“共享白板”。2. Node节点—— 图的“打工人”是什么负责执行具体业务逻辑的 Python 函数。函数签名必须是def node_func(state: State) - dict的形式。核心机制函数接收当前的state执行完逻辑后返回一个字典只包含需要更新的字段LangGraph 会自动帮你把返回的字典合并到全局 state 中而不会覆盖其他字段。3. Edge边—— 图的“传送带”是什么用于连接节点决定程序的走向。怎么写通过workflow.add_edge(a, b)设置表示节点 a 执行完后无条件进入节点 b。4. StateGraph状态图—— 图的“工厂”是什么LangGraph 的核心类负责把上述的节点和边组装起来。怎么用workflow.add_node(名字, 函数)把节点装进工厂。workflow.set_entry_point(名字)设置图的起点入口。workflow.add_edge(上个节点, END)设置图的终点END是内置的结束标志。app workflow.compile()编译图。这一步会将你画的图纸变成真正可运行的代码返回一个继承自 LangChainRunnable接口的Pregel对象随后就可以使用app.invoke()来运行了。二、代码实战LangGraph 的 Hello World光看概念容易晕我们直接上代码。下面这段代码展示了从定义状态到编译运行的全过程。from typing import TypedDict from langgraph.graph import StateGraph, END # 知识点 1定义 State # 使用 TypedDict 定义图的状态结构 # 这是所有节点共享的“全局内存” class State(TypedDict): message: str # 当前消息内容 # 知识点 2定义 Node # 节点函数接收 state返回要更新的字段字典格式 def node_a(state: State) - dict: 节点 A打印当前消息并更新 message 字段 注意返回的是字典只包含需要更新的部分 print(f[Node A] 收到消息: {state[message]}) # 返回更新后的 messageLangGraph 会自动 merge 到全局 state return {message: Hello from Node A!} def node_b(state: State) - dict: 节点 B继续处理消息 print(f[Node B] 收到消息: {state[message]}) return {message: Goodbye from Node B!} # 知识点 3 4构建图并编译 # 1. 创建 StateGraph 实例传入 State 类型 workflow StateGraph(State) # 2. 添加节点名字 函数 workflow.add_node(a, node_a) workflow.add_node(b, node_b) # 3. 设置入口点从哪个节点开始 workflow.set_entry_point(a) # 4. 添加边定义流转路径 a → b → END结束 workflow.add_edge(a, b) workflow.add_edge(b, END) # 5. 编译图为可执行应用 (返回 Pregel 对象) app workflow.compile() # 执行图 if __name__ __main__: # 准备初始状态字典 initial_state {message: Start the workflow!} print(--- 开始执行图 ---) # invoke() 触发整个图的执行 final_state app.invoke(initial_state) print(\n✅ 最终状态:, final_state)运行结果--- 开始执行图 --- [Node A] 收到消息: Start the workflow! [Node B] 收到消息: Hello from Node A! ✅ 最终状态: {message: Goodbye from Node B!}三、运行机制深度解析新手必看在上面的代码中有一个非常关键的设计思想初学者极易踩坑节点的返回值机制。注意看node_a的代码def node_a(state: State) - dict: # 这里读取了 state[message] print(f[Node A] 收到消息: {state[message]}) # 这里只返回了 message 字段 return {message: Hello from Node A!}它是如何更新状态的LangGraph 采用的是局部更新机制。当node_a返回{message: Hello from Node A!}时LangGraph 底层做的是合并操作而不是替换操作。进入 Node A 前state {message: Start the workflow!}Node A 返回{message: Hello from Node A!}LangGraph 合并后state {message: Hello from Node A!}为什么要这样设计假设你的 State 里有 10 个字段比如message、user_id、历史记录、搜索结果等但在 Node A 中你只想更新message。如果采用替换机制你还得把其他 9 个字段原封不动地写一遍再返回这太蠢了。局部更新让你只关心“我要改变什么”。数据流向图解[初始输入] {message: Start the workflow!} ↓ ( set_entry_point ) ↓ [Node A 执行] 读取: Start the workflow! 返回: {message: Hello from Node A!} ↓ ( add_edge(a, b) ) ↓ [Node B 执行] 读取: Hello from Node A! -- 注意这里拿到的是 A 更新后的值 返回: {message: Goodbye from Node B!} ↓ ( add_edge(b, END) ) ↓ [图运行结束输出最终 State] {message: Goodbye from Node B!}