面试官问LangChain和LangGraph的区别,答不上来你就输了。这句话听起来像一句耸人听闻的标题,但背后其实是一个很实在的工程问题。很多开发者,包括一些已经用LangChain做过几个项目的朋友,被问到“LangGraph是什么,和LangChain什么关系”时,第一反应往往是“LangGraph?是LangChain的一个新模块吗?”。这个回答不能说错,但离面试官想听到的“理解深度”还差得很远。

真正的问题不在于你是否知道这两个库的名字,而在于你是否理解它们背后所代表的两种截然不同的范式,以及这种范式转换对于构建复杂AI应用意味着什么。LangChain帮你把积木(工具、模型、记忆)拼成一个能完成特定任务的静态机器人;而LangGraph则要求你思考,如何设计一个能让多个机器人(或一个机器人的不同状态)协同工作、循环决策、处理分支与聚合的动态系统。前者是“组装”,后者是“编排”。

如果你只是把LangGraph当作一个“带循环的Chain”或者“高级版的SequentialChain”,那你就错过了它最核心的价值。这就像把一辆具备自动驾驶和路径规划能力的智能汽车,仅仅当作一辆“能自动换挡的手动挡汽车”来用。今天,我们就彻底拆开这两个概念,让你下次被问到时不至于语塞,更能真正理解该在什么时候、用什么工具。

1. 从“链”到“图”:思维模式的根本转变

要理解区别,必须先回到原点:我们为什么需要这些框架?根本目的是为了降低构建基于大语言模型(LLM)应用的复杂度。LangChain的出现,正是为了解决早期“裸调用”API时面临的几个典型问题:如何串联多个步骤(提示词、调用模型、解析输出、调用工具)?如何管理对话历史(记忆)?如何接入外部工具和知识?

LangChain的答案非常直观: “链”(Chain) 。它将一个复杂的任务分解为一系列可预定义的、顺序执行的步骤。比如一个经典的检索增强生成(RAG)流程: 检索 -> 组织上下文 -> 调用LLM -> 解析输出 。用LangChain,你可以轻松地用一个 RetrievalQA 链把这个流程固化下来。它的思维模式是 流程化、管道化的 。你定义好输入、每个环节的处理逻辑,以及最终的输出,它就像一条流水线,数据从一端进去,结果从另一端出来。

这种模式解决了从0到1的问题,让开发者能快速搭建可工作的原型。但是,当任务变得复杂,不再是简单的直线流程时,“链”的局限性就暴露出来了:

  • 缺乏循环 :无法根据中间结果决定是否重复某些步骤(例如,验证答案质量,不达标则重试)。
  • 缺乏分支 :无法根据条件走向不同的处理路径(例如,用户问的是天气还是订餐,需要调用不同的工具链)。
  • 缺乏状态管理 :复杂的多轮交互中,状态(如用户目标、已执行步骤、临时结果)难以在多个链之间优雅地传递和共享。

这时,LangGraph登场了。它引入的核心抽象是**“图”(Graph)**。在图论中,图由节点(Node)和边(Edge)组成。在LangGraph中:

  • 节点 :可以是一个LLM调用、一个工具调用、甚至是一个自定义函数。本质上,它是一个执行单元。
  • :定义了节点之间的流转逻辑。它决定了上一个节点执行完后,下一步该去哪个节点。这里的关键是,边可以是有条件的。

这种思维模式从 流程驱动 变成了 状态驱动 。你不再只关心“下一步做什么”,而是关心“在当前这个系统状态下,根据某些条件,系统应该迁移到哪个新状态,并执行哪个节点”。这直接对应了那些复杂的、非线性的AI智能体(Agent)工作流。

1.1 一个比喻:脚本与状态机

