前面了解了基礎的概念及流程,以及一些參數類
下面了解一些特殊的邊和節點
條件邊
常見的流程圖可能長這個樣子:
其中菱形的為條件節點(或者叫判定節點),但是在spring-ai-alibaba-graph中,并沒有條件節點
在spring-ai-alibaba-graph中,條件是加在邊上的
直覺添加條件邊的方法可能是這個樣子:addEdge(sourceNodeId, targetNodeId, condition)
但實際是這個樣子:addConditionalEdges(sourceNodeId, condition, mappings)
sourceNodeId 是邊的起始節點,condition 是判斷條件,輸出結果中包含一個 String 類型的結果,mappings 是一個Map<String, String>,key 是 condition 返回的結果中的 String, value 是 targetNodeId,目標節點id
也就是說,addConditionalEdges 方法添加了一個Edge對象,這個Edge對象包含了傳統流程圖中判定節點的邏輯,和后續從該判定節點延伸出的所有邊
說實話這種設計給人的感覺不夠直觀,不清楚是為了與langgraph保持一致,還是有其他考量
并行節點
條件邊是多邊n選1,那如果多邊n選n,也就是并行執行,類似下圖,該如何操作
其實根據圖形來設置節點和邊即可
StateGraph stateGraph = new StateGraph(keyStrategyFactory)
.addNode("a", nodeasync(new ...))
.addNode("b", nodeasync(new ...))
.addNode("c", nodeasync(new ...))
.addNode("d", nodeasync(new ...)).addEdge(StateGraph.START, "a")
.addEdge("a", "b")
.addEdge("a", "c")
.addEdge("b", "d")
.addEdge("c", "d")
.addEdge("d", StateGraph.END)
在編譯圖時,會將b節點和c節點組合成為一個并行節點 ParallelNode,并行節點的id為“__PARALLEL__”+前序節點的id
ParallelNode:繼承Node類,內部含id和ActionFactory,構造函數參數為【id,多個異步節點 List<AsyncNodeActionWithConfig> actions,狀態中各字段的更新策略Map<String, KeyStrategy> keyStrategyMap】
ActionFactory 對應 lambda 表達式為:(config) -> new AsyncParallelNodeAction(actions, keyStrategyMap)
AsyncParallelNodeAction:實現了AsyncNodeActionWithConfig接口,提供 CompletableFuture<Map<String, Object>> apply(OverAllState state, RunnableConfig config) 方法,內部包含前面提到的多個異步節點 List<AsyncNodeActionWithConfig> actions,狀態中各字段的更新策略Map<String, KeyStrategy> keyStrategyMap
AsyncParallelNodeAction執行時會同時執行內部的多個異步節點 List<AsyncNodeActionWithConfig> actions,并等待全部執行完成后進入下一節點
ps:并行節點的原節點,也就是b和c,后續的邊不能是條件邊,而且必須有同一個targetNode,也就是d,不支持配置下圖的流程
子圖節點
StateGraph child = ...StateGraph parent = ...parent.addNode("nodeId", child);...
所謂子圖,就是圖中圖,以節點的形式將一個圖嵌入到另一個圖中
使用方法很簡單,StateGraph 提供了一個重載方法 addNode(String id, StateGraph subGraph)
addNode 方法會將子圖封裝為 SubStateGraphNode ,該類內部包含id和一個StateGraph
編譯時,ProcessedNodesEdgesAndConfig 會將子圖中的START節點替換為子圖外部的前序節點,將子圖中的END節點替換為子圖外部的后續節點,子圖中的節點的id會替換為【子圖節點id+節點id】
子圖不支持內部以并行節點開始,也不支持子圖外部后續節點為并行節點
ps:由于編譯時是先處理子圖,然后再處理并行節點,所以前一節的多步驟并行的流程也無法通過將b和b2做成子圖節點來實現