跳到主要内容
基于 Multi-Agent、Skills 与 Spring AI 构建自主决策智能体 | 极客日志
Python
基于 Multi-Agent、Skills 与 Spring AI 构建自主决策智能体 基于 Multi-Agent、Skills 与 Spring AI 构建自主决策智能体 引言 随着大语言模型(LLM)的快速发展,智能体(Agent)技术成为 AI 应用开发的热点。智能体不仅能够理解自然语言,还能自主规划、执行任务、协同工作。将从基础概念出发,循序渐进地介绍如何使用 Multi-Agent、Skills 模式和 Spring AI 构建具备自主决策能力的智能体系统。 一、智能…
Pythonist 发布于 2026/4/6 更新于 2026/5/25 86K 浏览基于 Multi-Agent、Skills 与 Spring AI 构建自主决策智能体
引言
随着大语言模型(LLM)的快速发展,智能体(Agent)技术成为 AI 应用开发的热点。智能体不仅能够理解自然语言,还能自主规划、执行任务、协同工作。本文将从基础概念出发,循序渐进地介绍如何使用 Multi-Agent、Skills 模式和 Spring AI 构建具备自主决策能力的智能体系统。
一、智能体基础概念
1.1 什么是智能体
智能体是一个能够感知环境、做出决策并执行动作的软件实体。与传统 AI 应用不同,智能体具备以下核心特征:
自主性 :能够独立做出决策,无需人工持续干预
感知能力 :能够接收和处理外部信息
决策能力 :基于当前状态和目标选择最优行动
执行能力 :能够执行决策并影响环境
学习能力 :能够从经验中优化决策策略
1.2 智能体的核心组件
一个典型的智能体由以下核心组件构成:
智能体组件架构: ┌─────────────────────────────────────────┐
│ 感知层 (Perception) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 消息 │ │ 传感器│ │ 配置 │ │
│ │ 接收 │ │ 数据 │ │ 数据 │ │
│ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 决策层 (Decision) │
│ ┌──────────────────────────────┐ │
│ │ 决策策略引擎 │ │
│ │ - 规则引擎 │ │
│ │ - AI 分析 │ │
│ │ - 强化学习 │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 执行层 (Action) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 技能 │ │ 工具 │ │ 接口 │ │
│ │ 调用 │ │ 调用 │ │ 调用 │ │
│ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 记忆层 (Memory) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 工作 │ │ 长期 │ │ 语义 │ │
│ │ 记忆 │ │ 记忆 │ │ 记忆 │ │
│ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────┘
1.3 智能体状态机
智能体在运行过程中会经历不同的状态,通过状态机管理其生命周期:
public enum AgentState {
IDLE,
PROCESSING,
EXECUTING,
WAITING,
ERROR
}
二、Skills 技能模式
2.1 什么是 Skills 模式
Skills 模式是一种模块化智能体能力的设计方法。每个 Skill 代表一种特定的能力或功能,智能体可以根据需要动态加载和执行不同的技能。
Skills 模式的优势:
模块化 :每个技能独立开发、测试和部署
可扩展 :新增能力只需添加新的 Skill 实现
可组合 :多个技能可以组合完成复杂任务
可重用 :同一技能可在不同智能体间共享
2.2 Skill 接口设计
public interface Skill {
String getName () ;
String getDescription () ;
boolean canExecute (Agent agent, AgentContext context) ;
SkillResult execute (Agent agent, AgentContext context, Map<String, Object> parameters) ;
int getPriority () ;
}
2.3 常见技能类型
2.3.1 查询技能(QuerySkill)
public class QuerySkill implements Skill {
private DataSource dataSource;
public QuerySkill (DataSource dataSource) {
this .dataSource = dataSource;
}
@Override
public String getName () {
return "查询技能" ;
}
@Override
public SkillResult execute (Agent agent, AgentContext context, Map<String, Object> parameters) {
String queryType = (String) parameters.getOrDefault("type" , "default" );
String queryKey = (String) parameters.getOrDefault("key" , "" );
Object result = dataSource.query(queryType, queryKey);
context.storeInWorkingMemory("query_result_" + queryKey, result);
return SkillResult.success("查询成功" ).addData("result" , result);
}
}
2.3.2 记忆技能(MemorySkill)
public class MemorySkill implements Skill {
private MemoryStorage storage;
public MemorySkill (MemoryStorage storage) {
this .storage = storage;
}
@Override
public SkillResult execute (Agent agent, AgentContext context, Map<String, Object> parameters) {
String operation = (String) parameters.getOrDefault("operation" , "store" );
switch (operation) {
case "store" :
storage.store((String) parameters.get("key" ), parameters.get("value" ));
return SkillResult.success("存储成功" );
case "retrieve" :
Object value = storage.retrieve((String) parameters.get("key" ));
return SkillResult.success("检索成功" ).addData("value" , value);
case "search" :
List<Map.Entry<String, Object>> results = storage.search((String) parameters.get("keyword" ));
return SkillResult.success("搜索成功" ).addData("count" , results.size()).addData("results" , results);
default :
return SkillResult.fail("不支持的操作:" + operation);
}
}
}
2.3.3 协作技能(CollaborationSkill)
public class CollaborationSkill implements Skill {
private AgentOrchestrator orchestrator;
@Override
public SkillResult execute (Agent agent, AgentContext context, Map<String, Object> parameters) {
String message = (String) parameters.get("message" );
List<Future<AgentMessage>> futures = orchestrator.broadcast(createMessage(message));
List<AgentDecision> decisions = collectDecisions(futures);
AgentDecision finalDecision = orchestrator.coordinateDecisions(decisions);
return SkillResult.success("协作完成" ).addData("decision" , finalDecision);
}
}
三、决策策略模式
3.1 决策策略的作用 决策策略定义了智能体如何根据当前状态和上下文做出最优决策。通过策略模式,我们可以灵活切换不同的决策逻辑,而不修改智能体本身。
public interface DecisionStrategy {
AgentDecision makeDecision (Agent agent, AgentContext context) ;
}
3.2 AI 驱动的决策策略 利用 AI 的强大推理能力,可以构建智能的决策策略:
public class SimpleAIDecisionStrategy implements DecisionStrategy {
private AIService aiService;
public SimpleAIDecisionStrategy (AIService aiService) {
this .aiService = aiService;
}
@Override
public AgentDecision makeDecision (Agent agent, AgentContext context) {
String prompt = buildDecisionPrompt(agent, context);
String aiResponse = aiService.chat(prompt);
return parseAIDecision(aiResponse);
}
private String buildDecisionPrompt (Agent agent, AgentContext context) {
StringBuilder sb = new StringBuilder ();
sb.append("你是一个智能决策助手。\n\n" );
sb.append("智能体名称:" ).append(agent.getAgentName()).append("\n" );
sb.append("当前状态:" ).append(agent.getState().getDesc()).append("\n" );
sb.append("可选择的动作:\n" );
sb.append(" 1. QUERY - 查询更多信息\n" );
sb.append(" 2. EXECUTE - 执行任务\n" );
sb.append(" 3. ANALYZE - 分析情况\n" );
sb.append(" 4. COMPLETE - 任务完成\n\n" );
sb.append("请以 JSON 格式返回决策:\n" );
sb.append("{\"action\": \"动作\", \"reason\": \"理由\"}" );
return sb.toString();
}
}
3.3 决策协调
public class AgentOrchestrator {
public AgentDecision coordinateDecisions (List<AgentDecision> decisions) {
List<AgentDecision> sorted = decisions.stream()
.sorted((a, b) -> Double.compare(b.getConfidence(), a.getConfidence()))
.collect(Collectors.toList());
if (sorted.size() >= 2 ) {
double topConfidence = sorted.get(0 ).getConfidence();
double secondConfidence = sorted.get(1 ).getConfidence();
if (topConfidence - secondConfidence > 0.2 ) {
return sorted.get(0 );
}
}
return mergeDecisions(decisions);
}
}
四、上下文管理
4.1 AgentContext 的作用 AgentContext 是智能体的"大脑记忆",维护所有运行时状态和信息:
public class AgentContext {
private Agent currentAgent;
private List<AgentMessage> messageHistory;
private Map<String, Object> variables;
private Map<String, Object> workingMemory;
private Map<String, Object> longTermMemory;
private List<Agent> collaborators;
private String sessionId;
public void addMessage (AgentMessage message) {
messageHistory.add(message);
if (messageHistory.size() > 100 ) {
messageHistory.remove(0 );
}
}
public List<AgentMessage> getRecentMessages (int count) {
int start = Math.max(0 , messageHistory.size() - count);
return new ArrayList <>(messageHistory.subList(start, messageHistory.size()));
}
public void storeInWorkingMemory (String key, Object value) {
workingMemory.put(key, value);
}
public Object getFromWorkingMemory (String key) {
return workingMemory.get(key);
}
public void clear () {
messageHistory.clear();
workingMemory.clear();
variables.clear();
}
}
4.2 记忆层次 记忆层次结构: ┌─────────────────────────────────────┐
│ 感知记忆 (Perceptual) │
│ - 最近的感知输入 │
│ - 临时缓存 │
│ - 寿命:毫秒级 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 工作记忆 (Working) │
│ - 当前任务相关的信息 │
│ - 中间计算结果 │
│ - 寿命:会话级 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 长期记忆 (Long-term) │
│ - 知识库 │
│ - 历史经验 │
│ - 用户偏好 │
│ - 寿命:永久/可配置 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 语义记忆 (Semantic) │
│ - 向量索引 │
│ - 语义检索 │
│ - 寿命:永久 │
└─────────────────────────────────────┘
五、消息处理机制
5.1 消息类型
public enum MessageType {
QUERY,
COMMAND,
RESPONSE,
NOTIFY,
ERROR
}
5.2 消息处理流程
public abstract class Agent {
public final void processMessage (AgentMessage message, AgentContext context) {
AgentMessage response = handleMessage(message, context);
if (response != null ) {
context.addMessage(response);
}
updateState(message, context);
}
protected abstract AgentMessage handleMessage (AgentMessage message, AgentContext context) ;
protected void updateState (AgentMessage message, AgentContext context) {
this .state = calculateNewState(message, context);
}
protected AgentState calculateNewState (AgentMessage message, AgentContext context) {
switch (message.getType()) {
case QUERY:
return AgentState.PROCESSING;
case COMMAND:
return AgentState.EXECUTING;
case RESPONSE:
return AgentState.IDLE;
default :
return this .state;
}
}
}
六、Spring Boot 集成
6.1 依赖配置 <dependencies >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-web</artifactId >
<version > 2.7.14</version >
</dependency >
<dependency >
<groupId > org.projectlombok</groupId >
<artifactId > lombok</artifactId >
<version > 1.18.26</version >
</dependency >
<dependency >
<groupId > org.junit.jupiter</groupId >
<artifactId > junit-jupiter</artifactId >
<version > 5.9.2</version >
<scope > test</scope >
</dependency >
<dependency >
<groupId > org.mockito</groupId >
<artifactId > mockito-core</artifactId >
<version > 4.11.0</version >
<scope > test</scope >
</dependency >
<dependency >
<groupId > org.assertj</groupId >
<artifactId > assertj-core</artifactId >
<version > 3.24.2</version >
<scope > test</scope >
</dependency >
</dependencies >
6.2 配置类
@Configuration
public class SystemConfiguration {
@Bean
public AgentOrchestrator agentOrchestrator () {
return new AgentOrchestrator ();
}
@Bean
public AIService aiService () {
return new MockAIService ();
}
@Bean
public SimpleAIDecisionStrategy aiDecisionStrategy (AIService aiService) {
return new SimpleAIDecisionStrategy (aiService);
}
@Bean
public CollaborationSkill collaborationSkill () {
return new CollaborationSkill ();
}
@Bean
public MemorySkill memorySkill () {
return new MemorySkill (new SimpleMemoryStorage ());
}
}
七、多智能体协作
7.1 协作场景
任务分解 :复杂任务分解为子任务,分配给不同智能体
角色分工 :每个智能体承担特定角色(分析、执行、验证等)
信息互补 :不同智能体拥有不同知识或能力
冗余验证 :多个智能体处理同一任务,交叉验证结果
7.2 协作模式
7.2.1 层次协作 用户请求
↓
主控智能体(Orchestrator)
↓
├→ 分析智能体(任务分解)
├→ 执行智能体 1(子任务 1)
├→ 执行智能体 2(子任务 2)
└→ 执行智能体 3(子任务 3)
↓
结果汇总与整合
7.2.2 平等协作 用户请求
↓
消息广播
↓
├→ 智能体 A (独立决策)
├→ 智能体 B (独立决策)
└→ 智能体 C(独立决策)
↓
决策协调(投票、加权等)
↓
最终结果
7.3 协调器实现
public class AgentOrchestrator {
private Map<String, Agent> agents;
private AgentContext sharedContext;
private ExecutorService executorService;
public void registerAgent (Agent agent) {
agents.put(agent.getAgentId(), agent);
sharedContext.addCollaborator(agent);
}
public List<Future<AgentMessage>> broadcast (AgentMessage message) {
List<Future<AgentMessage>> futures = new ArrayList <>();
for (Agent agent : agents.values()) {
Future<AgentMessage> future = executorService.submit(() -> {
agent.processMessage(message, sharedContext);
return message;
});
futures.add(future);
}
return futures;
}
public AgentDecision coordinateDecisions (List<AgentDecision> decisions) {
List<AgentDecision> sorted = decisions.stream()
.sorted((a, b) -> Double.compare(b.getConfidence(), a.getConfidence()))
.collect(Collectors.toList());
return mergeDecisions(sorted);
}
}
八、系统整体架构
九、完整示例:SimpleChatAgent
9.1 实现代码
public class SimpleChatAgent extends Agent {
private AIService aiService;
public SimpleChatAgent (String agentId, String agentName, AIService aiService) {
super (agentId, agentName);
this .aiService = aiService;
}
@Override
protected AgentMessage handleMessage (AgentMessage message, AgentContext context) {
switch (message.getType()) {
case QUERY:
return handleQuery(message, context);
case COMMAND:
return handleCommand(message, context);
case RESPONSE:
return handleResponse(message, context);
case NOTIFY:
return handleNotification(message, context);
default :
return createErrorResponse("未知消息类型" );
}
}
private AgentMessage handleQuery (AgentMessage message, AgentContext context) {
String aiResponse = aiService.chat(message.getContent());
return createResponseMessage(agentId, aiResponse);
}
private AgentMessage handleCommand (AgentMessage message, AgentContext context) {
String content = message.getContent().toLowerCase();
if (content.contains("clear" )) {
context.clear();
return createResponseMessage(agentId, "上下文已清除" );
} else if (content.contains("help" )) {
return createResponseMessage(agentId, "可用命令:clear(清除), help(帮助), status(状态)" );
} else if (content.contains("status" )) {
return createResponseMessage(agentId, String.format("当前状态:%s" , state.getDesc()));
}
return createResponseMessage(agentId, "命令已处理" );
}
@Override
protected AgentDecision makeDefaultDecision (AgentContext context) {
Object lastResponse = context.getFromWorkingMemory("last_response" );
if (lastResponse != null ) {
return new AgentDecision (AgentAction.WAIT, "等待用户反馈" );
}
return new AgentDecision (AgentAction.QUERY, "需要更多信息" );
}
}
9.2 REST API 接口
@RestController
@RequestMapping("/api/agent")
public class AgentController {
@Resource
private AgentOrchestrator orchestrator;
@Resource
private AIService aiService;
@PostMapping("/create")
public ApiResponse createAgent (@RequestBody CreateAgentRequest request) {
SimpleChatAgent agent = new SimpleChatAgent (
request.getAgentId(),
request.getAgentName(),
aiService
);
orchestrator.registerAgent(agent);
return ApiResponse.success("智能体创建成功" ).addData("agentId" , agent.getAgentId());
}
@PostMapping("/message")
public ApiResponse sendMessage (@RequestBody MessageRequest request) throws Exception {
AgentMessage message = new AgentMessage (MessageType.QUERY, request.getSenderId(), request.getContent());
Future<AgentMessage> future = orchestrator.sendMessage(request.getAgentId(), message);
AgentMessage response = future.get(10 , TimeUnit.SECONDS);
return ApiResponse.success("消息已处理" ).addData("content" , response.getContent());
}
@PostMapping("/decision")
public ApiResponse makeDecision (@RequestBody DecisionRequest request) {
Agent agent = findAgent(request.getAgentId());
AgentDecision decision = agent.decide(orchestrator.getSharedContext());
return ApiResponse.success("决策完成" )
.addData("action" , decision.getAction())
.addData("reason" , decision.getReason())
.addData("confidence" , decision.getConfidence());
}
}
十、总结 本文介绍了基于 Multi-Agent、Skills 模式和 Spring AI 的自主决策智能体架构。核心要点包括:
模块化设计 :通过 Skills 模式实现能力模块化
策略模式 :通过决策策略实现决策逻辑可插拔
上下文管理 :通过 AgentContext 维护完整运行状态
多智能体协作 :通过协调器实现智能体间协作
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online