想象你要编写一个游戏NPC的对话逻辑。

  • LangChain(链) 就像写一个电影脚本:第一句台词是什么,玩家回答A则说第二句,回答B则说第三句……脚本是预先写死的。虽然也能处理分支(用 RouterChain ),但整体结构是静态的、向前推进的。
  • LangGraph(图) 就像设计一个NPC的 状态机 :NPC有“空闲”、“询问”、“思考”、“执行任务”、“汇报”等状态。触发状态迁移的条件可以是玩家的输入、内部计时器、或任务完成情况。从“询问”状态,根据玩家回答的内容(条件边),可以跳转到“思考”或直接到“执行任务”。状态机是动态的、可循环的(例如“思考”后可能再次回到“询问”以澄清问题)。

后者显然能表达更复杂、更智能的交互行为。这就是思维模式的升级。

1.2 核心差异对比表

让我们把最核心的差异浓缩到一张表里,这能帮你快速建立认知框架:

维度 LangChain (链式思维) LangGraph (图式思维)
核心抽象 链(Chain)、工具(Tool)、记忆(Memory) 图(Graph)、节点(Node)、边(Edge)、状态(State)
流程控制 顺序执行为主,支持有限分支(如Router) 支持任意复杂度的 循环、条件分支、并行与聚合
状态管理 上下文在链间传递,但缺乏统一的、结构化的状态容器。 拥有一个中心化的、强类型的**状态(State)**对象,贯穿整个图执行生命周期。
适用场景 线性任务、检索问答(RAG)、文档处理、简单工具调用。 智能体(Agent) 、多角色协作、复杂决策流程、需循环验证的任务、长时运行工作流。
心智模型 组装流水线 :把各个处理环节按顺序连接起来。 编排交响乐 :指挥多个乐手(节点)何时入场、如何协作、何时重复乐章。

理解了这个根本区别,我们就能明白,LangGraph不是来替代LangChain的,而是来补全LangChain生态中那块关于“复杂流程控制”的拼图。事实上,LangGraph深度集成在LangChain生态中,它使用LangChain的许多组件(如LCEL、Tools、Chat Models),但提供了一套更强大的编排框架。

2. LangGraph的核心武器:状态(State)与循环

如果说“图”是LangGraph的骨架,那么“状态”就是它的血液和灵魂。这是LangGraph与普通“可循环链”最本质的区别。

在LangChain中,信息通常通过一个字典(dict)在链的各个步骤间传递。这个字典没有固定的结构,你需要自己约定键名。而在LangGraph中, 状态是一个定义清晰、类型明确的Pydantic模型 。你需要在构建图之前,就声明这个状态对象里包含哪些字段,比如: messages (对话历史), question (当前问题), intermediate_steps (已执行的工具调用), agent_scratchpad (智能体的思考过程)等等。

这个状态对象在整个图的执行过程中是唯一且共享的。每个节点(Node)都是一个函数,它接收 整个状态 作为输入,然后 返回一个对该状态的更新 。这个“更新”通常是一个字典,指明要修改状态的哪些字段。LangGraph的运行时负责将这些更新安全地合并到中心状态里。

2.1 状态驱动如何工作:以ReAct智能体为例

一个经典的ReAct(Reasoning + Acting)智能体工作流在LangGraph中是如何实现的?

  1. 定义状态 :状态包含 messages (对话列表)和 intermediate_steps (工具调用及结果列表)。
  2. 定义节点
    • agent 节点:读取状态中的 messages intermediate_steps ,调用LLM。LLM会思考(Reason)下一步该做什么:是直接回答,还是调用某个工具(Act)?它的输出会被追加到 messages 中。
    • tools 节点:如果 agent 节点决定调用工具,流程就会根据条件边进入 tools 节点。该节点执行具体的工具调用,并将工具结果记录到 intermediate_steps 中。
  3. 定义边与循环
    • agent 节点出来后,会有一个 条件边 (Conditional Edge)来检查LLM的输出。如果输出包含工具调用,则前往 tools 节点;如果输出是最终答案,则前往结束节点。
    • tools 节点执行完毕后,它的边通常指向 agent 节点。这意味着将工具执行结果(更新到状态后) 再次交给LLM去分析 ,形成“思考->行动->观察->再思考”的循环。
  4. 执行 :你初始化一个状态(例如,包含用户问题的 messages ),然后启动图。图会在 agent tools 节点之间循环,直到LLM决定给出最终答案,条件边将其导向终点。

