Appearance
27. LangGraph 的 State、Node、Edge 各自职责是什么?
难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔面试官:LangGraph 的 State、Node、Edge 各自职责是什么?
🙋♂️我:State 存数据,Node 处理数据,Edge 控制流程。
👔面试官:对,但还有更细的分工:State 是 TypedDict,明确定义结构;Node 是纯函数,输入 State 返回更新;Edge 分普通边和条件边,条件边用函数判断走向。你能展开吗?
🙋♂️我:条件边根据 State 判断下一步走哪?
👔面试官:对,而且 State 的更新是增量更新,不是替换。多个节点可以并行更新不同字段。这是 LangGraph 灵活性的关键。
💡 简要回答
| 组件 | 职责 | 说明 |
|---|---|---|
| State | 数据结构 | TypedDict 定义,存所有运行时数据 |
| Node | 处理逻辑 | 纯函数,接收 State,返回 State 更新 |
| Edge | 流程控制 | 普通边(固定流转)、条件边(动态判断) |
State 更新机制:
- 增量更新(不是替换)
- 多个节点可并行更新不同字段
- 自动合并到主 State
📝 详细解析
State 定义
python
from typing import TypedDict, Annotated
from operator import add
class State(TypedDict):
messages: Annotated[list, add] # 用 add 合并,不是替换
documents: list
next_step: str注解(Annotated):
- 指定字段如何更新(add、replace、自定义函数)
Node 实现
python
def retrieval_node(state: State) -> dict:
docs = retriever.get_relevant_documents(state["messages"][-1].content)
return {"documents": docs} # 只返回要更新的字段
def generation_node(state: State) -> dict:
response = llm.invoke(state["messages"])
return {"messages": [response]}特点:
- 纯函数,无副作用
- 返回 dict,只包含要更新的字段
- 系统自动合并到 State
Edge 类型
普通边:
python
workflow.add_edge("node_a", "node_b") # A 完了一定走 B条件边:
python
def route(state: State) -> str:
if len(state["documents"]) > 0:
return "generate"
else:
return "rewrite_query"
workflow.add_conditional_edges("retrieve", route, {
"generate": "generate_node",
"rewrite_query": "rewrite_node"
})🎯 面试总结
State 定义数据结构,Node 实现处理逻辑,Edge 控制流转。State 增量更新,条件边支持动态分支。