1. AI Skills 的演进:从工具级到框架级
AI Skills(AI 技能)的概念最早出现在 Claude Code 等前沿 Agent 实践中。最初,Skills 被简单地视为"工具级"的增强,主要用于实现基础功能如文件读写或终端操作。这种初级形态解决了"手"的问题,让用户能够快速完成各种具体操作。
但随着 Solon AI 等现代应用开发框架的出现,AI Skills 已经演变为更高维度的封装形式。在框架级层面,Skills 不再仅仅是执行函数,而是集成了工具(Tools)、指令(Instruction)与元数据(Metadata)的复合体。这种进化解决了"脑"的问题,为智能体应用开发提供了更强大的支持。
关键区别:工具级 Skills 关注具体执行,框架级 Skills 则包含了准入检查、指令增强及工具染色等高级能力。
2. AI Skills 的核心特性解析
2.1 智能准入机制(isSupported)
传统 Tool 模式存在明显的上下文噪音问题,无效工具会干扰模型判断并浪费 Token。成熟的 AI Skill 必须实现智能准入机制:
- 意图识别:分析用户输入是否匹配技能领域
- 环境检查:验证运行时环境是否满足要求
- 权限校验:确认用户/租户是否有权使用该技能
java复制@Override
public boolean isSupported(Prompt prompt) {
// 语义检查:意图是否相关
boolean isOrderTask = prompt.getUserContent().contains("订单");
// 安全检查:必须有租户 ID
boolean hasTenant = prompt.attr("tenant_id") != null;
return isOrderTask && hasTenant;
}
2.2 动态指令注入(getInstruction)
指令注入机制让技能能够根据上下文为模型提供实时行为准则:
java复制@Override
public String getInstruction(Prompt prompt) {
String tenantName = prompt.attrOrDefault("tenant_name", "未知租户");
return "你现在是[" + tenantName + "]的订单主管。请只处理该租户下的订单数据,禁止跨租户查询。";
}
2.3 工具路由与权限控制(getTools)
精细化的工具路由机制实现了基于角色的权限控制:
java复制@Override
public List<String> getToolsName(Prompt prompt) {
List<String> tools = new ArrayList<>();
// 基础权限:所有合规用户可见
tools.add("OrderQueryTool");
// 细粒度权限:仅 ADMIN 角色可见"取消订单"工具
if ("ADMIN".equals(prompt.attr("user_role"))) {
tools.add("OrderCancelTool");
}
return tools;
}
3. MCP:AI 时代的核心协议
3.1 MCP 协议的核心价值
MCP(Model Context Protocol,模型上下文协议)的出现解决了 AI 模型与外部数据/工具的连接问题。类比互联网中的 HTTP 协议:
- HTTP 让浏览器能访问任何服务器资源
- MCP 让智能体能调用任何分布式技能
这种标准化打破了智能体与外部世界之间的硬编码依赖,为 AI 生态的开放互联奠定了基础。
3.2 MCP Tool 的分布式特性
传统 Tool 存在明显局限:
- 代码级耦合
- 难以跨语言/环境复用
- 扩展性差
MCP Tool 实现了革命性突破:
- 物理位置透明性
- 独立分布式能力节点
- 标准化接口暴露
4. MCP Skills 的实现架构
4.1 客户端实现(McpSkillClient)
McpSkillClient 作为本地代理,主要职责包括:
- 元数据同步:通过约定路径获取远程技能元数据
- 调用映射:将本地接口调用转化为远程 MCP 请求
- 工具过滤:自动隐藏管理类工具
java复制// 构建 MCP 客户端
McpClientProvider mcpClient = McpClientProvider.builder()
.channel(McpChannel.STREAMABLE)
.url("http://localhost:8081/skill/order")
.build();
// 创建 Skill 代理
McpSkillClient skillClient = new McpSkillClient(mcpClient);
// 构建业务上下文 Prompt
Prompt prompt = Prompt.of("这个订单:A001,请查询订单详情。")
.attrPut("tenant_id", "1")
.attrPut("user_role", "admin");
// 调用大模型
chatModel.prompt(prompt)
.options(o -> o.skillAdd(skillClient))
.call();
4.2 服务端实现(McpSkillServer)
服务端通过继承 McpSkillServer 类实现技能逻辑:
java复制@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/skill/order")
public class OrderManagerSkillServer extends McpSkillServer {
@Override
public String description() {
return "提供订单查询与取消的专业技能";
}
// 工具实现
@ToolMapping(description = "根据订单号查询详情")
public String OrderQueryTool(String orderId) {
return "订单 " + orderId + " 状态:已发货";
}
}
5. 分布式 AI Skills 的必然性
5.1 架构优势对比
| 特性 | 传统单体 Skills | 分布式 MCP Skills |
|---|---|---|
| 耦合度 | 高,代码级依赖 | 低,协议级依赖 |
| 复用性 | 项目内复用 | 跨项目/跨团队复用 |
| 部署 | 集中式部署 | 灵活分布式部署 |
| 生态 | 封闭单一 | 开放异构 |
5.2 核心价值体现
- 复杂技能复用:专业领域技能(如法律审计)可作为服务独立存在
- 安全边界清晰:敏感数据处理技能可部署在内网环境
- 异构生态整合:不同语言/环境的能力通过统一接口连接
6. 实战经验与避坑指南
6.1 性能优化建议
- 元数据缓存:客户端应缓存技能元数据,避免每次调用都获取
- 批量调用:合并多个工具请求,减少网络往返
- 连接池管理:合理配置 MCP 连接池参数
6.2 安全实践
- 权限最小化:严格遵循最小权限原则设计 getToolsName
- 输入验证:所有工具方法都应验证输入参数
- 敏感信息过滤:确保 prompt 属性不包含敏感信息
6.3 调试技巧
- 日志记录:在 isSupported/getInstruction 中添加详细日志
- 模拟测试:使用 Mock 对象测试各种上下文场景
- 协议分析:使用 Wireshark 等工具分析 MCP 协议交互
在实际项目中,我们发现分布式 Skills 的版本管理尤为重要。建议采用语义化版本控制,并在 MCP 协议中包含版本协商机制,确保客户端与服务端的兼容性。