这个流程完美体现了状态驱动的威力: 循环的终止条件不是预先设定的步骤数,而是由运行时的状态(具体说是LLM的输出内容)动态决定的。 这是用静态的“链”很难优雅实现的。

2.2 条件边:让图“活”起来的关键

条件边是LangGraph流程控制灵活性的源泉。它不是一个简单的“是/否”分支,而是一个函数,它读取当前状态,然后返回下一个要执行的节点 的名称

# 伪代码示例:条件边函数
def should_continue(state: State) -> Literal["tools_node", "__end__"]:
    last_message = state.messages[-1]
    if "Action:" in last_message.content:
        return "tools_node" # 去执行工具
    else:
        return "__end__" # 结束

这种设计让你可以实现极其复杂的逻辑,比如:

  • 多智能体路由 :根据问题领域,将任务路由给不同的专家智能体节点。
  • 验证与重试 :在一个“验证”节点检查输出质量,不合格则返回“重生成”节点。
  • 人工审批节点 :在关键步骤后,流向一个“等待人工输入”的节点,根据人工输入决定后续路径。

3. 从“知道”到“用好”:实战场景与选型指南

理解了原理,最终要落到实战。你该如何选择?下面这个决策框架,可以帮你避免“手里有把锤子,看什么都像钉子”。

3.1 什么时候用LangChain就够了?

如果你的任务满足以下特征,优先使用LangChain,它的开发体验更直接、更成熟:

  • 线性流程 :任务步骤固定,顺序执行,没有或很少有循环和动态分支。典型例子:文档加载->分割->向量化->存储(索引流程);用户提问->检索上下文->生成回答(简单RAG)。
  • 快速原型 :你需要以最低成本验证一个想法,LangChain丰富的集成和链模板能让你几分钟内搭出可运行的系统。
  • 简单工具调用 :只需要让LLM根据情况调用1-2个工具,且调用后流程即结束,不需要基于工具结果进行多轮次推理。
  • 认知负担 :你或你的团队刚刚接触LLM应用开发,应先掌握“链”这一基础范式。

行动建议 :直接从LangChain的 LCEL (LangChain Expression Language)开始。它用管道符 | 连接组件,语法简洁,是构建链的现代方式。例如,一个简单的链: prompt | llm | output_parser

3.2 什么时候必须考虑LangGraph?

当你的需求触及以下任何一点时,就应该认真评估LangGraph:

  • 需要智能体(Agent) :这是LangGraph的“主场”。任何需要让LLM自主规划、调用工具、并根据结果持续思考直到任务完成的应用,如图表生成、复杂数据分析、自动化客服。
  • 流程中有显式循环 :比如,生成一段代码后需要自动执行测试,测试失败则返回修改代码,直到通过。这种“生成-验证”循环是图的天然应用场景。
  • 复杂的状态依赖 :后续步骤严重依赖前面多个步骤产生的、结构复杂的中间结果,并且这些结果需要被集中管理。
  • 多角色协作工作流 :模拟一个团队,有“策划”、“写手”、“校对”等不同角色的AI节点,任务在它们之间流转、审核、修改。
  • 长时运行与持久化 :LangGraph的设计更易于将执行状态序列化保存到数据库,中断后可以从某个节点恢复。这对于运行时间可能很长的自动化任务非常重要。

行动建议 :从LangGraph官方提供的 模板 开始,比如 create_react_agent 。不要从零开始画图。先理解模板中的状态定义、节点函数和边逻辑,然后在此基础上修改。这比从空文件开始要高效得多。

3.3 一个常见的误区:用LangChain硬拗复杂流程

很多开发者最初会用LangChain的 SequentialChain RouterChain 甚至写自定义链来模拟复杂逻辑。这很快就会导致代码变成“面条式”的,充斥着大量的 if-else 和手动状态传递,难以调试和维护。

