一、本章介绍
本节将继续推进节点流转流程,从 ChatModelNode 切换到 AgentNode 节点,完成智能体 LlmAgent 的实例化操作,并实现 AgentNode 的装配逻辑。
二、流程设计
如图,智能体装配中,AgentNode 部分;

在整体执行链路中,AgentNode 通常承接自 ChatModelNode。各节点的运行机制大体一致:先完成当前节点所负责的逻辑处理,再依据既定的流转策略,将任务传递至后续节点,以推进整个流程的持续执行。
从功能上看,AgentNode 更像是一个多智能体的编排单元。在实际构建智能体时,一旦业务场景较为复杂,往往需要将任务拆解,由不同的 LlmAgent 分别承担特定职责,通过协同配合来完成完整流程。因此,这类节点并非单一 Agent,而是由多个 LlmAgent 组合而成的执行体系。
三、功能实现
1. 工程结构
在流程中引入 AgentNode 节点,用于完成 LlmAgent 的构建工作,并将其注入到当前上下文环境中,供后续节点使用。
同时,需要重点关注 AgentNode 在整个流程中的衔接方式,包括其进入与输出的路径设计。此外,在多 Agent 的装配过程中,应合理划分节点边界,明确各节点的职责范围,从而形成清晰的任务拆分与组合逻辑。
2. 核心模块
2.1 节点流转
@Slf4j
@Service
public class ChatModelNode extends AbstractArmorySupport {
@Resource
private AgentNode agentNode;
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - ChatModelNode");
// ... 业务
return router(requestParameter, dynamicContext);
}
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
return agentNode;
}
}- 在 ChatModelNode(对话模型节点)中,引入新增的 AgentNode 节点,用于承接后续的智能体处理逻辑。当 ChatModelNode 完成自身的装配与执行后,通过路由机制将流程转发至 AgentNode,以继续后续的处理过程。
2.2 智能体构建
@Slf4j
@Service
public class AgentNode extends AbstractArmorySupport {
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - AgentNode");
// 1. 上下文获取数据
ChatModel chatModel = dynamicContext.getChatModel();
AiAgentConfigTableVO aiAgentConfigTableVO = requestParameter.getAiAgentConfigTableVO();
List<AiAgentConfigTableVO.Module.Agent> agents = aiAgentConfigTableVO.getModule().getAgents();
for (AiAgentConfigTableVO.Module.Agent agentConfig : agents) {
LlmAgent agent = LlmAgent.builder()
.name(agentConfig.getName())
.description(agentConfig.getDescription())
.model(new SpringAI(chatModel))
.instruction(agentConfig.getInstruction())
.outputKey(agentConfig.getOutputKey())
.build();
dynamicContext.getAgentGroup().put(agentConfig.getName(), agent);
}
return router(requestParameter, dynamicContext);
}
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
return defaultStrategyHandler;
}
}在 AgentNode 中,会对已配置的多个 LlmAgent 进行遍历与组装,并在完成后统一写入上下文环境。每个智能体以
name作为唯一标识,后续在使用时可通过该标识快速定位并获取对应实例。这些智能体在设计上均继承自统一的基类 LlmAgent,以保证结构和调用方式的一致性。在具体实现层面,可以参考 Google ADK 或 Spring AI 的对接方式,例如通过类似
new SpringAI(chatModel)的形式完成模型适配与封装。如果切换到 langchain4j,同样可以采用类似思路进行集成与替换,整体架构具备良好的扩展性。