1. AI Skills 的演进:从工具到框架
AI Skills 的概念最早出现在 Claude Code 等前沿 Agent 实践中。最初,Skills 被视为"工具级"的增强,主要用于解决具体的执行问题,比如简单的文件读写或终端操作。这种初级形态的 Skills 确实为用户提供了快速实现各种操作的能力,但功能相对单一。
随着 Solon AI 等现代应用开发框架的出现,AI Skills 已经演化为一种更高维度的封装形式。这种进化不仅仅是功能上的扩展,更是一种思维方式的转变。在框架层面,AI Skills 不再仅仅是执行具体任务的工具,而是成为了构建智能体应用的基础组件。
1.1 工具级与框架级的本质区别
工具级(Tool-level)Skills 主要解决的是"手"的问题,即具体的执行函数。它们通常是独立的、功能单一的代码片段,专注于完成某个特定的任务。比如一个读取文件的工具,或者一个发送邮件的函数。
框架级(Framework-level)Skills 则解决的是"脑"的问题。它们是工具(Tools)、指令(Instruction)与元数据(Metadata)的聚合体。这种聚合不仅仅是简单的组合,而是形成了一个有机的整体,具有以下特点:
- 执行逻辑:完成特定任务的核心功能
- 准入检查:判断当前环境是否适合使用该技能
- 指令增强:为模型提供行为准则
- 工具染色:根据上下文动态调整工具表现
这种转变使得 AI Skills 从简单的功能模块升级为具有自主决策能力的智能单元。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AI Skills 的核心特性解析
传统 Tool 模式存在诸多问题,如上下文噪音、权限真空和行为失控等。为了解决这些问题,一个成熟的 AI Skill 必须具备以下关键特性:
2.1 智能准入(isSupported)
智能准入机制确保技能只在特定条件下被激活。这些条件可能包括:
- 意图匹配:用户请求是否与该技能相关
- 租户验证:当前用户是否有权使用该技能
- 环境检查:系统环境是否满足技能运行要求
这种机制有效避免了无效工具对模型上下文的干扰,减少了不必要的 Token 消耗。例如,一个处理财务数据的技能应该只在检测到财务相关意图时才被激活。
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");
if ("ADMIN".equals(prompt.attr("user_role"))) {
tools.add("OrderCancelTool");
}
return tools;
}
2.4 高度自治
高度自治意味着技能内部能够闭环处理特定领域的逻辑,对外部输出标准化的结果。这种自治性体现在:
- 内部状态管理:技能自行维护必要的状态信息
- 异常处理:在技能内部处理领域特定的异常情况
- 结果标准化:输出统一格式的结果,便于上层处理
3. MCP:AI 时代的连接协议
随着技能需求的爆发式增长,MCP(Model Context Protocol,模型上下文协议)应运而生。这个协议的重要性不亚于互联网时代的 HTTP 协议。
3.1 MCP 的核心价值
MCP 协议的价值主要体现在以下几个方面:
- 标准化连接:任何智能体都能无缝调用分布在不同物理位置的技能
- 打破壁垒:消除了智能体与外部世界之间的硬编码依赖
- 促进生态:不同厂商提供的技能可以互相兼容
3.2 MCP 与 HTTP 的类比
| 特性 | HTTP(互联网) | MCP(AI世界) |
|---|---|---|
| 连接对象 | 浏览器与服务器 | 智能体与技能 |
| 核心价值 | 资源访问标准化 | 能力调用标准化 |
| 生态影响 | 促进Web发展 | 促进AI生态 |
| 扩展性 | 通过Header扩展 | 通过属性扩展 |
4. Tool 的分布式进化
Tool 的形态正在经历从本地单体到分布式 MCP Tool 的转变。这种转变不仅仅是技术实现的变化,更是一种架构理念的革新。
4.1 传统 Tool 的局限性
传统 Tool 存在以下主要问题:
- 代码级耦合:与主程序紧密绑定
- 复用困难:难以跨语言、跨环境使用
- 扩展受限:功能更新需要重新部署整个系统
4.2 MCP Tool 的优势
MCP Tool 作为分布式 Tool,具有以下显著优势:
- 物理位置透明性:调用者无需关心工具的实际部署位置
- 独立演进:每个能力节点可以独立更新和扩展
- 异构兼容:不同语言实现的能力可以互相调用
java复制// MCP 客户端构建示例
McpClientProvider mcpClient = McpClientProvider.builder()
.channel(McpChannel.STREAMABLE)
.url("http://localhost:8081/skill/order")
.build();
5. 从 MCP Tool 到 MCP Skills
Tool 的分布式化为 AI Skills 的分布式化提供了自然的演进路径。当我们将一组具备业务逻辑、指令指导和工具集的 Skill 通过 MCP 协议发布时,就形成了 MCP Skills。
5.1 架构映射
我们可以将 AI Agent 的分布式架构与传统架构进行类比:
| AI 架构 | 传统架构对应物 | 说明 |
|---|---|---|
| MCP | RPC | 定义通信方式的底层协议 |
| MCP Skills | 微服务 | 独立的业务能力单元 |
| MCP Tool | API 端点 | 具体的功能接口 |
5.2 实现模式
实现 MCP Skills 需要客户端和服务端的协同工作:
5.2.1 McpSkillClient(客户端实现)
McpSkillClient 作为远程技能的本地代理,主要职责包括:
- 元数据同步:从服务端获取技能描述信息
- 调用转换:将本地接口调用转为远程协议调用
- 工具过滤:根据上下文筛选合适的工具
java复制// 客户端使用示例
McpSkillClient skillClient = new McpSkillClient(mcpClient);
Prompt prompt = Prompt.of("这个订单:A001,请查询订单详情。")
.attrPut("tenant_id", "1")
.attrPut("user_role", "admin");
chatModel.prompt(prompt)
.options(o -> o.skillAdd(skillClient))
.call();
5.2.2 McpSkillServer(服务端实现)
服务端通过继承 McpSkillServer 基类,可以将本地业务逻辑导出为远程技能。关键实现点包括:
- 生命周期管理:处理技能的挂载、卸载等事件
- 权限控制:基于用户角色限制功能访问
- 指令生成:动态提供行为指导
java复制// 服务端示例
@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/skill/order")
public class OrderManagerSkillServer extends McpSkillServer {
@Override
public boolean isSupported(Prompt prompt) {
boolean isOrderTask = prompt.getUserContent().contains("订单");
boolean hasTenant = prompt.attr("tenant_id") != null;
return isOrderTask && hasTenant;
}
@ToolMapping(description = "根据订单号查询详情")
public String OrderQueryTool(String orderId) {
return "订单 " + orderId + " 状态:已发货";
}
}
6. 分布式 AI Skills 的必然性
AI Skills 走向分布式架构是技术发展的必然趋势,主要原因包括:
6.1 解耦与复用
复杂技能(如法律审计、专业代码重构)可以:
- 独立开发:无需在每个项目中重写
- 集中维护:统一更新和优化
- 跨项目复用:多个智能体共享同一套技能
6.2 安全边界
敏感数据处理可以:
- 专用部署:将技能放在受保护的内网环境
- 受控访问:通过严格的协议控制外部调用
- 审计追踪:记录所有敏感操作
6.3 异构生态
不同技术栈的能力可以:
- 语言无关:Java、Python、Go 等实现的技能互相调用
- 环境透明:云端、边缘端的技能统一接入
- 动态组合:按需构建能力集合
在实际项目中,我们实现了一个订单管理技能,通过 MCP 协议暴露后,可以被多个不同的智能体调用。这个技能包含了订单查询和取消功能,但会根据调用者的角色动态调整可用功能。管理员可以看到所有功能,而普通用户只能使用查询功能。这种设计既保证了功能的完整性,又确保了系统的安全性。
