Channels 层详解
Channels 是 LangGraph 最底层抽象:节点不直接互传对象,而是对命名 channel 做 read / write,由引擎在超步边界合并。
源码:@langchain/langgraph-core 中 channels/。
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 实现。