Skip to main content

11 · 从流水线到会转弯的图:LangGraph 的三件套(状态、节点、边)

第零幕:只用 langchain_core,能做什么?缺什么才要 LangGraph?

小林学到这里,把 langchain_core 能干的都摸清了。他画了一张”能力边界图”:
一句话判断标准:
对照你已学的:
小林在这篇的顿悟起点就是:他早就开始用 LangGraph 了(create_agent 返回的就是 CompiledStateGraph),只是从没正式认识它。 这一章,就是揭开它的面纱。

开头的现象

小林用 create_agent 做出了”会记住、会干活的助手”。但他一直有个心结:create_agent 是个黑盒。 模型下一步要干嘛?循环到哪一步了?老板说”能不能让机器人干危险操作前先问我一句”——小林盯着 create_agent 的文档,找不到”中途插一手”的开关。 他做了一个让他头皮发麻的实验:print(type(agent))——
小林愣住了。create_agent 返回的不是”模型”,不是”链”,是一张 LangGraph 的编译状态图! 他想起自己一直躲着没学的那个叫 LangGraph 的东西——原来第 10 篇的”鞍具”底下,藏着一整张图。

第一幕:小林解剖了 create_agent——一张 4 节点 4 边的图

小林用 agent.get_graph() 把 create_agent 拆开了。他看到的东西让他倒吸一口凉气:
画成图,就是一张”会转弯的图”:
小林盯着这张图,第 4 篇、第 10 篇的知识全部串起来了:“原来 create_agent 内部就是第 10 篇我手写的那个’三步舞’循环——模型节点申请工具、工具节点执行、条件边决定’继续调还是收工’。官方把它画成了图,节点是函数,边是走向,条件边是’转弯的开关’。” 他还在 response_metadata 里看到了证据:模型返回的 stop_reasontool_use(“我要调工具”)还是 end_turn(“我说完了”)——那张条件边看的,就是这个开关。
想验证”create_agent 是一张图”吗?跑 10_agent.py 后用 agent.get_graph() 打印节点——你会看到 __start__ → model → tools → __end__tools → model 那个回环就是”自动循环”的物理证据。

第二幕:小林亲手搭了一张图——StateGraph 的四个零件

小林想:“既然 create_agent 是一张图,那我能不能自己搭一张?” 他翻到了 LangGraph 的核心类 StateGraph,发现搭图只需要四个零件:
小林看着输出 8,验证了一个关键机制:每个节点只返回”自己改的那一小块”({"count": ...}),LangGraph 自动把它合并进状态里。 这就是 LangGraph 和普通链(|)的本质区别:LCEL 的 | 是”单向流水线”,数据流过去就完事;StateGraph 是”共享状态”——每个节点能读能写整个状态,还能根据状态决定走哪条边。
想验证”节点只改自己的”吗?跑 11_langgraph.py 第一部分——两个节点各改各的(+1、*2),LangGraph 自动合并,最后输出 8。你把 node_b 改成返回 {"count": 999} 试试——它会覆盖,说明”后写的节点覆盖前写的”。

第三幕:条件边——流程会转弯了

小林搭完直线图,又试了”条件边”——让图根据状态决定走哪条路:
小林盯着 5 → 450 → 150,明白了条件边是干嘛的:add_conditional_edges("check", decide, {"big": "big", "small": "small"}) 的意思是——从 check 节点出发,调用 decide 函数看结果,结果 "big" 就走 big 节点,"small" 就走 small 节点。 这就是流程图里的”菱形判断框”。 他忽然想到 create_agent 里那张图的”条件边”:model 节点上的条件边不也是看 tool_calls 决定走 tools 还是 END 吗? 他自己搭的图和 create_agent 是同一套机制。
想验证”转弯”吗?跑 11_langgraph.py 第二部分——count=5 走 small(期望 4),count=50 走 big(期望 150)。把 decide 的判断条件从 > 10 改成 > 100,再跑 50——它就走 small 了。

🔧 技术细节:这一章涉及的关键类和签名

StateGraph——搭图的骨架(langgraph.graph)
② 节点函数签名——每个节点收到 state,返回”自己改的部分”
想验证吗?agent.get_graph() 打印节点和边——你会看到 __start__ → model → tools → __end__ 和回环 tools → model

结论(小林用一天换来的)

LangGraph 的基础 = 状态 + 节点 + 边:StateGraph(状态结构) 建图,add_node 加处理函数,add_edge/add_conditional_edges 连线(条件边让流程会转弯、会循环),compile() 编译成可调用对象。 每个节点只返回”自己改的部分”,LangGraph 自动合并进状态——这就是”图”和”链”的本质区别:链是单向流水线,图是共享状态 + 会转弯。

复现信号:什么时候你会想起这一章

  1. 想让流程”会转弯”(根据状态走不同分支)——add_conditional_edges
  2. 想让流程”循环”(模型↔工具)——条件边回环(tools → agent)。
  3. 只是固定问答(RAG)——别上 LangGraph,第 09 篇的 | 链够用。
小林搭好了会转弯的图,但他还不会用它做 Agent。他决定照着 create_agent 的解剖图,亲手搓一个模型↔工具的循环——翻到第 12 篇:手搓 create_agent