边 #
目录 #
简介 #
在 langgraphgo 的图结构中,边(Edge)是定义节点间固定执行流向的核心组件。边表示从一个节点到另一个节点的有向连接,决定了图执行过程中的控制流方向。通过边的定义,开发者可以构建线性流程、分支流程、扇出(Fan-out)和扇入(Fan-in)等复杂的执行模式。
Edge 结构体定义 #
Edge 结构体是 langgraphgo 中表示边的基本数据结构,它包含了边的起点和终点信息:
classDiagram
class Edge {
+string From
+string To
}
class MessageGraph {
+map[string]Node nodes
+[]Edge edges
+addEdge(from, to)
}
class StateGraph {
+map[string]Node nodes
+[]Edge edges
+addEdge(from, to)
}
MessageGraph --> Edge : "包含"
StateGraph --> Edge : "包含"
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L62-L69)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L11-L16)
From 和 To 字段详解 #
Edge 结构体的两个核心字段:
- From: 表示边的起始节点名称,即边的源节点
- To: 表示边的目标节点名称,即边的终点节点
这两个字段共同定义了从哪个节点到哪个节点的执行流向,形成了图中的有向连接。
章节来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L62-L69)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L11-L16)
边的类型 #
langgraphgo 支持两种主要类型的边:
静态边(Static Edge) #
静态边是在图构建阶段就确定的固定执行路径,通过 AddEdge 方法添加:
flowchart LR
A[节点A] --> B[节点B]
B --> C[节点C]
C --> D[END]
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L111-L117)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L66-L72)
条件边(Conditional Edge) #
条件边允许根据运行时状态动态决定下一个执行节点,通过 AddConditionalEdge 方法添加:
flowchart TD
A[节点A] --> |条件判断| B{条件检查}
B --> |满足条件1| C[节点C]
B --> |满足条件2| D[节点D]
B --> |其他情况| E[节点E]
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L119-L123)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L74-L77)
边的添加方法 #
MessageGraph 中的边添加 #
MessageGraph 提供了 AddEdge 方法来添加静态边:
sequenceDiagram
participant User as 用户代码
participant MG as MessageGraph
participant Edge as Edge结构体
User->>MG : AddEdge(from, to)
MG->>Edge : 创建Edge对象
Edge->>MG : 设置From和To字段
MG->>MG : 将Edge添加到edges切片
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L111-L117)
StateGraph 中的边添加 #
StateGraph 使用相同的 AddEdge 方法,但内部实现略有不同:
sequenceDiagram
participant User as 用户代码
participant SG as StateGraph
participant Edge as Edge结构体
User->>SG : AddEdge(from, to)
SG->>Edge : 创建Edge对象
Edge->>SG : 设置From和To字段
SG->>SG : 将Edge添加到edges切片
图表来源
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L66-L72)
章节来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L111-L117)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L66-L72)
图执行过程中的边处理 #
在图执行过程中,引擎会根据当前节点的执行结果查找其所有后继节点。边在这里发挥关键作用:
flowchart TD
A[当前节点A] --> B{查找边}
B --> C[遍历edges切片]
C --> D{检查edge.From}
D --> |匹配| E[edge.To为目标节点]
D --> |不匹配| F[继续查找]
E --> G[加入下一执行批次]
F --> C
G --> H[并行执行目标节点]
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L418-L425)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L249-L257)
边查找算法 #
引擎在每个执行周期中执行以下步骤:
- 遍历当前节点集合:检查每个正在执行的节点
- 查找对应边:在边列表中查找以当前节点为起点的边
- 收集目标节点:将所有找到的边的目标节点收集到下一执行批次
- 处理扇出情况:允许多个边从同一节点出发,支持并行执行
章节来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L418-L425)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L249-L257)
扇出与并行执行 #
扇出(Fan-out)是一种重要的执行模式,允许一个节点同时触发多个后续节点的执行:
graph TD
A[开始节点] --> B[分支A]
A --> C[分支B]
A --> D[分支C]
B --> E[聚合节点]
C --> E
D --> E
E --> F[结束]
图表来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/parallel_execution/main.go#L66-L74)
- [parallel.go](https://github.com/smallnest/langgraphgo/blob/main/graph/parallel.go#L154-L177)
扇出实现机制 #
扇出模式通过以下方式实现:
- 多条边从同一节点出发:为每个分支添加单独的边
- 并行执行检测:引擎自动识别扇出模式
- 同步等待:所有分支完成后才继续执行聚合节点
sequenceDiagram
participant Engine as 图引擎
participant N1 as 节点A
participant N2 as 节点B
participant N3 as 节点C
participant N4 as 聚合节点
Engine->>N1 : 开始执行
N1->>Engine : 完成执行
Engine->>N2 : 并行执行
Engine->>N3 : 并行执行
N2->>Engine : 完成执行
N3->>Engine : 完成执行
Engine->>N4 : 执行聚合逻辑
图表来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/parallel_execution/main.go#L66-L74)
- [parallel.go](https://github.com/smallnest/langgraphgo/blob/main/graph/parallel.go#L24-L82)
章节来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/parallel_execution/main.go#L66-L74)
- [parallel.go](https://github.com/smallnest/langgraphgo/blob/main/graph/parallel.go#L154-L177)
边与条件边的区别 #
| 特性 | 静态边(Edge) | 条件边(Conditional Edge) |
|---|---|---|
| 定义时机 | 图构建时确定 | 运行时动态决定 |
| 执行路径 | 固定不变 | 根据状态变化 |
| 实现方式 | 直接添加到边列表 | 通过条件函数判断 |
| 灵活性 | 低 | 高 |
| 性能 | 高(直接查找) | 中(需要执行函数) |
| 适用场景 | 确定性流程 | 分支决策、路由 |
执行优先级 #
当同时存在静态边和条件边时,执行优先级如下:
- 命令优先:如果节点返回 Command 对象,优先使用 Goto 指定的节点
- 条件边优先:如果没有命令,优先考虑条件边
- 静态边回退:条件边未命中时使用静态边
flowchart TD
A[节点执行完成] --> B{检查Command}
B --> |有Goto| C[执行Goto指定节点]
B --> |无Goto| D{检查条件边}
D --> |有条件边| E[执行条件边目标]
D --> |无条件边| F{查找静态边}
F --> |找到边| G[执行静态边目标]
F --> |无边| H[错误:无出边]
图表来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L393-L402)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L225-L234)
章节来源
- [graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/graph.go#L119-L123)
- [state_graph.go](https://github.com/smallnest/langgraphgo/blob/main/graph/state_graph.go#L74-L77)
实际应用示例 #
基础线性流程 #
最简单的边使用示例展示了线性执行流程:
flowchart LR
Process[处理节点] --> END[结束]
图表来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/basic_example/main.go#L32)
扇出流程示例 #
并行执行示例展示了如何使用扇出模式:
graph TD
Start[开始] --> A[分支A]
Start --> B[分支B]
Start --> C[分支C]
A --> D[聚合器]
B --> D
C --> D
D --> END[结束]
图表来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/parallel_execution/main.go#L66-L74)
复杂流程组合 #
实际应用中,边可以组合使用多种模式:
flowchart TD
A[入口] --> B[验证]
B --> |成功| C[处理]
B --> |失败| D[错误处理]
C --> E[存储]
E --> F[通知]
F --> G[结束]
D --> G
章节来源
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/basic_example/main.go#L32)
- [main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/parallel_execution/main.go#L66-L74)
可视化与调试 #
langgraphgo 提供了多种可视化工具来帮助理解和调试边的配置:
Mermaid 图表生成 #
graph LR
A[节点A] --> B[节点B]
B --> C[节点C]
C --> END[END]
图表来源
- [visualization.go](https://github.com/smallnest/langgraphgo/blob/main/graph/visualization.go#L80-L81)
ASCII 树形表示 #
ASCII 可视化提供了简洁的树形结构表示,便于快速理解执行流程。
DOT 图形格式 #
支持 Graphviz DOT 格式输出,可用于更复杂的图形渲染和分析。
章节来源
- [visualization.go](https://github.com/smallnest/langgraphgo/blob/main/graph/visualization.go#L26-L96)
总结 #
边(Edge)是 langgraphgo 图结构中的核心组件,它定义了节点间的固定执行流向。通过 Edge 结构体的 From 和 To 字段,开发者可以精确控制图的执行路径。边系统支持多种执行模式:
- 静态边:提供确定性的执行路径
- 扇出模式:支持并行执行多个分支
- 条件边:提供动态的执行决策能力
- 混合模式:结合多种边类型实现复杂流程
理解边的工作原理对于设计高效、可维护的图执行流程至关重要。正确使用边可以帮助开发者构建从简单线性流程到复杂并行处理的各种应用场景。