banner
NEWS LETTER

LangGraph

Scroll down

一、基础理解(必考)

1) LangGraph 是什么?与 LangChain 的关系?

标准回答:
LangGraph 是在 LangChain 之上、专注于 Agentic Workflow(智能体工作流)有向图(DAG/状态机)框架。它用 State / Node / Edge / Graph 来描述复杂多轮流程与分支,并提供持久化(persistence/checkpointer)以支持长对话、人工介入、容错与“时间旅行”。而 LangChain 更像是组件库与可组合的可运行单元(Runnables/Chains/Agents/Tools)。在复杂流程里,我会用 LangGraph 编排整体流转,用 LangChain 提供 LLM 与工具能力。(LangChain AI, LangChain Blog)

要点清单:

  • LangGraph:编排/状态机;LangChain:组件库/执行单元。

  • 强项:复杂分支、多 Agent、状态持久化与人工干预。(LangChain AI)


2) 为什么用 Graph,而不是简单 Chain?

标准回答:
Chain 线性好上手,但分支、循环、并发依赖一复杂就难维护;Graph 把“谁先跑、跑完去哪儿、遇到条件怎么分路”全部显式化,可读、可测、可控,特别适合多 Agent 协作、工具调用决策、审阅环节(HITL)。LangGraph 还内置**条件边 add_conditional_edges、顺序片段 add_sequence**等语义化原语。(LangChain AI)


3) 核心组件有哪些?(State / Node / Edge / Graph / Persistence)

标准回答(一句话版):

  • State:共享数据结构(可用 TypedDict/Pydantic/dataclass 定义),节点读写都基于它;支持Reducer合并多节点更新。

  • Node:函数或 Runnable,输入 State、输出部分 State 更新。

  • Edge:决定流转,含普通边与条件边

  • Graph:把节点和边编成可编译/可执行的工作流。

  • Persistence:通过 checkpointer 为每步打快照到 thread,支持长记忆、人工中断/恢复、时间回溯与容错。(LangChain 文档, Medium, LangChain AI)


4) 什么是 Agentic Workflow?举例

标准回答:
Agentic Workflow 是把智能体的思考-行动-反思过程用可控的图结构表达:例如“研究员 Agent→工具检索→验证 Agent→人审→汇总 Agent”,每步的输入输出与路径选择都由 State/Edge 管理,并可在任一点中断等待人审后继续。(LangChain AI)


二、机制与实现(进阶)

1) State 与传统 Memory 有何不同?

标准回答:
传统 Memory 多是会话“黑盒”拼接;LangGraph 的 State 是显式模式化的应用状态,可按键(渠道)细粒度更新,并用 Reducer 决定合并策略(覆盖/累加/去重)。这让可观测性、可测试性、并发合并成为一等公民。(LangChain 文档, Medium)

极简定义示例:

1
2
3
4
5
6
from typing import TypedDict, Annotated
import operator

class State(TypedDict):
# 消息按列表累加(多节点并发写入也能合并)
messages: Annotated[list, operator.add]

(TypedDict/Reducer 的思路见官方与实践文章。)(LangChain 文档, Medium)


2) 如何添加节点?节点如何收/返数据?

标准回答:
StateGraph(StateSchema) 创建图;add_node(name, fn) 注册节点;节点函数 接收 State返回部分 State 更新add_edge/ add_sequence 定义流转;编译后 app.invoke(input, config) 执行。

1
2
3
4
5
6
7
8
9
10
11
12
from langgraph.graph import StateGraph, END

builder = StateGraph(State)
def draft(state: State): return {"messages": ["drafted"]}
def review(state: State): return {"messages": ["reviewed"]}

builder.add_node("draft", draft)
builder.add_node("review", review)
builder.add_edge("draft", "review")
builder.add_edge("review", END)
app = builder.compile()
app.invoke({"messages": []})

(API 语义参考文档。)(LangChain AI)


3) If-Else 条件分支怎么做?

标准回答:
add_conditional_edges(start, router, mapping)router(state) 返回映射里的分支键。

1
2
3
4
5
6
def route(state: State):
return "approve" if state.get("score", 0) >= 0.8 else "revise"

builder.add_conditional_edges(
"judge", route, {"approve": "publish", "revise": "rewrite"}
)

(条件边是 LangGraph 的一等公民。)(LangChain AI, Medium, DEV Community)


4) 长对话记忆 / 循环执行如何实现?

标准回答:
依靠显式 State + Reducer保存上下文,并用 Edge 实现回边停止条件;对于超长会话与跨会话记忆,启用 checkpointer 将状态写入 thread,每次用同一 thread_id 继续。若需人审环节,用 interrupt 暂停并恢复。(LangChain AI)


5) 如何持久化执行状态?为何有意义?

标准回答:
compile 传入 checkpointer(如 MemorySaver/SqliteSaver),系统每个超步(super-step)都会快照到 thread,随后可回放、恢复、分叉试验,实现人机协同(HITL)容错时间旅行

1
2
3
4
5
from langgraph.checkpoint import MemorySaver  # 或 SqliteSaver(...)
cp = MemorySaver()
app = builder.compile(checkpointer=cp)
config = {"configurable": {"thread_id": "u123"}}
app.invoke({"messages": []}, config=config)

(持久化与线程语义见官方概念页与 JS 版文档说明。)(LangChain AI)


三、应用与思考(专家)

1) 多智能体系统如何用 LangGraph 表达?

