创建子图节点的最简单方法是直接使用编译的子图。这样做时,父图和子图状态 schema 至少要共享一个键,它们可以使用该键进行通信,这一点很重要。如果您的图和子图不共享任何键,您应该编写一个调用子图的操作(见上文)。
注意事项
- 如果您向子图节点传递额外的键(即,除了共享键之外),子图节点将忽略它们。同样,如果您从子图返回额外的键,父图将忽略它们。
- 支持中断(通过返回 InterruptionMetadata)
示例:共享状态的子图
import com.alibaba.cloud.ai.graph.CompiledGraph;
import com.alibaba.cloud.ai.graph.KeyStrategy;
import com.alibaba.cloud.ai.graph.KeyStrategyFactory;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;
import java.util.HashMap;
import java.util.Map;
import static com.alibaba.cloud.ai.graph.StateGraph.END;
import static com.alibaba.cloud.ai.graph.StateGraph.START;
import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.node_async;
// 定义共享状态策略
KeyStrategyFactory sharedKeyStrategyFactory = () -> {
HashMap<String, KeyStrategy> keyStrategyHashMap = new HashMap<>();
keyStrategyHashMap.put("sharedData", new ReplaceStrategy());
keyStrategyHashMap.put("results", new ReplaceStrategy());
return keyStrategyHashMap;
};
// 创建子图
StateGraph childGraph = new StateGraph(sharedKeyStrategyFactory)
.addNode("process", node_async(state -> {
String data = (String) state.value("sharedData").orElse("");
return Map.of("results", "Child processed: " + data);
}))
.addEdge(START, "process")
.addEdge("process", END);
CompiledGraph compiledChild = childGraph.compile();
// 创建父图,直接使用编译的子图作为节点
StateGraph parentGraph = new StateGraph(sharedKeyStrategyFactory)
.addNode("prepare", node_async(state -> {
return Map.of("sharedData", "Parent data");
}))
.addNode("subgraph", compiledChild) // 直接使用编译的子图
.addEdge(START, "prepare")
.addEdge("prepare", "subgraph")
.addEdge("subgraph", END);
CompiledGraph compiledParent = parentGraph.compile();
示例:多个子图复用
同一个编译的子图可以在父图中多次使用,实现组件复用:
// 创建数据处理子图
KeyStrategyFactory dataProcessorFactory = () -> {
HashMap<String, KeyStrategy> strategies = new HashMap<>();
strategies.put("data", new ReplaceStrategy());
strategies.put("result", new ReplaceStrategy());
return strategies;
};
StateGraph dataProcessorGraph = new StateGraph(dataProcessorFactory)
.addNode("process", node_async(state -> {
String input = (String) state.value("data").orElse("");
String output = "Processed: " + input.toUpperCase();
return Map.of("result", output);
}))
.addEdge(START, "process")
.addEdge("process", END);
CompiledGraph dataProcessor = dataProcessorGraph.compile();
// 在多个节点中复用同一个子图
KeyStrategyFactory keyFactory = () -> {
HashMap<String, KeyStrategy> strategies = new HashMap<>();
strategies.put("data", new ReplaceStrategy());
strategies.put("result", new ReplaceStrategy());
return strategies;
};
StateGraph mainGraph = new StateGraph(keyFactory)
.addNode("process1", dataProcessor) // 复用子图
.addNode("process2", dataProcessor) // 复用子图
.addNode("process3", dataProcessor) // 复用子图
.addEdge(START, "process1")
.addEdge("process1", "process2")
.addEdge("process2", "process3")
.addEdge("process3", END);
CompiledGraph compiledMain = mainGraph.compile();
本文整理自 Spring AI Alibaba 官方文档《子图》:https://java2ai.com/docs/frameworks/graph-core/examples/subgraph

AI项目博客






