一、本章介绍
在对话模型 ChatModelNode 的装配流程中,新增了 skills 技能配置能力,支持通过 resource 资源定义与 path 路径映射的方式,在构建 AI Agent 智能体时完成能力注入与扩展。
所谓 Skill,可以理解为一种“能力封装单元”,类似一本技能手册📚:它将不同类型的执行能力(如 MCP 调用、Python 脚本、Shell 命令、JavaScript 逻辑等)与提示词策略(Prompt)进行组合,从而形成一条可直接执行的完整能力链路。相比传统“提示词 → 模型推理 → 决策 → 工具调用”的多阶段流程,Skill 可以显著缩短执行路径,使用户意图更快速地转化为结果,同时降低 Token 消耗并减少模型幻觉。
随着大语言模型能力的持续演进,并与 RAG、MCP 以及 Skill 等机制深度融合,AI Agent 正逐步具备与计算机或移动设备系统级交互的能力。在这一演进过程中,各类技术方案持续涌现并不断优化,而 Skill 的引入并非对 MCP 的替代,而是对其能力的一种更精细化封装与调度,使工具调用更加高效、精准与可控。
二、技术介绍(skills 和 prompt + mcp)
如图,演示了一段 skill 的编写案例;

本案例的典型场景是:在完成电脑性能检测后,系统会通过一段结构化指令,向用户输出具体的性能优化建议与执行方案。
如果不引入 Skill 机制,那么整个流程通常需要依赖较长的提示词引导,让 AI 自行理解用户诉求,并按步骤拆解任务,再分别调用不同的 MCP 服务完成执行。在这种模式下,各类能力往往需要被拆分并封装为独立的 MCP 服务进行组合使用,不仅链路较长,而且整体 Token 消耗较高,同时在多步骤推理过程中也更容易引入不确定性与幻觉风险。
而在引入 Skill 之后,可以将复杂任务以“完整任务文档”的形式进行描述,在其中直接嵌入可执行脚本或 MCP 调用能力,从而将分析、决策与执行流程前置固化,使 AI 按既定路径稳定执行,大幅提升结果可靠性与执行效率。
从应用场景来看,Skill 非常适合用于那些需要标准化排障与流程化处理的任务。例如在互联网企业的系统巡检场景中,当接收到告警日志后,可以通过 Skill 技能书自动编排后续动作:采集目标系统配置、分析上线发布记录、检查数据库与缓存状态、梳理运营侧操作日志,并结合全链路监控数据中的接口耗时情况进行综合判断。
在此基础上,再结合运维或排障经验,将问题定位步骤固化为结构化流程,使整个诊断过程更加清晰、可复用且更贴近真实工程实践,从而提升问题处理的准确性与效率。
所以,不是 skill、mcp 谁替代谁,而是 skill 对 mcp 进行增强,让 ai 执行时更加可靠。
三、工程实现
1. 工程结构

