Skip to content
目录

Channels 层详解

Channels 是 LangGraph 最底层抽象:节点不直接互传对象,而是对命名 channel 做 read / write,由引擎在超步边界合并。

源码:@langchain/langgraph-corechannels/


1. 为何需要 Channel

直接传参Channel
难并行、难合并多写入超步内收集更新,步末统一 apply
难持久化整图可按 channel 序列化进 checkpoint
耦合拓扑订阅规则表达「谁触发谁」

2. BaseChannel 概念

每个 channel 实现大致提供:

  • 当前值的读视图
  • update 合并(多节点同超步写入如何归约)
  • 是否触发下游节点(与 reducer 语义相关)
  • checkpoint 片段的序列化/反序列化

3. 常见 Channel 类型(语义)

类型典型用途
LastValue状态字段「最后写入胜出」或单写者
Topic多生产者消息流、累加消息列表
BinaryOperatorAggregate用 reducer(如 append)合并
EphemeralValue仅本超步有效,不跨步保留

具体类名以版本为准;选型决定 state 字段如何合并


4. 与 StateGraph 的对应

用户定义的 State + Annotation(reducer、default)在 compile 时映射为一组 channel。
多个节点同字段写入 → 由对应 reducer 在步末合并。


5. 版本与可见性

超步结束时 channel 版本前进;下一超步节点读到上一超步结束后的快照
这是「为何 interrupt 后 resume 可能重跑节点」的底层原因之一(见 07)。


6. 实践建议

  • 为列表字段显式指定 append reducer,避免静默覆盖。
  • 区分「持久 state」与「仅当步消息」(Topic / ephemeral)。
  • 大对象进 channel 会进 checkpoint,注意体积。

7. 总结

Channels = Pregel 里的共享内存 + 合并语义;读源码先找 BaseChannel 与各 update 实现。

MIT License.