LangChain 1.0 和 LangGraph 到底谁封装谁?我把 pip 依赖表扒了一遍,答案全在里面
一句话先给结论:是 LangChain 封装了 LangGraph,不是 LangGraph 封装 LangChain。2025 年 10 月 LangChain 1.0 发布之后,
create_agent底层跑的就是 LangGraph。我实测装了一遍依赖、看了一遍返回类型,证据全在 pip 的依赖表里,文末给面试三句金句和选型表。
一、为什么这个关系总是被搞反
后台收到不少私信问「LangGraph 是不是变成了 LangChain 的封装」,我一开始没当回事,直到自己也差点说反。搞反的原因有三个:
- 名字前缀:LangGraph 挂着 Lang 前缀,看起来像 LangChain 的附属品;
- 同一家公司:LangGraph 就是 LangChain 团队写的,大家默认「先有的包是底层」;
- 一次搬家事件被误读:
create_react_agent从 langgraph 搬进了 langchain,很多人把「功能从 A 移到 B」读成了「A 变成了 B 的封装」。
方向恰恰相反。这篇文章用三条实测证据把这事说死。
二、三年演进时间线:关系不是一天变成这样的
| 时间 | 事件 | 当时的定位 |
|---|---|---|
| 2022.11 | LangChain 诞生 | LCEL 链式编排 + AgentExecutor,线性串联 |
| 2024.01 | LangGraph 发布 | 图编排(StateGraph、节点、条件边、循环),目标是取代 AgentExecutor |
| 2025.07 | DeepAgents 发布 | 建在 agent 之上的「深度任务」harness,思路来自 Claude Code |
| 2025.10 | LangChain 1.0 + LangGraph 1.0 同步发版 | create_agent明确构建在 LangGraph 之上,LangGraph 退回纯运行时定位 |
注意最后一行:LangChain 1.0 把旧功能挪进langchain-classic,整个包聚焦在create_agent+ middleware 上——而create_agent官方原话是 "We built this implementation on top of langgraphto take advantage of the underlying agent runtime"。
三、最容易被误读的「搬家事件」
LangGraph 1.0 的唯一显著变化是:langgraph.prebuilt模块废弃,create_react_agent这个预制件搬进了langchain.agents,变成create_agent。
很多人看到「功能从 langgraph 移到 langchain」,就得出「langgraph 变成了 langchain 的封装」——方向完全反了:
以前:langgraph.prebuilt.create_react_agent ← agent 预制件住在 langgraph 家 现在:langchain.agents.create_agent ← 预制件搬进了 langchain 家 但发动机始终是 langgraph,没换过搬完之后,LangChain 这层壳底下跑的还是 LangGraph。预制件搬家 ≠ 发动机搬家,这是理解整个关系的关键。
四、实测:证据全在 pip 依赖表里
光说概念没用,我直接装了最新的包(langgraph 1.2.12 / langchain 1.4.3 / deepagents 0.7.20),用importlib.metadata把依赖关系扒出来:
import importlib.metadata as md for p in ['langgraph', 'langchain']: reqs = [str(r) for r in md.requires(p) or []] print(p, [r for r in reqs if 'langgraph' in r.lower() or 'langchain' in r.lower()])实测输出:
langgraph 依赖 -> ['langchain-core<2,>=1.4.7', 'langgraph-checkpoint...', 'langgraph-prebuilt...', 'langgraph-sdk...'] langchain 依赖 -> ['langchain-core...', 'langgraph<1.3.0,>=1.2.11', 'langchain-openai', 'langchain-anthropic', ...]看清楚这两行:
- langgraph 不依赖 langchain——它只依赖 langchain-core(基础类型)和自己家的 checkpoint/prebuilt/sdk;
- langchain 依赖 langgraph(>=1.2.11)——实锤,被依赖的是底层。
证据二:返回类型。用create_agent创建一个 agent,看它返回什么:
from langchain.agents import create_agent agent = create_agent(model="ollama:qwen3:0.6b", tools=[], system_prompt="hi") print(type(agent)) # <class 'langgraph.graph.state.CompiledStateGraph'>类型名里的 module 是langgraph.graph.state——create_agent返回的就是一个 LangGraph 编译图。
证据三:LangGraph 裸图独立可跑。不写任何 agent 逻辑,纯图:
from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict class S(TypedDict): text: str def node_a(state: S): return {"text": state["text"] + "A"} def node_b(state: S): return {"text": state["text"] + "B"} g = StateGraph(S) g.add_node("a", node_a); g.add_node("b", node_b) g.add_edge(START, "a"); g.add_edge("a", "b"); g.add_edge("b", END) print(g.compile().invoke({"text": ""})) # {'text': 'AB'}PyPI 官方描述原话:"LangGraph is built by LangChain Inc, the creators of LangChain,but can be used without LangChain"。
五、现在的完整分层
把三条证据合起来,2026 年的分层就是一张图:
DeepAgents 规划 / 文件系统 / 子 agent / skills,强观点 harness ↓ 依赖 LangChain create_agent + middleware,标准 agent 抽象 ↓ 构建在其上 LangGraph 图运行时:持久化执行、streaming、checkpoint、human-in-the-loop ↓ 共享基础类型 langchain-core Message、Tool 等基础抽象记忆方法只有一句:封装方向永远是高层包低层——DeepAgents 包 LangChain,LangChain 包 LangGraph。
六、面试怎么答(三句金句)
面试官问「LangChain 和 LangGraph 什么关系」时,按这三句答:
- 关系句:「方向是 LangChain 封装 LangGraph,不是反过来。同一家公司,但 LangGraph 可以脱离 LangChain 独立用——单独
pip install langgraph就能跑。」 - 演进句:「
create_react_agent从 langgraph.prebuilt 搬进了 langchain.agents,社区使用习惯收敛到标准 agent loop,LangGraph 退回纯运行时,专注持久化执行和 HITL。」 - 选型句:「简单工具调用用
create_agent;要精确控制流程直接写 LangGraph 图;长周期多步任务用 DeepAgents。」
七、选型结论表
| 场景 | 用什么 | 理由 |
|---|---|---|
| 标准 tool-calling agent | langchain.agents.create_agent | 最快,middleware 可定制 |
| 精确控制流程(分支、审批、确定性步骤混排) | 直接写 LangGraphStateGraph | 图编排的原生能力 |
| 长周期多步任务(deep research、代码类) | DeepAgents | 自带规划、文件系统、子 agent |
| 纯工作流,无 LLM 决策 | LangGraph 裸图或普通代码 | 别为了用框架而用框架 |
写在最后
这个关系的判断其实不靠记忆,靠一条可验证的规则:看依赖表。被依赖的是底层,封装的是上层。下次再有新的 Lang 系包出来,先pip show一下依赖,方向立刻清楚。
如果这篇文章帮你理清了关系,点个收藏;对分层有不同理解,欢迎评论区交流。
原创声明:本文为原创文章,实测数据基于 langgraph 1.2.12 / langchain 1.4.3 / deepagents 0.7.20,转载请注明出处。