AI项目博客
记录 AI 工程实践与大模型应用

Spring AI Alibaba 95|Graph Core · 子图 · 作为编译图使用

创建子图节点的最简单方法是直接使用编译的子图。这样做时,父图和子图状态 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

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 95|Graph Core · 子图 · 作为编译图使用

评论 抢沙发

AI项目博客

专注 AI 工程化落地 —— 覆盖智能体、大模型、Java AI 与 Python 的学习笔记,以及 AI 平台的项目实战记录。

关于本站文章归档

登录

找回密码

注册