15 langgraph基本组件
好的,以下是 LangGraph 核心六大组件(1~6) 的详细、深入、结构化说明,剔除了子图与可视化等高级/辅助内容,专注于基础构建块的理解与使用。
1. State(状态)
1.1 定义与作用
- State 是整个工作流的共享上下文,所有节点读取和更新它。
- 它决定了“系统当前知道什么”以及“下一步能做什么”。
- 所有节点函数接收
State作为输入,并返回一个局部更新字典,框架自动将其合并到全局状态中。
1.2 类型定义方式
(1) 使用 TypedDict(推荐)
from typing import TypedDict, Annotated
import operatorclass AgentState(TypedDict):messages: Annotated[list, operator.add] # 消息历史自动追加current_plan: str # 当前计划(覆盖式更新)tool_attempts: int # 工具调用次数
(2) 使用 Pydantic BaseModel(实验性支持)
注意:截至 LangGraph v0.1.x,官方更推荐
TypedDict+Annotated,因底层依赖对字典操作优化更好。
1.3 字段更新语义(Reducer)
LangGraph 通过 reducer 函数决定如何合并节点返回值到状态:
| 更新方式 | 写法 | 行为 |
|---|---|---|
| 覆盖(默认) | field: str | 新值直接替换旧值 |
| 追加列表 | Annotated[list, operator.add] | state['field'] += new_value |
| 自定义 reducer | Annotated[MyType, my_reducer] | 调用 my_reducer(old, new) |
✅ 示例:
messages字段通常用operator.add,确保多轮对话消息累积而非丢失。
1.4 最佳实践
- 状态应尽量扁平,避免深层嵌套(便于调试和 reducer 设计)。
- 所有节点必须只通过返回 dict 修改状态,禁止直接修改传入的 state 对象(因可能被缓存或并行处理)。
2. Node(节点)
2.1 基本概念
- 节点是纯函数(或可调用对象),代表一个逻辑步骤。
- 输入:当前完整
State - 输出:
dict,表示对状态的增量更新
2.2 节点函数签名
def my_node(state: StateType) -> dict:# 读取 statelast_msg = state