标准回答(结构化):

  • 节点划分Researcher(检索/起草)→ Verifier(事实核验/引用补全)→ Synthesizer(结构化输出)。

  • 关键状态messagesfactscitationstools_logs;对 messages 采用累加 Reducer。

  • 边逻辑:Verifier 评分低于阈值→ 回到 Researcher;高于阈值→ Synthesizer。

  • HITL:在发布前 interrupt 等待人审。

  • 工具位:统一用 ToolNode 执行检索/计算工具,降低节点对工具适配成本。(LangChain AI)


2) 科学计算/实验流程自动化中,相比传统编排的优势?

标准回答:

  • 语义更贴近“推理-行动”:把 LLM 的决策、工具调用与验收环节显式化;

  • 细粒度可观测:State/Reducer 让每一步的输入输出可追溯;

  • HITL 与可回溯:checkpointer 支持“暂停-审阅-继续”和时间旅行

  • 复杂分支更自然:条件边/循环优雅表达实验分叉与失败回退。(LangChain AI)


3) 与状态机(State Machine)的相似之处?

标准回答:
二者都以状态 + 转移为核心:节点像“状态处理器”,边是“转移函数”,条件边对应“守卫条件”。不同在于 LangGraph 的状态可结构化/可合并,并内置快照/回放人审中断。(LangChain AI)


4) 可扩展性挑战与对策

标准回答:

  • 图规模增长:强约束命名与模块化子图;

  • 并发与一致性:为并发写入的键设计合适 Reducer(累加/去重/优先级);

  • 工具爆炸:收敛到 ToolNode + 统一工具接口;

  • 可观测性:事件日志+线程快照;

  • 团队协作:约定 State 模式与边命名规范,建立“设计评审”清单。(Medium)


四、追问速答(拉扯细节)

1) 能否与 LangChain 工具库结合?怎么做?

速答:
可以。推荐用 ToolNode:让工具调用成为一个标准节点,输入/输出都走 State(通常是 messages 通道),兼容 LangChain 的工具与 ReAct 策略。(LangChain AI, LangChain)


2) 支持异步/并发吗?

速答:
LangGraph 的图本身支持多起点依赖收敛(一个节点可等多个前驱完成)与并行分支;在实现层可用异步 Runnable/外部并行执行,最后通过 Reducer 合并到同一 State 键。(LangChain AI, Medium)


3) 节点失败时如何做容错?

速答(工程化建议):

  • 分层重试:节点内重试 + 图级回退边;

  • 幂等设计:节点按“输入 State→输出增量”保证可重放;

  • 持久化恢复:依赖 checkpointer 从最近快照恢复继续;

  • 人审兜底:关键节点前后放 interrupt。(LangChain AI)


4) 与 Prefect/Airflow 的差异与优势?

速答:

  • Prefect/Airflow 更偏批式/数据工程 DAG

  • LangGraph 专注 LLM/Agent 推理-行动回路(条件边、工具调用、HITL、对话记忆、时间旅行等是一等能力)。如要 ETL/调度选 Prefect/Airflow;要智能体流程选 LangGraph。(LangChain AI)


五、30 秒口播版(面试开场可直接说)

“我把 LangGraph 当作面向智能体的状态机。它在 LangChain 之上,用 State/Node/Edge 把复杂分支、循环和工具调用显式化;用 checkpointer 把每步状态快照到 thread,从而支持长记忆、人工中断/恢复与时间旅行。实现上我会用 add_node / add_edge / add_conditional_edges 编排流程、用 Reducer 合并并发写入;多智能体场景下把检索、验证、汇总拆成节点,低分回路重写,高分发布,并在关键点 interrupt 走人审。相比传统 DAG 编排,LangGraph 对 LLM 推理-行动链路的表达更自然、可观测也更强。” (LangChain AI)


六、加分点(可主动抛出)

  • 人-机协作:熟练使用 interrupt 做审批与回溯分叉。(changelog.langchain.com)

  • 工具调用最佳实践:统一 ToolNode,把工具当“副作用节点”。(LangChain AI)

  • State 设计:为并发量身定制 Reducer(累加/去重/优先级),并把关键指标(score、citations)单独成键,便于路由与审计。(Medium)

Support me with a coffee?

其他文章
目录导航 置顶
  1. 1. 一、基础理解(必考)
    1. 1.1. 1) LangGraph 是什么?与 LangChain 的关系?
    2. 1.2. 2) 为什么用 Graph,而不是简单 Chain?
    3. 1.3. 3) 核心组件有哪些?(State / Node / Edge / Graph / Persistence)
    4. 1.4. 4) 什么是 Agentic Workflow?举例
  2. 2. 二、机制与实现(进阶)
    1. 2.1. 1) State 与传统 Memory 有何不同?
    2. 2.2. 2) 如何添加节点?节点如何收/返数据?
    3. 2.3. 3) If-Else 条件分支怎么做?
    4. 2.4. 4) 长对话记忆 / 循环执行如何实现?
    5. 2.5. 5) 如何持久化执行状态?为何有意义?
  3. 3. 三、应用与思考(专家)
    1. 3.1. 1) 多智能体系统如何用 LangGraph 表达?
    2. 3.2. 2) 科学计算/实验流程自动化中,相比传统编排的优势?
    3. 3.3. 3) 与状态机(State Machine)的相似之处?
    4. 3.4. 4) 可扩展性挑战与对策
  4. 4. 四、追问速答(拉扯细节)
    1. 4.1. 1) 能否与 LangChain 工具库结合?怎么做?
    2. 4.2. 2) 支持异步/并发吗?
    3. 4.3. 3) 节点失败时如何做容错?
    4. 4.4. 4) 与 Prefect/Airflow 的差异与优势?
  5. 5. 五、30 秒口播版(面试开场可直接说)
  6. 6. 六、加分点(可主动抛出)