基础(概念与核心机制)
1. LangGraph 是什么?与 LangChain 的关系?适用场景?
LangGraph 是 LangChain 之上的图式(graph-based)智能体与工作流框架,用节点(Node)+共享状态(State)来组织分支、循环和多步代理;适合需要可控性、可靠性与复杂流程的应用(而非简单串链)。
2. 什么是 StateGraph / State?Reducer 有什么用?
StateGraph 是“节点读共享 State、写 Partial”的图。每个 state key 可声明 reducer,用于聚合并行分支的更新(如把多条消息 append 到同一列表)。
3. 消息通道与 add_messages 有何特别之处?
消息是高频场景,LangGraph内置 add_messages reducer 与 MessagesState,可智能合并/去重消息,甚至支持 RemoveMessage 做消息撤回/修订。
4. 边的类型:固定边 vs 条件边 vs Command?

•	固定边:顺序执行 add_edge("A","B")
•	条件边:由函数(可LLM驱动)路由到不同后继
•	Command:同时更新状态并跳转(含跨到父图/其他子图的跳转)

适用:多智能体移交时更偏向 Command;仅路由用条件边。

5.	并行是如何实现的?什么是 super-step?

当路由函数返回多个后继时,这些节点在同一 super-step 并行执行;常见范式是 map-reduce:平铺子任务并行,聚合器用 reducer 合并。

进阶(人参与持久化、工具、编排)
6. Human-in-the-Loop 怎么做?interrupt 有何作用?
用 interrupt 在节点内(动态)或 interrupt_before/after(静态)暂停图并等待人审;依托持久化可无限期挂起与恢复,常用于工具调用审批/结果编辑。
7. 为什么 LangGraph 强调持久化(Checkpointer)?
编译图时接入 Checkpointer 会在每个 super-step 自动保存检查点到 thread,从而支持故障恢复、时间旅行、长期记忆与人审;官方提供 SQLite/Postgres 等实现。
8. ToolNode 与工具调用的最佳实践?
ToolNode 是预置节点:把 LLM 产生的 tool-call(名/参)映射到本地函数并执行;也可用预置的 agent(如 create_react_agent)循环调用工具直到停止条件。
9. Orchestrator-Worker(扇出/扇入)如何建模?
用 Send API 动态创建 worker 分支处理子任务(各自有子状态),其输出写入共享 key,主编排器汇总后产出结果——典型并行摘要/验证/投票场景。
10. 子图(Subgraph)有什么用?如何跨图跳转?
大图拆成可复用的子图,在子图内部可用 Command(graph=Command.PARENT) 跳回父图或其它子图,适合复杂协作/多代理编排。
11. 如何限制并行分支的并发以适配 API 限流?
并行来自 map-reduce/路由的 fan-out;社区讨论常见做法是自定义批量/分块或在调用端施加并发控制(如信号量/队列)。
12. Deferred Nodes 是什么?
延迟节点允许你声明“等所有并行分支完成后再运行”,便于协调复杂的异步逻辑与收敛点。 

高阶(迁移、调试、陷阱)
13. 图变更(迁移)会不会“毒化”既有线程?
LangGraph 支持在启用 checkpointer 的情况下迁移图定义(节点/边/State),并提供相应的迁移指引,避免 thread 状态失配。
14. 如何在工具里修改 State?会不会被覆盖?
节点默认对相同 key 是“覆盖写”;若要累加/合并需为该 key 指定 reducer(如 add_messages),工具里返回的 Partial 会按 reducer 聚合。
15. 面试常考代码题:最小可用聊天代理(并带消息聚合)
要点:定义 State(含 messages: Annotated[List[BaseMessage], add_messages])、建 llm_node 产出 AIMessage,图里连 START→LLM→END;返回的 dict 会自动写回 State,消息用 reducer 追加。 

from typing import TypedDict, Annotated, List
from langchain_core.messages import BaseMessage, HumanMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[List[BaseMessage], add_messages]

def llm_node(state: State) -> State:
    # 伪代码:把最后一条用户消息回声为 AI 回复
    reply = HumanMessage(content="收到:" + state["messages"][-1].content)
    return {"messages": [reply]}  # 由 add_messages 聚合

g = StateGraph(State)
g.add_node("llm", llm_node)
g.add_edge(START, "llm"); g.add_edge("llm", END)
app = g.compile()

追问方向(给面试官的“加分点”提示)
• 并行扇出策略(map-reduce、分块/分批并发)与收敛点控制(deferred node)。
• 人审体验:在哪些节点打断?如何把工具调用审批接到前端并在恢复时继续?
• 持久化选型(SQLite 开发、本地;Postgres 生产)与线程(thread)模型的用法。
• 工具栈选择:用 ToolNode 还是 llm.bind_tools,以及错误处理与重试。

Logo

更多推荐