核心要点
LangChain(LCEL):用管道把 Prompt、模型、解析器、检索器等组件串成链,擅长线性或 DAG 式的单向数据流,写起来简洁、组合性强。
LangGraph:把 Agent 建模成一张图(状态机),节点是计算步骤、边决定流转,原生支持循环、条件分支、人在环与检查点持久化。
本质区别:LCEL 是无环数据流,难以优雅表达「反复调用工具直到完成」这类带回路与状态的控制流;LangGraph 专为有状态、可循环的 Agent 而生。
选型:简单 RAG/链式调用用 LangChain LCEL 即可;多步、需自我反思/重试、多 Agent 协作或要可恢复的复杂 Agent,选 LangGraph。
标准回答
两者定位不同LangChain 是通用 LLM 应用框架,核心表达层是 LCEL(LangChain Expression Language):用 | 把 Prompt、模型、输出解析器、检索器等可运行单元拼成「链」。它本质是一条单向的数据流,最适合线性或 DAG(有向无环图)式的组合——输入流过各节点产出结果,天然支持流式、批处理与异步。
但 Agent 的真实控制流往往带回路:调用工具 → 看结果 → 决定再调一次还是结束,可能循环很多轮,还要在中途暂停等人确认。这种「有状态 + 可循环 + 条件分支」的逻辑,用无环的 LCEL 表达会很别扭。LangGraph 的编排原理LangGraph 把应用建模成一个 StateGraph(状态图 / 状态机),三要素:
-State(共享状态):一个贯穿全程的状态对象(通常是带 schema 的 dict),每个节点读它、更新它。更新通过 reducer 合并(如消息列表用追加而非覆盖)。
- Node(节点): 一个函数或可运行单元,接收当前 State,返回对 State 的部分更新。节点就是「干活」的步骤,比如调模型、执行工具、做检索。
-Edge(边):决定执行完一个节点后去哪。 普通边固定指向下一个节点; 条件边根据当前 State 动态路由(例如「模型要求调用工具就去 tool 节点,否则去 END」)。正是条件边让图能形成循环。
运行时,图从入口节点开始,节点更新状态、按边流转,直到走到 END。因为允许节点回到之前的节点,就自然实现了ReAct 式的工具调用循环 、自我反思与重试。 有状态带来的两大能力 - 检查点(Checkpoint)持久化 : 每步状态可落库,于是能暂停与恢复、做时间旅行调试、崩溃后续跑,也是 人在环(human-in-the-loop) 的基础——在敏感节点前中断,等人审批后再继续。
-多 Agent 编排:把每个 Agent 作为子图或节点,用主图协调(supervisor、群体协作等模式),共享同一份状态。 一句话:LangChain 解决「怎么把组件串起来」,LangGraph 解决「怎么编排有状态、会循环、可中断的 Agent」。二者同源且互补——LangGraph 节点内部仍可以用 LCEL 写链。
常见误区
⚠️ 常见踩坑
误以为 LangGraph 是 LangChain 的「升级替代」、要全面取代它——其实两者互补,简单链式场景 LCEL 更轻量,LangGraph 节点内部照样用 LCEL。另一个误区是用 LCEL 硬写带循环的 Agent,结果靠手写 while 循环和散落的全局变量管理状态,既难维护又无法持久化与恢复;这正是 LangGraph 用显式 State + 条件边要解决的问题。
追问
追问 1:LangGraph 的条件边(conditional edge)具体怎么实现循环?
条件边在节点执行后调用一个路由函数,该函数读取当前 State 返回下一个节点的名字(或 END)。以 ReAct 为例:agent 节点调模型后,路由函数检查模型输出——若包含工具调用就路由到 tools 节点,tools 节点执行完用一条普通边回到 agent 节点,于是形成「agent → tools → agent → ...」的循环;当模型不再要求调工具时,路由函数返回 END 跳出。循环的终止完全由 State 内容驱动,必要时再加最大步数等护栏防止死循环。
追问 2:State 在多个节点并发更新时如何避免冲突?
LangGraph 为 State 的每个字段定义 reducer(归约函数)来合并更新,而不是简单覆盖。默认是覆盖,但像 messages 这类字段会用「追加」reducer(如 add_messages),这样多个节点各自返回的消息会被合并进列表而非互相冲掉。当图有并行分支(fan-out/fan-in)时,各分支对同一字段的更新会通过 reducer 汇聚,保证结果确定且不丢更新;设计 State schema 时为每个会被多处写的字段选对 reducer 是关键。
追问 3:检查点(checkpointer)在生产环境怎么落地,人在环如何实现?
给编译后的图配置一个 checkpointer(开发用内存版,生产用 Postgres/Redis 等持久化后端),并为每次会话传一个 thread_id。每执行一步,完整 State 会以该 thread 为键存盘,于是同一 thread 可随时恢复、回看历史、崩溃续跑。人在环则是在敏感节点前设置中断(interrupt before/after):图执行到此暂停并保存状态,把待确认内容返回给前端;人审批或修改后,用同一 thread_id 恢复执行,状态无缝衔接。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习