LangGraph编排的各节点输入输出及传递是如何实现的?
1 个回答
慢慢理解世界,慢慢更新自己。大龙## 作用 LangGraph 通过**共享状态(State)**在各节点之间传递输入和输出:节点不是彼此直接传参,而是读取当前图状态,执行业务逻辑后返回状态更新,由 LangGraph 按预定义的 Reducer 合并回全局状态,再传给后续节点。 ## 原理 ### 1. 定义统一的状态 Schema - 状态是贯穿整个图执行过程的共享类型化数据结构。 - 通常使用 `TypedDict`、Pydantic `BaseModel` 或 `dataclass` 定义。 - 状态中可以包含消息列表、检索结果、中间答案、计数器、路由标记等字段。 - 每个节点的输入和输出都围绕该状态 Schema 组织,从而保证字段结构和类型一致。 示例结构: ```python from typing import Annotated, TypedDict from langgraph.graph.message import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages] context: str answer: str ``` ### 2. 节点接收当前状态并返回更新 节点本质上是一个函数: - **输入**:当前图状态,或状态中节点需要的字段。 - **处理**:调用 LLM、工具、数据库或执行任意业务逻辑。 - **输出**:一个字典,用于表示要更新的状态字段。 示例: ```python def retrieve_node(state: AgentState): question = state["messages"][-1].content docs = retriever.invoke(question) return {"context": format_docs(docs)} def answer_node(state: AgentState): answer = llm.invoke( f"根据上下文回答:{state['context']}\n问题:{state['messages'][-1].content}" ) return {"answer": answer.content} ``` 节点不需要手动把结果传给下一个节点,只需返回状态更新;LangGraph 会合并状态,并把新状态交给边所指向的下游节点。 ### 3. 使用 Channel 和 Reducer 合并节点输出 状态中的每个键对应一个 Channel,Channel 使用 Reducer 决定节点返回值如何写回状态。 常见 Reducer 包括: - `add_messages`:追加消息,适合维护对话历史。 - `last_value`:后写覆盖前值,适合普通标量字段。 - `merge`:合并字典。 - 自定义 Reducer:实现特定的合并逻辑。 可通过 `Annotated[..., reducer]` 指定: ```python messages: Annotated[list, add_messages] ``` 这样多个节点或并行节点写入同一字段时,LangGraph 能按约定合并,避免直接覆盖导致数据丢失。 ### 4. 边决定更新后的状态流向哪个节点 边负责定义节点之间的执行顺序: - **普通边**:固定从一个节点进入下一个节点。 - **条件边**:路由函数读取当前状态,返回下一个节点名称。 - **动态跳转**:节点可通过 `Command(goto=...)` 直接指定下一节点。 条件路由示例: ```python def route_after_llm(state: AgentState): last_message = state["messages"][-1] if last_message.tool_calls: return "tools" return "end" ``` 因此,状态更新完成后,LangGraph 会根据边或路由函数的结果,把最新状态传给下一个被选中的节点。 ### 5. 以超级步方式推进执行 LangGraph 的运行过程类似消息传递: 1. 图启动时接收初始状态。 2. 当前超级步中可运行的节点读取状态并执行。 3. 节点返回状态更新。 4. Reducer 将更新合并到共享状态。 5. 边根据新状态决定下一超级步要运行的节点。 6. 不断重复,直到没有节点继续执行。 这种机制既支持线性流程,也支持条件分支和循环。例如 ReAct 中可以在 LLM 节点和工具节点之间循环,直到模型不再发起工具调用。 ### 6. 子图通过输入/输出 Schema 与父图传递数据 子图可以作为一个节点嵌入父图: - 父图把符合子图输入 Schema 的状态传给子图。 - 子图在内部维护自己的处理流程和状态。 - 子图执行完成后,按输出 Schema 将结果返回并合并到父图状态。 这样可以把复杂流程拆成多个可复用、可测试的模块。 ### 7. 上下文用于传递只读运行时信息 除可变 State 外,LangGraph 还支持 context schema,用于传递运行时不变的数据,例如: - `user_id` - 权限信息 - 数据库连接 - 配置参数 Context 对节点可见但不应被节点修改,适合放只读依赖;真正需要在节点间流转和更新的数据应放入 State。发布于 2026-10-26 11:35 •IP属地 海南举报评论收藏
公众号进入网站体验更佳