首先,在 Skills 能力集成方面,Spring AI 官方已经提供了对应的组件库 spring-ai-agent-utils。该组件库内置了 Skill 的装配能力,既支持通过 Resources 资源加载的方式引入技能书,也支持通过文件绝对路径进行加载,为不同部署环境提供了灵活的配置方案。
随后,在工程的 app 模块资源目录(Resources)下新增了一批 Skills 技能书示例。这些技能书既可以根据自身 Agent 的业务需求进行定制开发,也可以参考社区已有方案进行扩展。目前社区已经沉淀了不少高质量的 Skill 配置,可以直接复用或二次修改。本案例中的 battle-plan 是一个自定义编写的基础技能书,而 pdf 相关能力则来源于官方公开的 Skill 仓库。
参考地址:
https://github.com/anthropics/skills/tree/main/skills
最后,在 Agent 的 YML 配置文件中,除了原有的 tool-mcp-list 工具配置外,还新增了 tool-skills-list 配置项,用于声明当前智能体需要加载的 Skills 技能书。这样在 Agent 初始化过程中,系统即可自动完成 Skill 的加载与装配,实现能力的统一管理和调用。
2. 功能验证
2.1 组件官网
一个SpringAI库,它将ClaudeCode启发的工具和代理技能引入到您的AI应用程序中。
地址: https://github.com/spring-ai-community/spring-ai-agent-utils
2.2 引入配置(pom)
<!-- https://github.com/spring-ai-community/spring-ai-agent-utils -->
<dependency>
<groupId>org.springaicommunity</groupId>
<artifactId>spring-ai-agent-utils</artifactId>
<version>0.10.0</version>
</dependency>- 此外,除了引入 spring ai 库,也可以使用 https://github.com/gotalab/skillport 配置 mcp(调用skills) 的方式进行使用
2.3 测试案例
@Slf4j
public class SpringAiToolTest {
public static void main(String[] args) {
OpenAiApi openAiApi = OpenAiApi.builder()
.baseUrl("https://api.oaipro.com/")
.apiKey("sk-FtZfc3Lyr2RjMkT1TDMTuY73t2NDvyU5dDgqjt4ZqwdMAdNk3xAW")
.completionsPath("v1/chat/completions")
.embeddingsPath("v1/embeddings")
.build();
// https://github.com/spring-ai-community/spring-ai-agent-utils
// ToolCallback toolCallback01 = SkillsTool.builder()
// .addSkillsDirectory("D:\Personal_projects\ai-agent-scaffold\ai-agent-scaffold-lite\docs\dev-ops\agent\skills")
// .build();
ToolCallback toolCallback02 = SkillsTool.builder()
.addSkillsResource(new ClassPathResource("agent/skills"))
.build();
ChatModel chatModel = OpenAiChatModel.builder()
.openAiApi(openAiApi)
.defaultOptions(OpenAiChatOptions.builder()
.model("gpt-4.1")
.toolCallbacks(new ArrayList<>(){{
add(toolCallback02);
}})
.build())
.build();
String call = chatModel.call("你具备什么技能?");
log.info("测试结果:{}", call);
}
}cn.cactusli.ai.test.api.tool.skills.SpringAiToolTest -- 测试结果:我具备以下几类技能,可以帮助你完成多种任务:
1. **文本处理与生成**
- 回答各种问题、写作、翻译、总结、润色、纠错等。
- 编写和优化代码,解释技术概念。
- 辅助论文写作、报告或内容创作。
2. **文档处理**
- 读取、分析、处理PDF文档(包含提取文本、表格、生成/填充PDF表单、合并/拆分PDF文件等)。
3. **电脑性能优化**
- 提供Windows电脑的性能优化建议及操作指导。
4. **信息检索与知识问答**
- 覆盖面广泛的知识库查询,包含最新(截至2024年6月)各类信息。
5. **综合任务协助**
- 任务计划、日常生活建议、学习辅导、表格/数据处理、办公自动化指导等。
如果你有具体需求,可以直接告诉我,比如:“帮我优化我的Windows电脑性能”、“帮我提取PDF里的表格内容”或“请写一封英文求职信”,我会用对应技能来为你服务!
你想让我帮什么?Skill 技能书的编写目前支持多种脚本语言,包括 Python、JavaScript 以及 Shell 等。在实际本地执行过程中,如果出现执行失败的情况,通常与脚本内容和当前操作系统环境不兼容有关,尤其是在 Windows 系统下更为常见。这种情况下,可以结合 Trae.ai 等 AI IDE 工具对脚本进行适配性调整或快速修复。
在配置层面,例如
toolCallback01与toolCallback02实际上使用的是同一套 Skill 定义,因此在测试阶段只需加载其中一组即可,无需重复配置。从实际效果来看,这套 Skill 机制已经能够支持较多实用能力的落地,例如 PDF 文件处理、系统信息分析,甚至生成针对电脑性能优化的说明与建议,从而提升整体自动化处理能力与使用体验。
3. 技能装配(智能体)
3.1 属性定义
AiAgentConfigTableVO
@Data
public static class ChatModel {
private String model;
private List<ToolMcp> toolMcpList;
private List<ToolSkills> toolSkillsList;
@Data
public static class ToolSkills {
/**
* 类型;directory(用户配置的,映射进来的)、resource(放到工程下的)
*/
private String type = "directory";
/**
* 路径;
*/
private String path;
}
}- 在 ChatModel 下,定义 ToolSkills 技能书的配置对象,包括要配置的类型和路径。
3.2 装配服务(skills)
public interface ToolSkillsCreateService {
ToolCallback[] buildToolCallback(AiAgentConfigTableVO.Module.ChatModel.ToolSkills toolSkills) throws Exception;
}
@Service
public class DefaultToolSkillsCreateService implements ToolSkillsCreateService {
@Override
public ToolCallback[] buildToolCallback(AiAgentConfigTableVO.Module.ChatModel.ToolSkills toolSkills) throws Exception {
String type = toolSkills.getType();
String path = toolSkills.getPath();
List<ToolCallback> toolCallbackList = new ArrayList<>();
if ("directory".equals(type)){
ToolCallback toolCallback = SkillsTool.builder()
.addSkillsDirectory(path)
.build();
toolCallbackList.add(toolCallback);
}
if ("resource".equals(type)){
ToolCallback toolCallback = SkillsTool.builder()
.addSkillsResource(new ClassPathResource(path))
.build();
toolCallbackList.add(toolCallback);
}
return toolCallbackList.toArray(new ToolCallback[0]);
}
}- 按照 TooMcpCreateService 的接口,定义 ToolSkillsCreateService 装配服务接口。一个装配 mcp,一个装配 skills,他们都属于 tool 工具。
- 根据 type 类型,实现两种构建方式。
addSkillsDirectory(path)、addSkillsResource(new ClassPathResource(path))
3.3 调用装配
@Slf4j
@Service
public class ChatModelNode extends AbstractArmorySupport {
@Resource
private AgentNode agentNode;
@Resource
private DefaultMcpClientFactory defaultMcpClientFactory;
@Resource
private ToolSkillsCreateService toolSkillsCreateService;
/**
* 装配 ChatModel 节点(Ai Agent 装配链的第二个业务节点:AiApiNode → ChatModelNode → AgentNode)。
* <p>
* 基于上游 {@link AiApiNode} 放入动态上下文的 {@link OpenAiApi},结合聊天模型配置
* (模型名称、绑定的 MCP 工具列表)构建出可对话的 {@link ChatModel},并写回动态上下文,
* 供后续 {@link AgentNode} 构建 Agent 时使用。
*
* @param requestParameter 装配命令实体,携带 Agent 的完整配置({@link AiAgentConfigTableVO})
* @param dynamicContext 装配动态上下文,用于在各节点间传递中间产物(如 OpenAiApi、ChatModel)
* @return 装配结果,由 {@code router(...)} 透传下游节点的处理结果
* @throws Exception 构建 MCP 工具回调或 ChatModel 过程中可能抛出的异常
*/
@Override
protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
log.info("Ai Agent 装配操作 - ChatModelNode");
// 取出上游 AiApiNode 已构建并放入上下文的 OpenAiApi(包含 baseUrl、apiKey 等连接信息)
OpenAiApi openAiApi = dynamicContext.getOpenAiApi();
// 获取聊天模型配置:模型名称及其绑定的 MCP 工具列表
AiAgentConfigTableVO aiAgentConfigTableVO = requestParameter.getAiAgentConfigTableVO();
AiAgentConfigTableVO.Module.ChatModel chatModelConfig = aiAgentConfigTableVO.getModule().getChatModel();
List<AiAgentConfigTableVO.Module.ChatModel.ToolMcp> toolMcpList = chatModelConfig.getToolMcpList();
List<AiAgentConfigTableVO.Module.ChatModel.ToolSkills> toolSkillsList = chatModelConfig.getToolSkillsList();
// 遍历 MCP 工具配置,通过工厂创建对应的 MCP 客户端并构建 ToolCallback,汇总为模型可调用的工具集合
List<ToolCallback> toolCallbackList = new ArrayList<>();
for (AiAgentConfigTableVO.Module.ChatModel.ToolMcp toolMcp : toolMcpList) {
ToolMcpCreateService tooMcpCreateService = defaultMcpClientFactory.getToolMcpCreateService(toolMcp);
ToolCallback[] toolCallbacks = tooMcpCreateService.buildToolCallback(toolMcp);
toolCallbackList.addAll(List.of(toolCallbacks));
}
// 构建skills服务
if (null != toolSkillsList && !toolSkillsList.isEmpty()) {
for (AiAgentConfigTableVO.Module.ChatModel.ToolSkills toolSkills : toolSkillsList) {
ToolCallback[] toolCallbacks = toolSkillsCreateService.buildToolCallback(toolSkills);
toolCallbackList.addAll(List.of(toolCallbacks));
}
}
// 基于 OpenAiApi、模型名称与工具回调集合构建 ChatModel
ChatModel chatModel = OpenAiChatModel.builder()
.openAiApi(openAiApi)
.defaultOptions(OpenAiChatOptions.builder()
.model(chatModelConfig.getModel())
.toolCallbacks(toolCallbackList)
.build())
.build();
// 将构建好的 ChatModel 写回动态上下文,供下游 AgentNode 等节点装配使用
dynamicContext.setChatModel(chatModel);
// 路由到下一个策略节点(即 get() 返回的 AgentNode)继续装配
return router(requestParameter, dynamicContext);
}
/**
* 返回当前节点在装配链中的下一个策略处理器。
* <p>
* 由父类 {@code AbstractMultiThreadStrategyRouter} 的 {@code router(...)} 回调,
* 驱动责任链向后流转。ChatModelNode 的下游固定为 {@link AgentNode}。
*
* @param requestParameter 装配命令实体
* @param dynamicContext 装配动态上下文
* @return 下一个待执行的策略处理器({@link AgentNode})
* @throws Exception 获取下游处理器过程中可能抛出的异常
*/
@Override
public StrategyHandler<ArmoryCommandEntity, DefaultArmoryFactory.DynamicContext, AiAgentRegisterVO> get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception {
return agentNode;
}
}- ChatModelNode 的装配,在构建 mcp 服务(工厂)后面,继续做 skills 服务的装配。
四、测试验证
1. yml配置
ai:
agent:
config:
tables:
testAgent03:
app-name: testAgent03
agent:
agent-id: 100003
agent-name: 单一智能体
agent-desc: 单一智能体
module:
ai-api:
base-url: https://api1.oaipro.com
api-key: sk-FtZfc3Lyr2RjMkT1TDMTuY73t2NDvyU5dDgqjt4ZqwdMAdNk3xAW
completions-path: v1/chat/completions
embeddings-path: v1/embeddings
chat-model:
model: gpt-4.1
tool-mcp-list:
- sse:
name: baidu-search
base-uri: http://appbuilder.baidu.com/v2/ai_search/mcp/
sse-endpoint: sse?api_key=bce-v3/ALTAK-6SyOtHHftyPsWLoIpz3WL/e7a0d8c2e39e9596b0f1e183cd985da1c32a0d67
request-timeout: 50000
- local:
name: myToolCallbackProvider
tool-skills-list:
- type: resource
path: agent/skills
agents:
- name: onlyAgent
description: Spring Boot重磅学习计划
instruction: |
通过百度检索Spring Boot编程实战项目,并根据检索内容,针对初学用户给出学习计划。
runner:
agent-name: onlyAgent
plugin-name-list:
- myTestPlugin
- myLogPlugin- tool-skills-list,这里装配了 resource 下的技能书,另外 directory 方式也可以使用。目前案例的话,2个方式,使用一个即可。如果你还有其他 skills 的引入也可以配置。
2. 单测验证
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ChatServiceTest {
@Resource
private IChatService chatService;
@Value("classpath:file/cat.png")
private org.springframework.core.io.Resource imageResource;
@Test
public void test_handleMessage_01() {
List<String> message = chatService.handleMessage("100003", "cactusli", "你具备哪些skill技能?");
log.info("测试结果:{}", JSON.toJSONString(message));
}
}26-06-24.15:23:36.251 [main ] INFO ChatServiceTest - 测试结果:["我当前具备以下Skill技能:\n\n1. 电脑性能优化(battle-plan):可以帮助进行电脑的性能优化建议和操作。\n2. Windows电脑性能优化(battle-plan-windows):专为Windows系统环境下的性能优化提供建议和操作。\n3. PDF工具(pdf):可进行PDF文件的提取、生成、合并、拆分、表格和内容抽取、表单处理等全面操作。\n\n如果你需要与这些技能相关的帮助或操作,可以随时告诉我!"]