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

Spring AI Alibaba 50|工作流编排 · Agent作为Node:ReactAgent 作为 SubGraph Node

ReactAgent 可以通过 asNode() 方法转换为可以嵌入到父 Graph 中的 Node:

import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.StateGraph;
import com.alibaba.cloud.ai.graph.KeyStrategyFactory;
import com.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;
import com.alibaba.cloud.ai.graph.CompileConfig;
import com.alibaba.cloud.ai.graph.CompiledGraph;
import com.alibaba.cloud.ai.graph.NodeOutput;
import com.alibaba.cloud.ai.graph.streaming.StreamingOutput;
import org.springframework.ai.chat.model.ChatModel;

import java.util.HashMap;
import java.util.Map;

public class AgentWorkflowExample {

  public void buildWorkflowWithAgent(ChatModel chatModel) throws Exception {
      // 创建专门的数据分析 Agent
      ReactAgent analysisAgent = ReactAgent.builder()
          .name("data_analyzer")
          .model(chatModel)
          .instruction("你是一个数据分析专家,负责分析数据并提供洞察,请分析以下输入数据:
 {input}")
          .outputKey("analysis_result")
          .build();

      // 创建报告生成 Agent
      ReactAgent reportAgent = ReactAgent.builder()
          .name("report_generator")
          .model(chatModel)
          .instruction("你是一个报告生成专家,负责将分析结果 "{analysis_result}" 转化为专业报告")
          .outputKey("final_report")
          .build();

      // 定义状态管理策略
      KeyStrategyFactory keyStrategyFactory = () -> {
          HashMap<String, KeyStrategy> strategies = new HashMap<>();
          strategies.put("input", new ReplaceStrategy());
          return strategies;
      };

      // 构建包含 Agent 的工作流
      StateGraph workflow = new StateGraph(keyStrategyFactory);

      // 将 Agent 作为 SubGraph Node 添加
      workflow.addNode(analysisAgent.name(), analysisAgent.asNode(
          true,                     // includeContents: 是否传递父图的消息历史
          false                     // returnReasoningContents: 是否返回推理过程
      ));

      workflow.addNode(reportAgent.name(), reportAgent.asNode(
          true,
          false
      ));

      // 定义流程
      workflow.addEdge(StateGraph.START, analysisAgent.name());
      workflow.addEdge(analysisAgent.name(), reportAgent.name());
      workflow.addEdge(reportAgent.name(), StateGraph.END);

      // 编译并执行工作流
      CompiledGraph compiledGraph = workflow.compile(CompileConfig.builder().build());
      NodeOutput lastOutput = compiledGraph.stream(Map.of("input", "2025年全年销量100亿,毛利率 23%,净利率 13%。2024年全年销量80亿,毛利率 20%,净利率 8%。"))
          .doOnNext(output -> {
              if (output instanceof StreamingOutput<?> streamingOutput) {
                  System.out.println("Output from node " + streamingOutput.node() + ": " + streamingOutput.message().getText());
              }
          })
          .blockLast();

      System.out.println("

最终结果,包含所有节点状态:
" + lastOutput.state().data());
  }
}

asNode() 方法支持以下参数配置:

参数 类型 说明
includeContents boolean 是否将父图的 messages 传递给子 Agent(默认 true)
returnReasoningContents boolean 是否返回完整的推理过程,false 则只返回最终结果(默认 false)

注意:outputKey 是在创建 ReactAgent 时通过 ReactAgent.builder().outputKey() 设置的,用于指定 Agent 输出结果在状态中的键名。

本文整理自 Spring AI Alibaba 官方文档《工作流编排》:https://java2ai.com/docs/frameworks/agent-framework/advanced/workflow

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 50|工作流编排 · Agent作为Node:ReactAgent 作为 SubGraph Node

评论 抢沙发

AI项目博客

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

关于本站文章归档

登录

找回密码

注册