AI Skills 的发展经历了从简单工具到复杂框架的演进过程。早期的 AI Skills 主要作为"工具级"功能存在,比如文件读写、终端操作等基础能力。这些技能就像是一把瑞士军刀上的小工具,每个都独立完成特定功能,但缺乏整体协同。
随着 Claude Code 等前沿项目的实践,AI Skills 开始向"框架级"进化。现代框架如 Solon AI 将 Skills 提升到一个新的维度 - 它们不再是孤立的工具,而是整合了执行逻辑、权限控制和上下文感知的完整解决方案。
关键区别:工具级技能关注"怎么做"(How),框架级技能解决"什么时候做"和"为什么做"(When & Why)的问题。
一个完整的框架级 AI Skill 包含三个关键要素:
这种聚合体设计使得技能具备了自主决策能力,能够根据当前环境动态调整行为。例如,一个订单管理技能可以:
随着 AI 技能生态的扩展,标准化通信协议成为刚需。MCP(Model Context Protocol)应运而生,它解决了三个核心问题:
MCP 采用了分层设计理念:
| 层级 | 功能 | 类比传统架构 |
|---|---|---|
| 传输层 | 基础通信 | TCP/IP |
| 协议层 | 消息格式 | HTTP |
| 语义层 | 业务逻辑 | REST API |
这种设计使得 MCP 既保持了协议的简洁性,又能支持复杂的业务场景。例如,一个订单查询请求可能包含:
json复制{
"context_id": "abcd1234",
"skill_path": "/order/query",
"prompt": "查询订单A001状态",
"attributes": {
"tenant_id": "1",
"user_role": "admin"
}
}
McpSkillClient 是远程技能在本地环境的代理,其核心职责包括:
典型初始化流程:
java复制// 构建支持断线重连的客户端
McpClientProvider client = McpClientProvider.builder()
.channel(McpChannel.STREAMABLE)
.url("http://skill-service/order")
.retryPolicy(RetryPolicy.exponential(3, 1000))
.build();
// 转换为技能接口
McpSkillClient skillClient = new McpSkillClient(client);
一个健壮的 McpSkillServer 实现需要考虑以下方面:
示例增强实现:
java复制@McpServerEndpoint(
channel = McpChannel.STREAMABLE_STATELESS,
mcpEndpoint = "/skill/order",
rateLimit = @RateLimit(permits=100, period=1, unit=TimeUnit.SECONDS)
)
public class EnhancedOrderSkill extends McpSkillServer {
@Override
public boolean isSupported(Prompt prompt) {
// 添加审计日志
auditLog(prompt);
// 执行原有逻辑
return super.isSupported(prompt);
}
private void auditLog(Prompt prompt) {
String tenant = prompt.attr("tenant_id");
String user = prompt.attr("user_id");
log.info("技能访问 - 租户:{}, 用户:{}", tenant, user);
}
}
对于关键业务技能,建议采用以下架构:
code复制[客户端Agent] -> [负载均衡] -> [技能集群]
↑
[注册中心]
↑
[监控系统] <- [技能节点1] [技能节点2]
关键组件说明:
实测数据表明,经过优化后:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 连接超时 | 网络不通/防火墙阻挡 | 检查telnet端口连通性 |
| 证书错误 | SSL配置不匹配 | 更新信任证书链 |
| 协议不兼容 | 客户端/服务端版本差异 | 统一协议版本 |
案例:技能isSupported返回true但未激活
排查步骤:
案例:工具可见但调用失败
排查步骤:
通过Prompt属性注入扩展信息:
java复制Prompt prompt = Prompt.of("查询订单")
.attrPut("location", "CN") // 地理位置
.attrPut("timezone", "UTC+8") // 时区
.attrPut("preferences", "{}"); // 用户偏好
基于上下文构造个性化指引:
java复制@Override
public String getInstruction(Prompt prompt) {
StringBuilder sb = new StringBuilder();
sb.append("你正在处理").append(prompt.attr("tenant_name")).append("的订单\n");
if("VIP".equals(prompt.attr("user_level"))) {
sb.append("注意:这是VIP客户,优先处理!");
}
return sb.toString();
}
多个技能协同工作示例:
java复制// 构建技能链
SkillChain chain = new SkillChain()
.add(new OrderSkillClient())
.add(new PaymentSkillClient())
.add(new LogisticsSkillClient());
// 统一调用
chain.execute(prompt);
在实际项目中,我们发现这种分布式技能架构特别适合以下场景:
最后分享一个实战经验:在设计技能接口时,建议预留20%的扩展属性,为后续功能演进留出空间。我们曾经因为早期设计过于严格,导致后期不得不进行破坏性变更,付出了额外的迁移成本。