例如,你想实现“如果答案置信度低,则换一种方式重新生成”。在LangChain中,你可能需要在一个 CustomChain 里写判断逻辑,并手动管理中间变量。而在LangGraph中,你只需要增加一个“评估置信度”的节点和一条指向“重生成”节点的条件边即可,状态是自动流转的。

当你的代码里开始出现“如何把上一步的结果传递给三步之后的那个链”这种问题时,就是该考虑切换到LangGraph的时候了。

4. 面试与工程:超越概念,看到本质

回到最初的面试题。一个出色的回答,不应该停留在功能列表的对比上,而应该展现你对问题域和解决方案演进的洞察。

4.1 面试回答框架

你可以这样组织你的回答:

  1. 定性 :“LangChain和LangGraph都是LangChain生态中用于构建LLM应用的核心框架,但它们解决的是不同复杂度层级的问题。”
  2. 核心比喻 :“LangChain像是提供标准化零件和装配手册,让我们能快速组装出一台功能固定的机器(链)。而LangGraph则提供了绘制电路图的能力,让我们能设计出一台可以根据内部信号(状态)自动切换工作模式、甚至包含反馈循环的智能机器(图)。”
  3. 关键差异点
    • 范式 :LangChain是 链式/管道式 ,LangGraph是 图式/状态机式
    • 控制流 :前者主要是顺序,后者原生支持 循环、条件分支、并行
    • 状态管理 :前者是隐式、分散的上下文传递;后者是显式、集中、强类型的 状态对象
    • 首要应用场景 :LangChain用于 线性任务和RAG ;LangGraph用于 智能体(Agent)和复杂多步工作流
  4. 关系 :“LangGraph并非替代LangChain,而是构建在LangChain的组件(如LCEL、Tools)之上,专注于解决更复杂的流程编排问题。可以理解为,LangChain解决了‘单兵作战’的问题,而LangGraph解决了‘多兵种协同作战’的指挥问题。”
  5. 选型建议 (体现工程思维):“在具体项目中,我通常会先评估流程的复杂性。如果是简单的问答或转换,直接用LangChain的LCEL,开发效率高。一旦流程中出现‘根据结果决定是否重复’、‘需要多个AI角色协作’或‘状态管理变得混乱’的迹象,我就会毫不犹豫地引入LangGraph来重构,从长远看,它的清晰度和可维护性优势巨大。”

4.2 工程落地的深层思考

在实际工程中,选择LangGraph还意味着要处理一些新问题:

  • 调试复杂性 :图的执行路径是动态的,调试不能只靠看日志。需要善用LangGraph的 可视化工具 追踪 功能,理解每一步的状态变迁。
  • 状态设计 :如何设计状态模型是一门学问。字段过多会导致冗余和混乱,过少又无法支撑流程。这需要结合业务逻辑进行精心设计。
  • 持久化与恢复 :对于长时运行的任务,如何将状态图保存到数据库,并在故障后从断点恢复,是生产部署必须考虑的问题。LangGraph的 Checkpointer 抽象就是为此而生。
  • 稳定性与成本 :循环意味着可能多次调用LLM和工具,必须设计 明确的终止条件 (如最大迭代次数)和 异常处理 ,避免无限循环或成本失控。

所以,当你决定采用LangGraph时,你不仅仅是选择了一个库,更是选择了一种以“状态”和“流程”为中心的系统设计思想。它要求开发者从更高的维度去思考AI应用的行为逻辑,而这,正是从“调用API”走向“构建智能系统”的关键一步。

下次面试官再问起这个问题,你完全可以反过来问他:“您更关心的是它们概念上的区别,还是我们在实际项目中如何根据业务逻辑的复杂度,在这两者之间做技术选型的决策过程?” 这个问题本身,就证明了你的思考已经超越了工具层面,进入了工程架构的领域。而这,才是面试官真正想听到的东西。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