ReactAgent原理

张开发
2026/6/21 0:44:21 15 分钟阅读
ReactAgent原理
ReactAgent原理Spring AI Alibaba 中的ReactAgent基于 Graph 运行时构建。Graph 由节点steps和边connections组成定义了 Agent 如何处理信息。Agent 在这个 Graph 中移动执行如下节点Model Node (模型节点)调用 LLM 进行推理和决策Tool Node (工具节点)执行工具调用Hook Nodes (钩子节点)在关键位置插入自定义逻辑这里的节点steps可以理解成activiti审批流里的action节点实例真正干活的实例边connections可以理解成activiti审批流里的连线表示从谁到谁source - target内部实现将任务拆解成一个个明确的步骤节点然后用代码把这些步骤“编排”成一个流程图使用代码描述如下packagecom.demo.test.graph;importcom.alibaba.cloud.ai.graph.CompiledGraph;importcom.alibaba.cloud.ai.graph.KeyStrategy;importcom.alibaba.cloud.ai.graph.OverAllState;importcom.alibaba.cloud.ai.graph.RunnableConfig;importcom.alibaba.cloud.ai.graph.StateGraph;importcom.alibaba.cloud.ai.graph.action.AsyncNodeActionWithConfig;importcom.alibaba.cloud.ai.graph.action.NodeActionWithConfig;importcom.alibaba.cloud.ai.graph.agent.exception.AgentException;importcom.alibaba.cloud.ai.graph.exception.GraphStateException;importcom.alibaba.cloud.ai.graph.state.strategy.AppendStrategy;importcom.alibaba.cloud.ai.graph.state.strategy.ReplaceStrategy;importio.opentelemetry.context.Context;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Optional;importjava.util.concurrent.CompletableFuture;importorg.springframework.ai.chat.messages.AssistantMessage;importorg.springframework.ai.chat.messages.Message;/** * 理解 Spring Ai Alibaba 的流程编排 * * author wuzhenhong * date 2026/3/31 15:56 */publicclassTestGraph{publicstaticvoidmain(String[]args)throwsGraphStateException{// 1. 定义全局状态OverAllStatestatenewOverAllState();state.registerKeyAndStrategy(topic,newReplaceStrategy());state.input(Map.of(topic,undefined));// 2. 定义流程中的各个节点StateGraphstateGraphnewStateGraph(Research Workflow,()-{HashMapString,KeyStrategykeyStrategyHashMapnewHashMap();keyStrategyHashMap.put(messages,newAppendStrategy());returnkeyStrategyHashMap;})// 节点1信息搜集节点内部封装了调用搜索工具的LLM.addNode(research_node,node_async(((s,config)-{System.out.println(research_node........);returnMap.of(topic,hello world!);})))// 节点2报告撰写节点内部封装了调用文档工具的LLM.addNode(writing_node,node_async((s,config)-{Objecttopics.data().getOrDefault(topic,undefined);System.out.println(String.format(invoke LLM with topic %s........,topic));StringjavaStr public class HelloWorld { public static void main(String[] args) { System.out.println(%s); } } .formatted(topic);ListMessagemessageListnewArrayList();AssistantMessageassistantMessageAssistantMessage.builder().content(javaStr).build();messageList.add(assistantMessage);returnMap.of(messages,messageList);}))// 节点3结束节点.addNode(finish_node,node_async((s,config)-{System.out.println(finish_node........);returnMap.of();}))// 3. 编排节点间的执行路径.addEdge(StateGraph.START,research_node).addEdge(research_node,writing_node).addEdge(writing_node,finish_node).addEdge(finish_node,StateGraph.END);RunnableConfigconfigRunnableConfig.builder().threadId(testsssssssssss1111).build();// 4. 执行工作流CompiledGraphcompiledGraphstateGraph.compile();AssistantMessageassistantMessageextractAssistantMessage(compiledGraph.invoke(state,config));System.out.println(assistantMessage.getText());}privatestaticAssistantMessageextractAssistantMessage(OptionalOverAllStatestate){returnstate.flatMap(s-s.value(messages)).stream().flatMap(messageList-((List?)messageList).stream().filter(msg-msginstanceofAssistantMessage).map(msg-(AssistantMessage)msg)).reduce((first,second)-second).orElseThrow(()-newAgentException(No AssistantMessage found in messages state));}privatestaticAsyncNodeActionWithConfignode_async(NodeActionWithConfigsyncAction){return(state,config)-{ContextcontextContext.current();CompletableFutureMapString,ObjectresultnewCompletableFuture();try{result.complete(syncAction.apply(state,config));}catch(Exceptione){result.completeExceptionally(e);}returnresult;};}}启动 main 方法执行结果如下research_node........invokeLLMwithtopichello world!........finish_node........publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println(hello world!);}}ReactAgent请求流程可以描述成下面这样框内的id相同的表示同一个对象从图中可以看到 AGENT_HOOK 全程只会调用一次而 MODEL_HOOK 可能会调用多次直到模型认为推理结果满意为止用官方的图表示如下总览图勾子和拦截器的调用

更多文章