上一篇按社区和企业过了七个框架,最后落到这一套——因为”触发中断与状态续跑”做成了底层一等公民能力,公开写过的案例也最多。选完之后,桌上还是两个名字。不少人仍按几年前的印象,把它们当成并列的两个框架,觉得学一个就够,或者先挑那个上手快的。1.x 之后不是这个关系。
手搓系列把循环写完了。模型只负责说出下一个工具,压缩、护栏、停住、续跑都是挂在循环外面的。换成框架,这些东西还在,有的框架替你写了,有的只是换了个位置。要对上号,得先分清这一套里谁在底下跑循环,谁是平时伸手去拿的那个入口。这篇把这层关系说清楚。图怎么画、state 怎么长、停住之后怎么续,后面各有一篇,这里不展开。
Table of contents
Open Table of contents
一、1.x 之后叠在一起了
0.x 那几年,两者是分开卖的:LangChain 管 Chain 和 AgentExecutor,LangGraph 管把图画开。1.0 之后这套分法不成立了。Chain、AgentExecutor、langgraph.prebuilt.create_react_agent 都收进了 create_agent,这篇也不再用那些叫法。
手搓里那个 while,在 LangGraph 里是一张图,节点之间传一份 state。每走完一步可以落一份 checkpoint,对手搓里按 run_id 写审计,但用途窄得多——只保证能恢复,不拿去事后检查。LangChain 坐在这层上面。init_chat_model 对手搓里 OpenAI(...) 那一行,@tool 从函数签名出 schema,create_agent 把”问模型 → 执行 → 回灌”画成一张现成的图,压缩和护栏挂在 middleware 上。它返回的就是 CompiledStateGraph,和自己把图画完再 compile 拿到的是同一种东西。
日常一个循环,走 create_agent 就够。图画开,只是换了入口,底下还是同一套运行时。第三节再说什么时候值得画。
二、公司和它认的两件事
仓库在 GitHub 的 langchain-ai 下,langchain 和 langgraph 并列。Harrison Chase 2022 年底从个人账号推出这个包,2023 年初和 Ankush Gola 成立 LangChain, Inc.。LangGraph 是 2024 年初另起的运行时,当时听到最多的是:原来的 langchain 上手很快,真要改、真要上线就别扭。后来开发又并回去了,langgraph 仓库近来很少动,改动都在 langchain 里。
他们还做 LangSmith,卖观测、评测和部署。框架本身开源,不买也能跑;买了 LangSmith,也不等于项目里用了 LangGraph。
他们自己的回顾里,设计就守两件事。一件是可控:prompt 不藏在框架里,循环的形状也不替你写死,state 看得见,停住就是调用 interrupt()。公开 API 尽量接近普通 Python,他们原话是,最大的竞争对手是不用框架。对以后的模型长什么样,他们也少做假设,只认眼下已经成立的三条——慢,会失败,输入输出都是开放的。另一件是耐用。一次跑常常按分钟计,走到第九分钟崩了,不能整段重来,于是按步落盘,写法借鉴 Pregel。崩溃了要恢复,等人确认也要停住,用的是同一套 checkpoint;手搓里”停住再续”和”进程退出”在这里并成了一件事。
create_agent 是后来补上去的。那两件事还在底下,只是默认不把图画给你看。
企业盯着的,也是手搓写上线时最难办的那一段:人确认之后进程可以退出,过一会儿还从同一份状态接着跑;停住时打得开 state;换模型不必换编排。上一篇列过公开写过这些的名字。任务短、没有工具、一次请求就结束,官方自己也说,大概用不上任何框架。
三、什么时候把图画开
create_agent 那张默认的图,人确认用 HumanInTheLoopMiddleware 就行,指定哪些工具执行前必须停住,底下还是 interrupt()。图你看不见,但图在。
默认那张不够用的时候,再自己画 StateGraph。下一步不再是”有 tool_calls 就执行”,而要按 state 走不同的边——比如下雨走一条、没确认走另一条。一次要并行几路、数量得到运行时才知道——手搓里的轮内并发,图上换成 Send,条件边返回一组,每一项写明去哪个节点、带哪份输入。一张已经编好的图要嵌进更大的图里当节点,这叫子图,可以单独落盘,也可以只用父图那一份。还有一种情况是内置 middleware 兜不住,而你希望那一层出现在图上,不要藏在钩子里。
值不值得画开,看停住的时候想不想看见那一层。看得见,才能问现在 state 是什么、下一步走哪;看不见,就只能去翻 middleware 的文档。
四、这一套里先学什么
建议先把底下那层看明白——先把那个 while 画成两个节点,再接上停住再续,关了进程还能续——再把 create_agent 当成默认写法。反过来进门也能跑,只是一旦停不住、state 丢了、或者节点重跑订了两单,没有这几个词就很难定位。
RAG 那条线(loader、vectorstore、retriever)跟 agent 循环并行,不是学这一套的前置。supervisor 和 swarm 是多个 agent 互相交手,一个循环还没吃透时不必碰。@task 和 @entrypoint 是函数式 API,用装饰器写步骤、不画图,知道有这种写法即可。
动手之前还剩一个问题。第二节那句「任务短、没有工具、一次请求就结束」,说的是这一套再顺手,也有不该用的时候。下一篇把它拆成三条边界,再对照手搓系列,把框架替你做了什么、又要你付出什么逐项算清。